我有一个带有日期列(每天,从 2000 年到 2023 年)和值列的数据框。 我需要的是提取全年每天的全球平均值和标准差。特殊之处在于我每次都需要将这一天视为3天的滚动周期。因此,如果我想要 1 月 5 日的全局平均值,实际上我需要对 1 月 4、5 和 6 日的所有平均值进行平均值。因此,无法完成简单的 groupby(Day,Month),因为计算 4 和 6 时也需要 1 月 5 日。
最初我只是决定在 365 天中进行循环,计算前一天和后一天,对数据帧进行过滤,并计算平均值/标准差。结果:计算太长了。
也就是说,我很容易找到解决方案:=
df['mean'] = df['Value'].rolling(window=3, min_periods=1, center=True).sum().reset_index(level=0, drop=True)
df['count'] = df['Value'].rolling(window=3, min_periods=1, center=True).count().reset_index(level=0, drop=True)
df_grouped = df.groupby(['Month_Day']).agg({'mean': 'sum', 'count': 'sum'}).reset_index()
df_grouped['avg'] = df_grouped['mean'] / df_grouped['count']
df_grouped = df_grouped.drop(['mean', 'count'], axis=1)
df= pd.merge(test, df_grouped, on=['ADM3_CODE', 'Month_Day'], how='left')
我只是首先用 3 天的滚动周期的所有值的总和重新计算平均值,然后我可以按(日-月)进行分组并正确重新计算平均值。
现在的问题是 std :要做同样的事情,我需要减去之前为 1 月 5 日计算的平均值,但到 4 日和 6 日。然后在滚动周期中,它不仅仅是求和或其他简单的东西,而是我需要减去滚动周期中心的相应均值,做差的平方,然后只求和。
一个简单的例子是:
Date,Value,Avg
2020-01-01,5,5
2020-01-02,6,4
2020-01-03,7,6
2020-01-04,8,3
2020-01-01 :
(5-5)**2 + (6-5)**2 = 1 (here the 5 is from Avg for 2020-01-01)
2020-01-02
(5-4)**2 + (6-4)**2 + (7-4)**2 = 14 (here the 4 is from Avg for 2020-01-02)
一旦完成上面解释的计算,我就可以像平均值一样完成组
我看到你正在使用
.rolling
,这是个好主意。为什么不直接使用.rolling().mean()
,而是用sum
和count
手动计算呢? std 也是如此:你为什么不直接使用 .rolling().std()
?
df['std'] = df['Value'].rolling(window=3, min_periods=1, center=True).std()