如何对时间序列分析中的不规则采样数据进行聚合



我试图用时间序列分析预测每日利润,但每日利润不仅记录不均匀,而且一些数据缺失。

原始数据:

<表类> 日期收入tbody><<tr>2020/1/1910 $2020/1/207 $2020/1/2514美元2020/1/2918美元2020/2/112 $2020/2/217 $2020/2/928 $

最简单的方法是使用pandas的resample函数。

如果你有一个类型为Datetime的指数,每6天重新采样总利润将像your_dataframe.resample('6D').sum()一样简单

您可以进行各种重采样(月末、季度末、周初、每小时、每分钟、每秒钟……)。如果您感兴趣,请查看完整的文档:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.resample.html?highlight=resample#pandas.DataFrame.resample

我建议使用.rollingpd.date_range.reindex的组合

说你的DataFramedf,有适当的日期时间索引:

df = pd.DataFrame([['2020/1/19',10],
['2020/1/20',7],
['2020/1/25',14],
['2020/1/29',18],
['2020/2/1',12],
['2020/2/2',17],
['2020/2/9',28]],columns=['Date','Revenue'])
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date',inplace=True)

第一步是用虚拟的、零收入来"填补"缺失的日子。我们可以使用pd.date_range来获得一个具有从2020/1/16到2020/2/8等间隔日期的索引,然后使用.reindex将其带入主dfDataFrame:

evenly_spaced_idx = pd.date_range(start='2020/1/16',end='2020/2/8',freq='1d')
df = df.reindex(evenly_spaced_idx, fill_value=0)

现在我们可以按每6天的周期滚动求和。我们对每天6天的总收益不感兴趣,只对每6天的总收益感兴趣。

summary_df = df.rolling('6d').sum().iloc[5::6, :]

summary_df的最后一件事就是按照你喜欢的方式格式化它,这样它就能清楚地说明每行所指的日期范围。

summary_df['Start Date'] = summary_df.index-pd.Timedelta('6d')
summary_df['End Date'] = summary_df.index
summary_df.reset_index(drop=True,inplace=True)

您可以使用resample

一定要有"日期"列作为日期时间类型。

>>> df = pd.DataFrame([["2020/1/19"  ,10],
... ["2020/1/20"  ,7],
... ["2020/1/25"  ,14],
... ["2020/1/29"  ,18],
... ["2020/2/1"  ,12],
... ["2020/2/2"  ,17],
... ["2020/2/9"  ,28]], columns=['Date', 'Revenue'])
>>> df['Date'] = pd.to_datetime(df.Date)

For pandas <1.1.0

>>> df.set_index('Date').resample('6D', base=3).sum()
Revenue
Date
2020-01-16       17
2020-01-22       14
2020-01-28       47
2020-02-03        0
2020-02-09       28

For pandas>= 1.1.0

>>> df.set_index('Date').resample('6D', origin='2020-01-16').sum()
Revenue
Date
2020-01-16       17
2020-01-22       14
2020-01-28       47
2020-02-03        0
2020-02-09       28

最新更新