0

我有以下数据框:

df = pd.DataFrame({
'Trader': 'Carl Mark Carl Joe Joe Carl Joe Carl'.split(),
'Product': list('AAAABBAA'),
'Quantity': [5,2,5,10,1,5,2,3],
'Start' : [
    DT.datetime(2013,1,1,9,0),
    DT.datetime(2013,1,1,8,5),
    DT.datetime(2013,2,5,14,0),
    DT.datetime(2013,2,5,16,0),
    DT.datetime(2013,2,8,20,0),                                      
    DT.datetime(2013,2,8,16,50),
    DT.datetime(2013,2,8,7,0),
    DT.datetime(2013,7,4,8,0)]})

df = df.set_index(['Start', 'Trader', 'Product'])

我想每天重新采样这个 DataFrame 并计算以下复杂的统计数据。

  • 对于每种产品:EMA 价值(前一天)与交易者实际购买之间的每周平均差异是多少

  • 对于每种产品:交易者购买日期的每周平均方差是多少

因此,作为第一步,我取消了 Product 和 Trader 列,并使用以下方法计算 ema:

df1 = df.unstack(level=[1,2]).fillna(0).resample('D', 'mean').fillna(0)
df2 = pd.ewma(df1, span=7)

更新:

感谢 Wouter Overmeire 的评论,我可以使用以下方法将移位的趋势值与原始值结合起来:

df2 = df2.shift(freq='D')
df3 = pd.concat([df1, df2], keys=['acctual', 'trend'], axis=1)
df4 = df3.stack(['Trader', 'Product']).fillna(0)

基于此 DateFrame,我尝试使用按功能分组来回答上述两个问题。不幸的是,我无法从交易者列中抽象出来,因为它仍在按功能分组的结果中。有人有想法吗?

df4 = df4.reset_index()
def f (df):
    df['Diff'] = abs(df[('acctual', 'Quantity')] - df[('trend', 'Quantity')])
    return df


df5 = df4.groupby([df4['Start'].map(lambda x: x.year), df4['Start'].map(lambda x: x.week),    df4['Product']])
df5.apply(f)

我将非常感谢任何帮助。

谢谢

安迪

4

0 回答 0