您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

您的方法是正确的,但是失败了,因为应用于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()功能

python 2022/1/1 18:26:24 有536人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶