我试图用时间序列分析预测每日利润,但每日利润不仅记录不均匀,而且一些数据缺失。
原始数据:
最简单的方法是使用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
我建议使用.rolling
、pd.date_range
和.reindex
的组合
说你的DataFrame
是df
,有适当的日期时间索引:
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
将其带入主df
DataFrame
:
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