gpt4 book ai didi

python - pandas dataframe resample 聚合函数使用具有自定义函数的多列?

转载 作者:行者123 更新时间:2023-12-04 18:21:38 25 4
gpt4 key购买 nike

下面是一个例子:

# Generate some random time series dataframe with 'price' and 'volume'
x = pd.date_range('2017-01-01', periods=100, freq='1min')
df_x = pd.DataFrame({'price': np.random.randint(50, 100, size=x.shape), 'vol': np.random.randint(1000, 2000, size=x.shape)}, index=x)
df_x.head(10)
price vol
2017-01-01 00:00:00 56 1544
2017-01-01 00:01:00 70 1680
2017-01-01 00:02:00 92 1853
2017-01-01 00:03:00 94 1039
2017-01-01 00:04:00 81 1180
2017-01-01 00:05:00 70 1443
2017-01-01 00:06:00 56 1621
2017-01-01 00:07:00 68 1093
2017-01-01 00:08:00 59 1684
2017-01-01 00:09:00 86 1591

# Here is some example aggregate function:
df_x.resample('5Min').agg({'price': 'mean', 'vol': 'sum'}).head()
price vol
2017-01-01 00:00:00 78.6 7296
2017-01-01 00:05:00 67.8 7432
2017-01-01 00:10:00 76.0 9017
2017-01-01 00:15:00 74.0 6989
2017-01-01 00:20:00 64.4 8078

但是,如果我想提取依赖于多个列的其他聚合信息,我该怎么办?

例如,我想在这里追加 2 列,称为 all_upall_down

这 2 列的计算定义如下:

每 5 分钟,1 分钟采样价格下降多少次,成交量下降多少次,称为 all_down ,上升多少次,称为 all_up 列。

这是我期望的 2 列:
                     price   vol  all_up  all_down
2017-01-01 00:00:00 78.6 7296 2 0
2017-01-01 00:05:00 67.8 7432 0 0
2017-01-01 00:10:00 76.0 9017 1 0
2017-01-01 00:15:00 74.0 6989 1 1
2017-01-01 00:20:00 64.4 8078 0 2

此功能取决于 2 列。但是在 agg对象中的 Resampler函数中,好像只接受3种函数:
  • str 或分别应用于每一列的函数。
  • 一个 list 函数,分别应用于每一列。
  • 带有键的 dict 匹配列名。每次仍然只将作为函数的值应用于单个列。

  • 所有这些功能似乎都不能满足我的需求。

    最佳答案

    我认为你需要 resample 使用 groupby + Grouperapply 和自定义函数:

    def func(x):
    #code
    a = x['price'].mean()
    #custom function working with 2 columns
    b = (x['price'] / x['vol']).mean()
    return pd.Series([a,b], index=['col1','col2'])

    df_x.groupby(pd.Grouper(freq='5Min')).apply(func)

    或者对所有支持的聚合函数使用 resample 并将输出与自定义函数的输出连接在一起:
    def func(x):
    #custom function
    b = (x['price'] / x['vol']).mean()
    return b

    df1 = df_x.groupby(pd.Grouper(freq='5Min')).apply(func)
    df2 = df_x.resample('5Min').agg({'price': 'mean', 'vol': 'sum'}).head()

    df = pd.concat([df1, df2], axis=1)

    编辑:为了检查减少和增加使用函数 diff 并与 0 比较,将两个条件与 & 连接并按 sum 计数:
    def func(x):
    v = x['vol'].diff().fillna(0)
    p = x['price'].diff().fillna(0)
    m1 = (v > 0) & (p > 0)
    m2 = (v < 0) & (p < 0)
    return pd.Series([m1.sum(), m2.sum()], index=['all_up','all_down'])


    df1 = df_x.groupby(pd.Grouper(freq='5min')).apply(func)
    print (df1)
    all_up all_down
    2017-01-01 00:00:00 2 0
    2017-01-01 00:05:00 0 0

    df2 = df_x.resample('5Min').agg({'price': 'mean', 'vol': 'sum'}).head()
    df = pd.concat([df2, df1], axis=1)
    print (df)
    vol price all_up all_down
    2017-01-01 00:00:00 7296 78.6 2 0
    2017-01-01 00:05:00 7432 67.8 0 0

    关于python - pandas dataframe resample 聚合函数使用具有自定义函数的多列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47938372/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com