可能有人请相对于OHLC数据的时间内转换与Pandas点我在正确的方向?我想要做的是在更高的时间范围内为数据创建一个数据帧,并给定时间较短的数据。转换OHLC股票数据转换成不同的时间段使用Python和大熊猫
例如,假设我有以下一分钟(M1)数据:
Open High Low Close Volume
Date
1999-01-04 10:22:00 1.1801 1.1819 1.1801 1.1817 4
1999-01-04 10:23:00 1.1817 1.1818 1.1804 1.1814 18
1999-01-04 10:24:00 1.1817 1.1817 1.1802 1.1806 12
1999-01-04 10:25:00 1.1807 1.1815 1.1795 1.1808 26
1999-01-04 10:26:00 1.1803 1.1806 1.1790 1.1806 4
1999-01-04 10:27:00 1.1801 1.1801 1.1779 1.1786 23
1999-01-04 10:28:00 1.1795 1.1801 1.1776 1.1788 28
1999-01-04 10:29:00 1.1793 1.1795 1.1782 1.1789 10
1999-01-04 10:31:00 1.1780 1.1792 1.1776 1.1792 12
1999-01-04 10:32:00 1.1788 1.1792 1.1788 1.1791 4
具有开放式,高,低,关闭(OHLC)和容积值,每一分钟我想建一组5分钟的读数(M5),其看起来像这样:
Open High Low Close Volume
Date
1999-01-04 10:25:00 1.1807 1.1815 1.1776 1.1789 91
1999-01-04 10:30:00 1.1780 1.1792 1.1776 1.1791 16
所以工作流程是:
- 打开为t的开放他在timewindow第一行
- 高是在timewindow
- 低最低低
- 关闭是最后关闭
- 量最高的高简直是卷
还有的总和虽然有几个问题:
- 的数据差距(注意没有10:30:00行)
- 5分钟的间隔必须在整个时间开始,例如, M5开始于10:25:00不是10:22:00
- 第一,不完整的集可以在这个例子中可以省略等,或者包括(所以我们可以有10:20:00 5分钟进入)
Pandas documentation on up-down sampling举例说明,但它们使用平均值作为上采样行的值,这在此不起作用。我曾尝试使用groupby
和agg
,但无济于事。对于一个获得最高和最低的可能并不难,但我不知道如何获得第一个开放和最后一个关闭。
我想什么是沿着线的东西:
grouped = slice.groupby(dr5minute.asof).agg(
{ 'Low': lambda x : x.min()[ 'Low' ], 'High': lambda x : x.max()[ 'High' ] }
)
,但它会导致下面的错误,我不明白:
In [27]: grouped = slice.groupby(dr5minute.asof).agg({ 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] })
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
/work/python/fxcruncher/<ipython-input-27-df50f9522a2f> in <module>()
----> 1 grouped = slice.groupby(dr5minute.asof).agg({ 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] })
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in agg(self, func, *args, **kwargs)
242 See docstring for aggregate
243 """
--> 244 return self.aggregate(func, *args, **kwargs)
245
246 def _iterate_slices(self):
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
1153 colg = SeriesGroupBy(obj[col], column=col,
1154 grouper=self.grouper)
-> 1155 result[col] = colg.aggregate(func)
1156
1157 result = DataFrame(result)
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, func_or_funcs, *args, **kwargs)
906 return self._python_agg_general(func_or_funcs, *args, **kwargs)
907 except Exception:
--> 908 result = self._aggregate_named(func_or_funcs, *args, **kwargs)
909
910 index = Index(sorted(result), name=self.grouper.names[0])
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in _aggregate_named(self, func, *args, **kwargs)
976 grp = self.get_group(name)
977 grp.name = name
--> 978 output = func(grp, *args, **kwargs)
979 if isinstance(output, np.ndarray):
980 raise Exception('Must produce aggregated value')
/work/python/fxcruncher/<ipython-input-27-df50f9522a2f> in <lambda>(x)
----> 1 grouped = slice.groupby(dr5minute.asof).agg({ 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] })
IndexError: invalid index to scalar variable.
这样做的任何帮助将是不胜感激。如果我选择的路径不起作用,请提出其他相对有效的方法(我有数百万行)。一些使用熊猫进行金融处理的资源也很好。
您使用的是什么版本的熊猫?我们正在研究改进后的时间序列功能,这将大大简化这一过程,但它不可能在四月底左右发布。可能有一个错误需要修复,不过, – 2012-03-30 15:24:09
Hi Wes,我正在使用0.7.2。我想等待新版本发布是一个可行的选择,因为我没有这个转换的最后期限(我需要这些数据用于私人研究)。让我使用这个ocasion来感谢你为开发熊猫做出的努力! :) – kgr 2012-03-30 15:55:16
至于潜在的错误,请注意,我没有为Dataframe中的所有列指定值(仅限于2/5),如果这就是您的意思。 – kgr 2012-03-30 15:56:29