2015-09-14 187 views
1

我想使用熊猫来计算三个不同月份的三个值的平均值,数据集列出了三个不同列中的年份,月份和感兴趣值。通常情况下,我只是使用pandas.loc和isin()和panads.groupby函数来执行此操作,但我想分析的一个季节是12月 - 1月 - 2月,这将跨越两年不同的数据(即Dec. 2000年1月,2001年2月)。想知道是否有人对如何处理这类事情有任何建议。使用熊猫计算12月 - 1月 - 2月的平均值

2000 1 5 
2000 2 6 
2000 3 8 
2000 4 10 
2000 5 9 
2000 6 11 
2000 7 13 
2000 8 6 
2000 9 8 
2000 10 7 
2000 11 7 
2000 12 4 
2001 1 3 
2001 2 5 

(即在这种情况下,1月至2000年2月将被忽略,平均值是MAM:9,JJA:10,SON:7.33,DJF:4)

回答

2

您可以自定义季度和使用groupby

# Test data 
df = pd.DataFrame({'month': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2], 
        'year': [2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001], 
        'value': [5.0, 6.0, 8.0, 10.0, 9.0, 11.0, 13.0, 6.0, 8.0, 7, 7, 4, 3.0, 5.0]}) 

# Custom quarters definition 
quarters = {1: 'DJF', 2: 'DJF', 3: 'MAM', 4: 'MAM', 5: 'MAM', 6: 'JJA', 7: 'JJA', 8: 'JJA', 9: 'SON', 10: 'SON', 11: 'SON', 
    12: 'DJF'} 

df = df.set_index(['month']) 

# can be grouped by year and quarters 
df.groupby(['year',quarters])['value'].mean() 

year  
2000 DJF  5.000000 
     JJA 10.000000 
     MAM  9.000000 
     SON  7.333333 
2001 DJF  4.000000 

# or only by quarters according to the needs 
df.groupby(quarters)['value'].mean() 

DJF  4.600000 
JJA 10.000000 
MAM  9.000000 
SON  7.333333 
1

我想你'寻找的是rolling_mean

例如,

ts 
Out[39]: 
2000-01-31 -1.782781 
2000-02-29 0.976542 
2000-03-31 -1.932712 
2000-04-30 0.098827 
2000-05-31 -0.236521 
2000-06-30 -0.869157 
2000-07-31 0.653783 
2000-08-31 0.341896 
2000-09-30 -0.685596 
2000-10-31 -1.126368 
2000-11-30 0.850350 
2000-12-31 -1.583704 
2001-01-31 1.677160 
2001-02-28 1.872733 
Freq: M, dtype: float64 

提供的3

pd.rolling_mean(ts,3) 
Out[40]: 
2000-01-31   NaN 
2000-02-29   NaN 
2000-03-31 -0.912983 
2000-04-30 -0.285781 
2000-05-31 -0.690135 
2000-06-30 -0.335617 
2000-07-31 -0.150632 
2000-08-31 0.042174 
2000-09-30 0.103361 
2000-10-31 -0.490023 
2000-11-30 -0.320538 
2000-12-31 -0.619907 
2001-01-31 0.314602 
2001-02-28 0.655396 
Freq: M, dtype: float64 

所示的窗口来计算重叠的范围为好,这可以忽略。

0

从现有数据中添加一个可创建“月份ID”的新列,其值为(year - 2000)* 12 +(month - 2)。然后按这个新值分组。