2016-03-25 18 views
12

capisco che OHLC ri-campionamento dei dati di serie temporali di Panda, utilizzando una colonna di dati, funziona perfettamente, ad esempio sui seguenti dataframe:Pandas OHLC aggregazione su dati OHLC

>>df 
ctime  openbid 
1443654000 1.11700 
1443654060 1.11700 
... 

df['ctime'] = pd.to_datetime(df['ctime'], unit='s') 
df   = df.set_index('ctime') 
df.resample('1H', how='ohlc', axis=0, fill_method='bfill') 


>>> 
        open  high  low  close 
ctime             
2015-09-30 23:00:00 1.11700 1.11700 1.11687 1.11697 
2015-09-30 24:00:00 1.11700 1.11712 1.11697 1.11697 
... 

Ma cosa fare Lo faccio se i dati sono già in un formato OHLC? Da quello che posso raccogliere il metodo OHLC dell'API calcola una fetta OHLC per ogni colonna, quindi se il dato è nel formato:

   ctime openbid highbid lowbid closebid 
0  1443654000 1.11700 1.11700 1.11687 1.11697 
1  1443654060 1.11700 1.11712 1.11697 1.11697 
2  1443654120 1.11701 1.11708 1.11699 1.11708 

Quando provo a ri-campione ottengo un OHLC per ciascuna delle colonne, in questo modo:

     openbid        highbid   \ 
         open  high  low close  open  high 
ctime                  
2015-09-30 23:00:00 1.11700 1.11700 1.11700 1.11700 1.11700 1.11712 
2015-09-30 23:01:00 1.11701 1.11701 1.11701 1.11701 1.11708 1.11708 
... 
             lowbid        \ 
         low close  open  high  low close 
ctime                  
2015-09-30 23:00:00 1.11700 1.11712 1.11687 1.11697 1.11687 1.11697 
2015-09-30 23:01:00 1.11708 1.11708 1.11699 1.11699 1.11699 1.11699 
... 

        closebid        
         open  high  low close 
ctime              
2015-09-30 23:00:00 1.11697 1.11697 1.11697 1.11697 
2015-09-30 23:01:00 1.11708 1.11708 1.11708 1.11708 

c'è un rapido (ish) soluzione per questo che qualcuno è disposto a condividere per favore, senza di me dover arrivare fino alle ginocchia in manuale di panda?

Grazie.

ps, ​​c'è questa risposta - Converting OHLC stock data into a different timeframe with python and pandas - ma era 4 anni fa, quindi spero che ci siano stati dei progressi.

risposta

19

Questo è simile alla risposta che hai collegato, ma è un po 'più pulito, e più veloce, perché utilizza le aggregazioni ottimizzate, piuttosto che lambda.

Si noti che la sintassi resample(...).agg(...) richiede la versione panda 0.18.0.

In [101]: df.resample('1H').agg({'openbid': 'first', 
           'highbid': 'max', 
           'lowbid': 'min', 
           'closebid': 'last'}) 
Out[101]: 
         lowbid highbid closebid openbid 
ctime             
2015-09-30 23:00:00 1.11687 1.11712 1.11708 1.117 
+0

Sì, vado con quello; significa aggiornare i panda, ma il modo in cui la mia funzione stava andando significa che questa è l'opzione preferibile. Grazie. – user3439187

+1

Qualche idea se potessi aggiungere il metodo 'fill_method = 'bfill'' a quella soluzione per gestire i NAN? – user3439187

+0

Dimentica l'ultima domanda, il metodo è cambiato in .bfill() – user3439187