2017-12-20 14 views
1

だから私のデータセットには、次のようになります。パンダ - 移動平均 - 現在の行の前のXエントリの使用値

date,site,iso,id,hits 
2017-08-25,google,1,7012,14225.0 
2017-08-26,google,1,7012,14565.0 
2017-08-27,google,1,7012,14580.0 
2017-08-28,google,1,7012,14227.0 
2017-08-29,google,1,7012,14568.0 
2017-08-30,google,1,7012,14582.0 
2017-08-31,google,1,7012,14214.0 
2017-09-01,google,1,7012,14053.0 
2017-08-25,facebook,2,7019,21225.0 
2017-08-26,facebook,2,7019,21565.0 
2017-08-27,facebook,2,7019,31580.0 
2017-08-28,facebook,2,7019,13227.0 
2017-08-29,facebook,2,7019,22568.0 
2017-08-30,facebook,2,7019,44582.0 
2017-08-31,facebook,2,7019,32214.0 
2017-09-01,facebook,2,7019,44053.0 

私はの以前 3日間を使ってヒットの3日移動平均を見つける必要がありますデータ。 は、私がこれまで行ってきたこれは何です:

#sort values 
df_sorted = df.sort_values(['site', 'iso', 'id', 'date'], ascending=[1, 1, 1, 1]) 
#group 
df_grouped_sorted = df_sorted.groupby(['site', 'iso', 'id'], as_index=False) 
df_sorted['mov_av_hits'] = df_grouped_sorted[['hits']].rolling(3, min_periods=3).mean().fillna(0).reset_index(
    0, drop=True) 

そして今、私のデータセットには、次のようになります。

date,site,iso,id,hits,hits_avg 
2017-08-25,google,1,7012,14225.0,14146.0 
2017-08-26,google,1,7012,14565.0,14338.6666667 
2017-08-27,google,1,7012,14580.0,14456.6666667 
2017-08-28,google,1,7012,14227.0,14457.3333333 
2017-08-29,google,1,7012,14568.0,14458.3333333 
2017-08-30,google,1,7012,14582.0,14459.0 
2017-08-31,google,1,7012,14214.0,14454.6666667 
2017-09-01,google,1,7012,14053.0,14283.0 

今、このアプローチの問題点は、hitsの現在の値が含まれていることです移動平均。

例えば、2017-09-01を参照してください。私はhits_avgのために必要な値が(14568+14582+14214)/3 = 14454.6ですが、私が取得することである(14582+14214+14053)/3 = 14283.0

どのように私は以前 3日からの値を取るために移動平均を得ることができますか?比較ウィンドウ一歩移動するシフトを追加する

+0

機能があるかどうかを見てみましょう。多分シフト()を使用しない場合は? –

答えて

2

あなたはこれを試すことができます。..

df.hits.shift().rolling(3,min_periods=1).mean().fillna(df.hits) 
Out[692]: 
0 14225.000000 
1 14225.000000 
2 14395.000000 
3 14456.666667 
4 14457.333333 
5 14458.333333 
6 14459.000000 
7 14454.666667 
Name: hits, dtype: float64 

更新

df['new']=df.groupby('site').hits.apply(lambda x : x.shift().rolling(3,min_periods=1).mean().fillna(x)) 


df 
Out[712]: 
      date  site iso id  hits   new 
0 2017-08-25 google 1 7012 14225.0 14225.000000 
1 2017-08-26 google 1 7012 14565.0 14225.000000 
2 2017-08-27 google 1 7012 14580.0 14395.000000 
3 2017-08-28 google 1 7012 14227.0 14456.666667 
4 2017-08-29 google 1 7012 14568.0 14457.333333 
5 2017-08-30 google 1 7012 14582.0 14458.333333 
6 2017-08-31 google 1 7012 14214.0 14459.000000 
7 2017-09-01 google 1 7012 14053.0 14454.666667 
8 2017-08-25 facebook 2 7019 21225.0 21225.000000 
9 2017-08-26 facebook 2 7019 21565.0 21225.000000 
10 2017-08-27 facebook 2 7019 31580.0 21395.000000 
11 2017-08-28 facebook 2 7019 13227.0 24790.000000 
12 2017-08-29 facebook 2 7019 22568.0 22124.000000 
13 2017-08-30 facebook 2 7019 44582.0 22458.333333 
14 2017-08-31 facebook 2 7019 32214.0 26792.333333 
15 2017-09-01 facebook 2 7019 44053.0 33121.333333 
+0

ありがとうございましたが、問題は今、 'site'と' iso'が変更されたとき、新しい 'site' /' iso'の移動平均の初期値には、前の 'site' /' iso ' – Craig

+0

@craigあなたはgroupby' df.groupby( 'site')が必要です。apply(lambda x:x.hits.shift()。rolling(3、min_periods = 1).mean()。fillna(x.hits) ) ' – Wen

+0

これをデータフレームにどのように割り当てるのですか?これはスタンドアロンのステートメントとして機能しますが、私はdfの新しい列の値を望みます。新しい列に代入しようとすると、 'TypeError:フレームインデックスが挿入された列のインデックスが一致しません。 ' – Craig

1

てみてください():

df_sorted['mov_av_hits'] = df_grouped_sorted[['hits']].shift().rolling(3, min_periods=3).mean().fillna(0).reset_index(
    0, drop=True) 

を私が取得:

  date site iso id  hits mov_av_hits 
0 2017-08-25 google 1 7012 14225.0  0.000000 
1 2017-08-26 google 1 7012 14565.0  0.000000 
2 2017-08-27 google 1 7012 14580.0  0.000000 
3 2017-08-28 google 1 7012 14227.0 14456.666667 
4 2017-08-29 google 1 7012 14568.0 14457.333333 
5 2017-08-30 google 1 7012 14582.0 14458.333333 
6 2017-08-31 google 1 7012 14214.0 14459.000000 
7 2017-09-01 google 1 7012 14053.0 14454.666667 
+0

これは動作しますが、 'site'/'iso'が変更された場合、結果はNaNになります。更新されたサンプルデータを確認できますか? – Craig

+0

@Craig申し訳ありませんが、私は離れていました。あなたは助けてうれしい! –