2014-01-15 176 views
7

我在一個pandas DataFrame中有歷史交易數據,包含價格和交易量欄,由DateTimeIndex索引。用熊貓將貿易數據重採樣到OHLCV中

例如:

>>> print df.tail() 
          price volume 
2014-01-15 14:29:54+00:00 949.975 0.01 
2014-01-15 14:29:59+00:00 941.370 0.01 
2014-01-15 14:30:17+00:00 949.975 0.01 
2014-01-15 14:30:24+00:00 941.370 0.01 
2014-01-15 14:30:36+00:00 949.975 0.01 

現在,我可以使用df.resample(freq, how={'price': 'ohlc'}),這是細重新取樣到這一點OHLC數據,但我也想包括音量。

當我嘗試df.resample(freq, how={'price': 'ohlc', 'volume': 'sum'}),我得到:

ValueError: Shape of passed values is (2,), indices imply (2, 95)

我不太知道什麼是錯我的數據集,或者爲什麼失敗。任何人都可以幫助解決這個問題嗎?非常感激。

回答

10

問題不在於重新採樣,而是試圖將MultiIndex(來自價格OHLC)與常規索引(對於Volume總和)連接起來。

In [17]: df 
Out[17]: 
         price volume 
2014-01-15 14:29:54 949.975 0.01 
2014-01-15 14:29:59 941.370 0.01 
2014-01-15 14:30:17 949.975 0.01 
2014-01-15 14:30:24 941.370 0.01 
2014-01-15 14:30:36 949.975 0.01 

[5 rows x 2 columns] 

In [18]: df.resample('30s', how={'price': 'ohlc'}) # Note the MultiIndex 
Out[18]: 
         price       
         open  high  low close 
2014-01-15 14:29:30 949.975 949.975 941.370 941.370 
2014-01-15 14:30:00 949.975 949.975 941.370 941.370 
2014-01-15 14:30:30 949.975 949.975 949.975 949.975 

[3 rows x 4 columns] 

In [19]: df.resample('30s', how={'volume': 'sum'}) # Regular Index for columns 
Out[19]: 
        volume 
2014-01-15 14:29:30 0.02 
2014-01-15 14:30:00 0.02 
2014-01-15 14:30:30 0.01 

[3 rows x 1 columns] 

我想你可以手動(volume, sum)創建一個多指標,然後CONCAT:

In [34]: vol = df.resample('30s', how={'volume': 'sum'}) 

In [35]: vol.columns = pd.MultiIndex.from_tuples([('volume', 'sum')]) 

In [36]: vol 
Out[36]: 
        volume 
         sum 
2014-01-15 14:29:30 0.02 
2014-01-15 14:30:00 0.02 
2014-01-15 14:30:30 0.01 

[3 rows x 1 columns] 

In [37]: price = df.resample('30s', how={'price': 'ohlc'}) 

In [38]: pd.concat([price, vol], axis=1) 
Out[38]: 
         price        volume 
         open  high  low close  sum 
2014-01-15 14:29:30 949.975 949.975 941.370 941.370 0.02 
2014-01-15 14:30:00 949.975 949.975 941.370 941.370 0.02 
2014-01-15 14:30:30 949.975 949.975 949.975 949.975 0.01 

[3 rows x 5 columns] 

但它可能是,如果可以重新取樣自動處理這更好的。

+0

問題該內部:https://github.com/pydata/pandas/issues/5946 – Jeff

+0

這似乎使用新的resample API('df.resample('30S')。agg({'price':'ohlc','volume':'sum'})')來解決。 – ayhan

0

現在你可以做到這一點的大熊貓 實例的更高版本:熊貓版0.22.00 df.resample('30S').mean()