Ich habe eine CSV-Datei von S & P 500 Bestände zum Ende eines jeden Jahres für 15 Jahre (dh 12/31/1999-12/31/2015). Daher hat der Datenrahmen 15 Spalten von Beteiligungen. Ich versuche, einen Code zu schreiben, der sich durch jede Spalte von Positionen zieht, diese Bestände nimmt und die Preisdaten an mehreren Punkten sammelt (d. H. Aktuell, 3 Monate ab der aktuellen Periode und 6 Monate ab der aktuellen Periode). Die aktuelle Periode ist immer der Titel der spezifischen Spalte, die durchgeschleift wird (z. B. 31.12.2014).Effiziente Methode zum Abrufen von Daten basierend auf festgesetzten Datum, und wenn es nicht funktioniert, Verschiebung 1 Tag früher
Ich verwende DataReader mit FinanceYahoo, um die Preisdaten zu ziehen. Ich versuche den effizientesten Weg zu finden, dies zu tun. Eine Herausforderung ist, dass die financeyahoo-API ein Datum benötigt, um ein Handelsdatum zu sein (d. H. Kein Wochenende sein kann). Daher habe ich try/excepts verwendet, um das Datum zu testen und wenn es nicht funktioniert, gehen Sie einen Tag zurück. Ich mache das bis zu 4 mal, weil das ausreichen sollte, um an einen Handelstag zu kommen. Ich frage mich, ob das eine Menge bremst. Gibt es einen effizienteren Weg, dies zu tun? Ich muss noch den Code bekommen, um die ganzen 15 Jahre laufen zu lassen, weil es eine halbe Stunde dauert, um 1 Jahr zu machen, und als ich über Nacht versuchte, stürzte es ab.
equities = (sample data is below)
prices = DataFrame()
for col in equities.columns[16:18]:
temp = DataFrame(equities[col])
temp.rename(columns={col:'ticker'},inplace=True)
date = datetime.datetime.strptime(col,'%m/%d/%Y').strftime('%Y-%m-%d')
temp = DataFrame(temp['ticker'].dropna())
temp = DataFrame(temp['ticker'].map(lambda x :str(x)[:-3]))
temp['calendardate'] = date
datetemp = datetime.datetime.strptime(date, '%Y-%m-%d')
splicestart = 0
splicenum = None
Aktueller Preis
try:
datecur = datetemp
tempprice = DataFrame(
DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
temp.rename(columns={datecur: 'current'}, inplace=True)
except:
try:
datecur = datetime.datetime(datecur.year,datecur.month,datecur.day-1)
tempprice = DataFrame(
DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
temp.rename(columns={datecur: 'current'}, inplace=True)
Ich habe ein paar mehr try/excepts für diesen bestimmten Zeitraum und dann für 3 Monate wiederholen spät (siehe Code unten):
3 Monate Preis
try:
datecur = datetime.datetime(datetemp.year + 1, datetemp.month - 9, datetemp.day)
tempprice = DataFrame(
DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
temp.rename(columns={datecur: '3month'}, inplace=True)
except:
try:
datecur = datetime.datetime(datecur.year, datecur.month, datecur.day - 1)
tempprice = DataFrame(
DataReader(temp['ticker'][splicestart:splicenum], 'yahoo', datecur, datecur)['Adj Close']).transpose()
temp = temp.merge(DataFrame(tempprice[datecur]), how='outer', left_on=temp['ticker'], right_index=True)
temp.rename(columns={datecur: '3month'}, inplace=True)
Noch einmal, 2 weitere Versuche/Ausnahmen werden nur 1 Tag früher verschoben.
Vielen Dank für jede Hilfe!
Beispieldaten
12/31/2012,12/31/2013,12/31/2014,12/31/2015
A UN,A UN,A UN,A UN
AA UN,AA UN,AA UN,AA UN
AAPL UW,AAPL UW,AAPL UW,AAL UW
ABC UN,ABBV UN,ABBV UN,AAP UN
ABT UN,ABC UN,ABC UN,AAPL UW
ACN UN,ABT UN,ABT UN,ABBV UN
ADBE UW,ACN UN,ACN UN,ABC UN
ADI UW,ADBE UW,ADBE UW,ABT UN
ADM UN,ADI UW,ADI UW,ACN UN
ADP UW,ADM UN,ADM UN,ADBE UW
ADSK UW,ADP UW,ADP UW,ADI UW
ADT UN,ADS UN,ADS UN,ADM UN
AEE UN,ADSK UW,ADSK UW,ADP UW
AEP UN,ADT UN,ADT UN,ADS UN
AES UN,AEE UN,AEE UN,ADSK UW
AET UN,AEP UN,AEP UN,ADT UN
AFL UN,AES UN,AES UN,AEE UN
AGN UN,AET UN,AET UN,AEP UN
AIG UN,AFL UN,AFL UN,AES UN