使用大熊猫将贸易数据重新采样到OHLCV

jes*_*ern 10 python 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
Run Code Online (Sandbox Code Playgroud)

现在,我可以将其重新采样到OHLC数据中使用df.resample(freq, how={'price': 'ohlc'}),这很好,但我也想要包含音量.

当我尝试时df.resample(freq, how={'price': 'ohlc', 'volume': 'sum'}),我得到:

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

我不太确定我的数据集有什么问题,或者为什么会失败.任何人都可以帮忙解释一下吗?非常感激.

Tom*_*ger 11

问题不在于重新采样,而在于尝试连接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]
Run Code Online (Sandbox Code Playgroud)

我想你可以手动创建一个MultiIndex (volume, sum)然后连接:

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]
Run Code Online (Sandbox Code Playgroud)

但是如果resample可以自动处理这个问题可能会更好.

  • 这似乎可以通过新的重采样API(`df.resample('30S')。agg({'price':'ohlc','volume':'sum'})`来解决。 (2认同)