2017-03-06 30 views
2

移動以前的日期的平均I具有以下DF:新近度加權大熊貓

index = pd.to_datetime(['2017-03-01', '2017-03-01', '2017-02-15', '2017-02-01', 
     '2017-01-20', '2017-01-20', '2017-01-20', '2017-01-02', 
     '2016-12-04', '2016-12-04', '2016-12-04', '2016-11-16']) 

df = pd.DataFrame(data = {'val': [8, 1, 5, 2, 3 , 5, 9, 14, 13, 2, 1, 12], 
       'group': ['one', 'two', 'one', 'one', 'two', 'two', 'one', 'two', 
       'two', 'one', 'one', 'two']}, 
       index=index) 

df = df.sort_index() 

      group val 
2016-11-16 two 12 
2016-12-04 two 13 
2016-12-04 one 2 
2016-12-04 one 1 
2017-01-02 two 14 
2017-01-20 two 3 
2017-01-20 two 5 
2017-01-20 one 9 
2017-02-01 one 2 
2017-02-15 one 5 
2017-03-01 one 8 
2017-03-01 two 1 

在每一個組(一個,兩個)我想先前val的一個新近度加權平均。因此,例如在看一組:

  group val 
2016-12-04 one 2 
2016-12-04 one 1 
2017-01-20 one 9 
2017-02-01 one 2 
2017-02-15 one 5 
2017-03-01 one 8 

例如,對於日期2017-02-15,我希望計算其近因加權版本(較高的權重爲較近的日期作爲此日期值的新列以前的值是[2,9,1,2])。請注意,可能在一個組內有多次日期,並且應該得到相同的權重。

我認爲大熊貓指數加權函數對此很有用。我認爲這是一組內的日期是相同的,我會首先考慮這些值的意思,以便稍後可以應用簡單的shift()。我試過如下:

df = df.reset_index().set_index(['index', 'group']).groupby(
     level=[0,1]).mean().reset_index().set_index('index') 

現在,如果我不感興趣的近因加權我喜歡的東西

df = df.groupby('group')['val'].expanding().mean().groupby(level=0).shift() 

,然後用原來的日期和集團合併。 但是,當我試圖用pandas.ewma我失去了一些東西像:

df.groupby('group')['val'].ewm(span=27).groupby(level=0).shift() 

我可以通過組迭代:

grouped = df.groupby('group')['val'] 
for key, group in grouped: 
    print pd.ewma(group, span=27).shift() 

index 
2016-12-04   NaN 
2017-01-20 1.500000 
2017-02-01 5.388889 
2017-02-15 4.174589 
2017-03-01 4.404414 
Name: val, dtype: float64 
index 
2016-11-16   NaN 
2016-12-04 12.000000 
2017-01-02 12.518519 
2017-01-20 13.049360 
2017-03-01 10.529680 

,然後組和日期莫名其妙合併與原df但這似乎過於複雜。有一個更好的方法嗎?

回答

1

基於此斯蒂芬aswer是一個工作版本:

def rwma(group): 
    # perform the ewma 
    kwargs = dict(ignore_na=False, span=27, min_periods=0, adjust=True) 
    result = group.resample('1D').mean().ewm(**kwargs).mean().shift() 
    result = result[group.index].reset_index() 

    # rename the result column so that the merge goes smoothly 
    result.rename(columns={result.columns[-1]: 'rwma'}, inplace=True) 
    return result 

recency = df.groupby('group')['val'].apply(rwma) 
print(recency) 

輸出:

    index  rwma 
group       
one 0 2016-12-04  NaN 
     1 2016-12-04  NaN 
     2 2017-01-20 1.500000 
     3 2017-02-01 8.776518 
     4 2017-02-15 4.016278 
     5 2017-03-01 4.670166 
two 0 2016-11-16  NaN 
     1 2016-12-04 12.000000 
     2 2017-01-02 12.791492 
     3 2017-01-20 13.844843 
     4 2017-01-20 13.844843 
     5 2017-03-01 6.284914 
+0

真的嗎?幫助你?嘆。 –

2

要執行新近加權移動平均值而不需要遍歷組並重新合併,可以使用apply

def rwma(group): 
    # perform the ewma 
    kwargs = dict(ignore_na=False, span=27, min_periods=0, adjust=True) 
    result = group.ewm(**kwargs).mean().shift().reset_index() 

    # rename the result column so that the merge goes smoothly 
    result.rename(columns={result.columns[-1]: 'rwma'}, inplace=True) 
    return result 

recency = df.groupby('group')['val'].apply(rwma) 

測試代碼:

import pandas as pd 

df = pd.DataFrame(data={ 
    'val': [8, 1, 5, 2, 3, 5, 9, 14, 13, 2, 1, 12], 
    'group': ['one', 'two', 'one', 'one', 'two', 'two', 
       'one', 'two', 'two', 'one', 'one', 'two']}, 
    index=pd.to_datetime([ 
     '2017-03-01', '2017-03-01', '2017-02-15', '2017-02-01', 
     '2017-01-20', '2017-01-20', '2017-01-20', '2017-01-02', 
     '2016-12-04', '2016-12-04', '2016-12-04', '2016-11-16']) 
    ).sort_index() 

recency = df.groupby('group')['val'].apply(rwma) 
print(recency) 

結果:

   index  rwma 
group       
one 0 2016-12-04  NaN 
     1 2016-12-04 2.000000 
     2 2017-01-20 1.481481 
     3 2017-02-01 4.175503 
     4 2017-02-15 3.569762 
     5 2017-03-01 3.899694 
two 0 2016-11-16  NaN 
     1 2016-12-04 12.000000 
     2 2017-01-02 12.518519 
     3 2017-01-20 13.049360 
     4 2017-01-20 10.251243 
     5 2017-03-01 9.039866 
+0

謝謝斯蒂芬。問題在於,在第一組中,我無法知道12-04的值,因爲我只能在前幾天計算val。我修正了它,並在下面發佈了工作版本。你的答案明確幫助了我! – jens0r

+0

標題可能會令人困惑,因爲它應該是'前一天在熊貓中的新近移動平均加權平均值' – jens0r