当前位置: 首页 > 面试题库 >

使用python和pandas将OHLC股票数据转换为不同的时间范围

叶鸿
2023-03-14
问题内容

有人可以帮我指出有关熊猫的OHLC数据时间范围转换的正确方向吗?我想做的是用较长时间的数据构建一个数据帧,给定较短时间的数据。

例如,假设我有以下一分钟(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

因此,工作流程是:

  • 打开是时间窗口中第一行的打开
  • 高是时间窗口中的最高高
  • 低是最低
  • 关闭是最后一个关闭
  • 体积只是体积的总和

但是有几个问题:

  • 数据有空白(请注意没有10:30:00行)
  • 5分钟的间隔必须在整点开始,例如M5在10:25:00开始,而不是10:22:00
  • 首先,不完整的集合可以像本例一样省略或包含(因此我们可以输入10:20:00 5分钟)

在对上下采样熊猫文件给出了一个例子,但他们使用的平均值作为上采样行的值,它不会在这里工作。我尝试使用groupbyagg但无济于事。对于获得最高价和最低价的人来说可能并不难,但是我不知道如何获得第一个开盘价和最后一个收盘价。

我尝试的是以下几种方法:

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.

因此,对此的任何帮助将不胜感激。如果我选择的路径行不通,请提出其他相对有效的方法(我有数百万行)。使用熊猫进行财务处理的一些资源也很不错。


问题答案:

您的方法是正确的,但是失败了,因为应用于agg()的函数dict中的每个函数都接收一个Series对象,该对象反映了与键值匹配的列。因此,不必再次过滤列标签。这样,并假设groupby保留顺序,您可以对Series进行切片以提取Open
/ Close列的first / last元素(注意:groupby文档并未声称保留原始数据系列的顺序,但实际上是这样)。

In [50]: df.groupby(dr5minute.asof).agg({'Low': lambda s: s.min(), 
                                         'High': lambda s: s.max(),
                                         'Open': lambda s: s[0],
                                         'Close': lambda s: s[-1],
                                         'Volume': lambda s: s.sum()})
Out[50]: 
                      Close    High     Low    Open  Volume
key_0                                                      
1999-01-04 10:20:00  1.1806  1.1819  1.1801  1.1801      34
1999-01-04 10:25:00  1.1789  1.1815  1.1776  1.1807      91
1999-01-04 10:30:00  1.1791  1.1792  1.1776  1.1780      16

作为参考,以下表格总结了基于groupby对象类型的聚合函数的预期输入和输出类型,以及如何将聚合函数传递到agg()。

                  agg() method     agg func    agg func          agg()
                  input type       accepts     returns           result
GroupBy Object
SeriesGroupBy     function         Series      value             Series
                  dict-of-funcs    Series      value             DataFrame, columns match dict keys
                  list-of-funcs    Series      value             DataFrame, columns match func names
DataFrameGroupBy  function         DataFrame   Series/dict/ary   DataFrame, columns match original DataFrame
                  dict-of-funcs    Series      value             DataFrame, columns match dict keys, where dict keys must be columns in original DataFrame
                  list-of-funcs    Series      value             DataFrame, MultiIndex columns (original cols x func names)

从上表中,如果聚合需要访问多个列,则唯一的选择是将单个函数传递给DataFrameGroupBy对象。因此,完成原始任务的另一种方法是定义一个类似如下的函数:

def ohlcsum(df):
    df = df.sort()
    return {
       'Open': df['Open'][0],
       'High': df['High'].max(),
       'Low': df['Low'].min(),
       'Close': df['Close'][-1],
       'Volume': df['Volume'].sum()
      }

并应用agg():

In [30]: df.groupby(dr5minute.asof).agg(ohlcsum)
Out[30]: 
                       Open    High     Low   Close  Volume
key_0                                                      
1999-01-04 10:20:00  1.1801  1.1819  1.1801  1.1806      34
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

尽管熊猫将来可能会提供一些更简洁的内置魔术,但希望这可以解释如何使用当今的agg()功能。



 类似资料:
  • 在jsp页面中从日期选择器中选择日期时,格式如下所示。 从印度登录时,数据选择器格式如下: 从美国登录时,datepicker格式如下所示。 我想将其转换为“dd-MMM-yyyy”两种格式。 假设将来我想从其他国家登录,即内部化它将以相同的格式输出。 现在,我们正在angularJS(jsp页面)应用程序中实现。 示例javacode如下,对印度运行良好,但对美国不起作用。 我怎样才能使它能够为

  • 问题内容: 如何将字符串的熊猫索引转换为日期时间格式 我的数据框“ df”是这样的 但是索引的类型是字符串,但是我需要一个日期时间格式,因为我得到了错误 使用时 问题答案: 它应该按预期工作。尝试运行以下示例。

  • 问题内容: 我在Python 2.7中具有以下Pandas数据框。 数据框如下所示: 该数据框来自 .csv文件。我使用熊猫作为熊猫数据框读取 .csv文件。当我使用它时,它表明该列具有数据类型。我想将此列转换为数据类型,但我只想要时间部分- 我不需要年,月,日。 我可以尝试这样: 但问题是,当我运行它仍然显示该列的。 有没有办法将此列转换为只有时间的日期时间格式? 附加信息: 要创建上述数据框并

  • 问题内容: 将熊猫的DateTimeIndex转换为Unix时间(可迭代)的惯用方式是什么?这可能不是要走的路: 问题答案: 由于是引擎盖下,你可以做转换没有理解(要快得多)。

  • 问题内容: 我对知道如何将熊猫数据框转换为NumPy数组感兴趣。 数据框: 给 我想将其转换为NumPy数组,如下所示: 我怎样才能做到这一点? 作为奖励,是否可以像这样保留dtype? 或类似的? 问题答案: 要将pandas数据框(df)转换为numpy ndarray,请使用以下代码:

  • 我需要将ADR和ORD对(以及它们之间的货币)的股票价格数据编译成Pandas数据帧。我刚开始使用Alpha Vantage API,它可以很好地获取在美国上市的股票价格(以分钟为单位)和汇率,但我还没有弄清楚如何获取在国外上市的股票价格(ORD)。我几乎肯定这只是一个ticker.exchange类型的输入,但这似乎不起作用。 下面的代码是我在木星笔记本中使用的,用于获取帝亚吉欧PLC的ADR。