使用 Pandas 计算 12 月-1 月-2 月的平均值
Using Pandas to calculate December-January-February average
我想使用 Pandas 来计算数据集中三个不同月份的三个值的平均值,该数据集在三个不同的列中列出了年、月和感兴趣的值。通常,我只会使用 pandas.loc 和 isin() 以及 panads.groupby 函数来执行此操作,但我要分析的季节之一是 12 月-1 月-2 月,这将跨越两个不同年份的数据(即 2000 年 12 月、2001 年 1 月、2001 年 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
(即在这种情况下,2000 年 1 月和 2 月将被忽略,平均值为 MAM:9,JJA:10,SON:7.33,DJF:4)
我想你要找的是 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
提供 window of 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
这也会计算重叠范围,您可以忽略它。
添加一个新列,使现有数据成为 "month ID",其值例如 (year - 2000)*12 + (month - 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
我想使用 Pandas 来计算数据集中三个不同月份的三个值的平均值,该数据集在三个不同的列中列出了年、月和感兴趣的值。通常,我只会使用 pandas.loc 和 isin() 以及 panads.groupby 函数来执行此操作,但我要分析的季节之一是 12 月-1 月-2 月,这将跨越两个不同年份的数据(即 2000 年 12 月、2001 年 1 月、2001 年 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
(即在这种情况下,2000 年 1 月和 2 月将被忽略,平均值为 MAM:9,JJA:10,SON:7.33,DJF:4)
我想你要找的是 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
提供 window of 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
这也会计算重叠范围,您可以忽略它。
添加一个新列,使现有数据成为 "month ID",其值例如 (year - 2000)*12 + (month - 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