2016-07-12 10 views
0

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 

Antwort

0

Pandas verfügt über ein Business-Tag-Index (ohne Wochenenden) http://pandas.pydata.org/pandas-docs/stable/timeseries.html

pd.bdate_range(start, end) 

Sie können unter Business-Tage wie das Beispiel erzeugen:

In [44]: start = datetime(2011, 1, 1) 

In [45]: end = datetime(2012, 1, 1) 

In [48]: rng = pd.bdate_range(start, end) 

In [49]: rng 
Out[49]: 
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06', 
       '2011-01-07', '2011-01-10', '2011-01-11', '2011-01-12', 
       '2011-01-13', '2011-01-14', 
       ... 
       '2011-12-19', '2011-12-20', '2011-12-21', '2011-12-22', 
       '2011-12-23', '2011-12-26', '2011-12-27', '2011-12-28', 
       '2011-12-29', '2011-12-30'], 
       dtype='datetime64[ns]', length=260, freq='B')