Python Dataframe:使用滚动周期的标准

问题描述 投票:0回答:1

我有一个带有日期列(每天,从 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)

一旦完成上面解释的计算,我就可以像平均值一样完成组

python pandas math std
1个回答
0
投票

我看到你正在使用

.rolling
,这是个好主意。为什么不直接使用
.rolling().mean()
,而是用
sum
count
手动计算呢? std 也是如此:你为什么不直接使用
.rolling().std()

df['std'] = df['Value'].rolling(window=3, min_periods=1, center=True).std()
© www.soinside.com 2019 - 2024. All rights reserved.