[英]Resampling trade data into OHLCV with pandas
我在pandas DataFrame中有歷史交易數據,包含價格和交易量列,由DateTimeIndex索引。
例如:
>>> 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)
我不太確定我的數據集有什么問題,或者為什么會失敗。 任何人都可以幫忙解釋一下嗎? 非常感激。
問題不在於重新采樣,而在於嘗試連接MultiIndex(來自價格OHLC),使用常規索引(對於音量總和)。
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)
手動創建一個MultiIndex,然后連續:
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]
但是如果resample可以自動處理這個問題可能會更好。
您現在可以在更高版本的Pandas中執行此操作示例:Pandas版本0.22.00 df.resample('30S').mean()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.