使用 groupby、列表理解和自定义函数创建代码时理解逻辑的问题

Problems understanding the logic when creating code using groupby, list comprehensions and custom functions

我想为数据框中的每个代码计算不同 window 大小的滚动平均值。理想情况下,我可以传递一个 window 大小的列表,并且对于每个自动收报机我都会得到新的列(每个滚动平均大小一个)。因此,如果我想要 2 和 3 之一的滚动平均值,则每个代码的输出将是两列。

import datetime as dt
import numpy as np
import pandas as pd
Dt_df = pd.DataFrame({"Date":pd.date_range('2018-07-01', periods=5, freq='D')})
Tick_df = pd.DataFrame({"Ticker":['ABC',"HIJ","XYZ"]})
Mult_df = pd.merge(Tick_df.assign(key='x'), Dt_df.assign(key='x') on='key').drop('key', 1)
df2 = pd.DataFrame(np.random.randint(low=5, high=10, size=(15, 1)),  columns=['Price'])
df3 = Mult_df.join(df2, how='outer')
df3.set_index(['Ticker','Date'],inplace = True)

这是示例数据集:

当我尝试应用此功能时:

def my_RollMeans(x):
    w = [1,2,3]
    s = pd.Series(x)
    Bob = pd.DataFrame([s.rolling(w1).mean() for w1 in w]).T
    return Bob

我的数据帧 df3 使用各种版本的应用或转换时出现错误。

NewDF = df3.groupby('Ticker').Price.transform(my_RollMeans).fillna(0)

最新的错误是:

Data must be 1-dimensional

IIUC 尝试使用 apply,我对您的自定义函数进行了修改:

def my_RollMeans(x):
    w = [1,2,3]
    s = pd.Series(x)
    Bob = pd.DataFrame([s.rolling(w1).mean().rename('Price_'+str(w1)) for w1 in w]).T
    return Bob

df3.groupby('Ticker').apply(lambda x : my_RollMeans(x.Price)).fillna(0)

输出:

                   Price_1  Price_2   Price_3
Ticker Date                                  
ABC    2018-07-01      9.0      0.0  0.000000
       2018-07-02      8.0      8.5  0.000000
       2018-07-03      7.0      7.5  8.000000
       2018-07-04      8.0      7.5  7.666667
       2018-07-05      8.0      8.0  7.666667
HIJ    2018-07-01      8.0      0.0  0.000000
       2018-07-02      9.0      8.5  0.000000
       2018-07-03      5.0      7.0  7.333333
       2018-07-04      6.0      5.5  6.666667
       2018-07-05      7.0      6.5  6.000000
XYZ    2018-07-01      9.0      0.0  0.000000
       2018-07-02      5.0      7.0  0.000000
       2018-07-03      9.0      7.0  7.666667
       2018-07-04      8.0      8.5  7.333333
       2018-07-05      6.0      7.0  7.666667