OHLC 聚合器不适用于 Pandas 上的数据框?

Posted

技术标签:

【中文标题】OHLC 聚合器不适用于 Pandas 上的数据框?【英文标题】:OHLC aggregator doesn't work with dataframe on pandas? 【发布时间】:2012-11-08 00:08:37 【问题描述】:

我不确定这是一个错误还是设计使然——也许我遗漏了一些东西,并且 ohlc 聚合器不应该与数据帧一起使用。也许这种行为是设计使然,因为除了索引列和价格列之外的数据框可能会产生奇怪的结果?其他聚合器(mean、stdev 等)使用数据框。无论如何,我正在尝试从这些数据中获取 OHLC,并且转换为时间序列似乎也不起作用。

这是一个例子:

import pandas as pd
rng = pd.date_range('1/1/2012', periods=1000, freq='S')

ts = pd.Series(randint(0, 500, len(rng)), index=rng)
df = pd.DataFrame(randint(0,500, len(rng)), index=rng)

ts.resample('5Min', how='ohlc') # works great
df.resample('5Min', how='ohlc') # throws a "NotImplementedError"

newts = pd.TimeSeries(df) #am I missing an index command in this line?
# the above line yields this error "TypeError: Only valid with DatetimeIndex or
  PeriodIndex"

Full NotImplementedError paste:

NotImplementedError                       Traceback (most recent call last)
/home/jeff/<ipython-input-7-85a274cc0d8c> in <module>()
----> 1 df.resample('5Min', how='ohlc')

/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/core/generic.pyc in resample(self, rule, how, axis, fill_method, closed, label, convention, kind, loffset, limit, base)
    231                               fill_method=fill_method, convention=convention,
    232                               limit=limit, base=base)
--> 233         return sampler.resample(self)
    234 
    235     def first(self, offset):

/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/tseries/resample.pyc in resample(self, obj)
     66 
     67         if isinstance(axis, DatetimeIndex):
---> 68             rs = self._resample_timestamps(obj)
     69         elif isinstance(axis, PeriodIndex):
     70             offset = to_offset(self.freq)

/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/tseries/resample.pyc in _resample_timestamps(self, obj)
    189             if len(grouper.binlabels) < len(axlabels) or self.how is not None:
    190                 grouped = obj.groupby(grouper, axis=self.axis)
--> 191                 result = grouped.aggregate(self._agg_method)
    192             else:
    193                 # upsampling shortcut


/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
   1538         """
   1539         if isinstance(arg, basestring):
-> 1540             return getattr(self, arg)(*args, **kwargs)
   1541 
   1542         result = 

/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/core/groupby.pyc in ohlc(self)
    384         For multiple groupings, the result index will be a MultiIndex
    385         """
--> 386         return self._cython_agg_general('ohlc')
    387 
    388     def nth(self, n):

/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/core/groupby.pyc in _cython_agg_general(self, how, numeric_only)
   1452 
   1453     def _cython_agg_general(self, how, numeric_only=True):
-> 1454         new_blocks = self._cython_agg_blocks(how, numeric_only=numeric_only)
   1455         return self._wrap_agged_blocks(new_blocks)
   1456 

/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/core/groupby.pyc in _cython_agg_blocks(self, how, numeric_only)
   1490                 values = com.ensure_float(values)
   1491 
-> 1492             result, _ = self.grouper.aggregate(values, how, axis=agg_axis)
   1493             newb = make_block(result, block.items, block.ref_items)
   1494             new_blocks.append(newb)

/usr/local/lib/python2.7/dist-packages/pandas-0.9.2.dev-py2.7-linux-x86_64.egg/pandas/core/groupby.pyc in aggregate(self, values, how, axis)
    730                 values = values.swapaxes(0, axis)
    731             if arity > 1:
--> 732                 raise NotImplementedError
    733             out_shape = (self.ngroups,) + values.shape[1:]
    734 

NotImplementedError: 

【问题讨论】:

听起来它还没有(还)被实现...... 可能是这样,海登。如果这是真的,我想我必须弄清楚如何正确地将我的数据帧转换为我可以重新采样的时间序列。到目前为止,我也没有成功。 我可以通过使用以下命令将我的数据帧转换为时间序列来获得所需的结果: "ts = pd.TimeSeries(df[0])" ,然后我可以重新采样时间序列。不像直接从数据框中那样优雅,但它现在可以工作。 我一直计划让它产生分层列,但看起来我还没有开始。 github.com/pydata/pandas/issues/2320 【参考方案1】:

您可以对单个列重新采样(因为每个列都是时间序列):

In [9]: df[0].resample('5Min', how='ohlc')
Out[9]: 
                     open  high  low  close
2012-01-01 00:00:00   136   136  136    136
2012-01-01 00:05:00   462   499    0    451
2012-01-01 00:10:00   209   499    0    495
2012-01-01 00:15:00    25   499    0    344
2012-01-01 00:20:00   200   498    0    199


In [10]: type(df[0])
Out[10]: pandas.core.series.TimeSeries

我不清楚这应该如何输出更大的 DataFrame(具有多列),但也许你可以制作一个面板:

In [11]: newts = Panel(dict((col, df[col].resample('5Min', how='ohlc'))
                                for col in df.columns))

In [12]: newts[0]
Out[12]: 
                     open  high  low  close
2012-01-01 00:00:00   136   136  136    136
2012-01-01 00:05:00   462   499    0    451
2012-01-01 00:10:00   209   499    0    495
2012-01-01 00:15:00    25   499    0    344
2012-01-01 00:20:00   200   498    0    199

注意:也许有一个用于重新采样 DataFrame 的规范输出,并​​且它尚未实现?

【讨论】:

在单个列上重新采样是我正在寻找的。完美运行。谢谢你,海登。

以上是关于OHLC 聚合器不适用于 Pandas 上的数据框?的主要内容,如果未能解决你的问题,请参考以下文章

pandas OHLC 聚合随着 OHLC 的时间重新采样

Python pandas 将 15 分钟 ohlc 重新采样为 75 分钟 ohlc

Python/Pandas,.count 不适用于更大的数据框

为啥我的 python pandas 数据框剥离方法不适用于尾随空格?我该如何解决?

Pandas Groupby:同一列上的聚合,但总计基于两个不同的标准/数据框

Pandas drop_duplicates 方法不适用于包含列表的数据框