首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从时间序列生成滚动平均值,但基于月份进行子选

从时间序列生成滚动平均值,但基于月份进行子选
EN

Stack Overflow用户
提问于 2019-03-06 21:22:25
回答 1查看 38关注 0票数 0

我有很长一段时间序列的每周数据。对于给定的观察值,我想计算该周的值与前三年同月平均值的平均值。

具体示例:对于2019-02-15数据点,我想将其与所有2018年2月、2017年2月和2016年2月数据点的平均值进行比较。

我想以这种方式填充整个时间序列。(前三年当然是np.nans )

我为我想做的计算做了一个非常粗略的单数据点示例,但我不确定如何在矢量化解决方案中实现它。我也没有印象深刻,我必须使用这个中间助手表"mth_avg“。

代码语言:javascript
复制
import pandas as pd
ix = pd.date_range(freq='W-FRI',start="20100101", end='20190301' )
df  = pd.DataFrame({"foo": [x for x in range(len(ix))]}, index=ix) #weekly data
mth_avg = df.resample("M").mean() #data as a monthly average over time
mth_avg['month_hack'] = mth_avg.index.month

#average of previous three years' same-month averages
df['avg_prev_3_year_same-month'] = "?"

#single arbitrary example of my intention
df.loc['2019-02-15', "avg_prev_3_year_same-month"]= (
    mth_avg[mth_avg.month_hack==2]
                    .loc[:'2019-02-15']
                    .iloc[-3:]
                    .loc[:,'foo']
                    .mean() 
                    )


df[-5:]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-06 23:07:58

我认为这实际上是一个不平凡的问题--据我所知,Pandas没有现有的功能来解决这个问题。做一个帮助表可以节省计算时间,实际上我用了两个。我的解决方案使用循环(即列表理解)和Pandas日期时间感知来避免您的month_hack。除此之外,我认为这是一个很好的开始。会很高兴看到更优雅的东西!

代码语言:javascript
复制
# your code
ix = pd.date_range(freq='W-FRI',start="20100101", end='20190301' )
df  = pd.DataFrame({"foo": [x for x in range(len(ix))]}, index=ix)
mth_avg = df.resample("M").mean()

# use multi-index of month/year with month first
mth_avg.index = [mth_avg.index.month, mth_avg.index.year]
tmp = mth_avg.sort_index().groupby(level=0).rolling(3).foo.mean()
tmp.index = tmp.index.droplevel(0)

# get rolling value from tmp
res = [tmp.xs((i.month, i.year - 1)) for i in df[df.index > '2010-12-31'].index]

# NaNs for 2010
df['avg_prev_3_year_same-month'] = np.NaN
df.loc[df.index > '2010-12-31', 'avg_prev_3_year_same-month'] = res

# output
df.sort_index(ascending=False).head()

            foo     avg_prev_3_year_same-month
2019-03-01  478     375.833333
2019-02-22  477     371.500000
2019-02-15  476     371.500000
2019-02-08  475     371.500000
2019-02-01  474     371.500000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55024146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档