2016-06-16 12 views
0

統計を計算する前に昼と時間を考慮するローリング平均の使い方を理解しようとしています。出力列は次のようなものである必要がありながらpython3.5/pandas - 週と時間でローリング平均

date  hour price 
1/1/2016 1  a 
1/1/2016 2  b 
    .  .  . 
    .  .  . 
1/8/2016 1  c 
1/8/2016 2  d 
    .  .  . 
    .  .  . 
1/15/2016 1  e 
1/15/2016 2  f  

ファイルは次のようになります。

date  hour price ma 
1/1/2016 1  a 
1/1/2016 2  b 
    .  .  . 
    .  .  . 
1/8/2016 1  c 
1/8/2016 2  d 
    .  .  . 
    .  .  . 
1/15/2016 1  e mean(a,c) 
1/15/2016 2  f mean(b,d) 

答えて

1

あなたが特定の日付の前にすべての日の時間による平均をしたい...

それはあなたが望むものを100%明確ではないのですが、ここで私が作った仮定があります。このコードは...

import pandas as pd 
import numpy as np 
import datetime 

# build a sample table 
np.random.seed(1) 
values = np.random.choice(range(1, 11), 25) 
dates = np.random.choice(pd.date_range(datetime.date(2016, 1, 1), datetime.date(2016, 1, 4)), 25) 
hours = np.random.choice(range(4), 25) 
df = pd.DataFrame({'date': dates, 'hour': hours, 'value': values}) 

DFがこのようになっていることを...

 date hour value 
0 2016-01-03  1  6 
1 2016-01-01  2  9 
2 2016-01-03  2  10 
3 2016-01-02  0  6 
4 2016-01-03  3  1 
5 2016-01-01  3  1 
6 2016-01-04  1  2 
7 2016-01-01  1  8 
8 2016-01-03  3  7 
9 2016-01-01  2  10 

は、今あなたがしたい変換のために...

df.sort_values(['date', 'hour'], inplace=True) 
groups = df.groupby(['hour']) 

# calculate the rolling mean and sub out the current day's value then... 
#  divide by count of previous observations (works because cumcount is base 0) 
df['rolling_mean'] = (groups.transform(np.cumsum)['value'] - df.value)/(groups.cumcount()) 

# just to show result 
df.sort_values(['hour', 'date']) 

結果は...

あるん
 date hour value rolling_mean 
3 2016-01-02  0  6   NaN 
7 2016-01-01  1  8   NaN 
0 2016-01-03  1  6   8.0 
6 2016-01-04  1  2   7.0 
1 2016-01-01  2  9   NaN 
9 2016-01-01  2  10   9.0 
2 2016-01-03  2  10   9.5 
5 2016-01-01  3  1   NaN 
4 2016-01-03  3  1   1.0 
8 2016-01-03  3  7   1.0 

NaNで必要なことを行うまで...

+0

うわー、うまくいった!ありがとう! @ブルースプッチー – sndrosilva