如何聚合时间序列分析的不规则采样数据
How to aggregate irregularly sampled data for Time Series Analysis
我正在尝试使用时间序列分析来预测每日利润,但是每日利润不仅记录不均匀,而且还缺少一些数据。
原始数据:
Date
Revenue
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$
上面的table是我有什么样的数据的例子。利润不是每天记录的,因此不存在 2020/1/20 和 2020/1/24 之间的日期。不仅如此,假设在 2020/2/3 和 2020/3/8 期间记录的利润在数据库中丢失了。我想恢复这个丢失的数据,用时间序列分析来预测2020/2/9以后的利润~。
我的方法是先每 6 天汇总一次利润,因为我必须在 2020/2/3 和 2020/3/8 之间收回利润。所以我清理过的数据看起来像这样
Date
Revenue
2020/1/16 ~ 2020/1/21
17$
2020/1/22 ~ 2020/1/27
14$
2020/1/28 ~ 2020/2/2
47$
2020/2/3 ~ 2020/2/8
? (to predict)
将其应用到时间序列模型后,我想进一步预测2020/2/9~之后的利润。
这是我的总体想法,但作为 Python 的初学者,使用 pandas 库,我很难执行我的想法。请问如何汇总每6天的利润,让数据看起来像上面的那样table?
我建议使用 .rolling
, pd.date_range
, and .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)
第一步是 'fill in' 使用虚拟零收入的缺失天数。我们可以使用 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 天感兴趣:
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)
最简单的方法是使用 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
您可以为此使用 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)
对于 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
对于 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
我正在尝试使用时间序列分析来预测每日利润,但是每日利润不仅记录不均匀,而且还缺少一些数据。
原始数据:
Date | Revenue |
---|---|
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$ |
上面的table是我有什么样的数据的例子。利润不是每天记录的,因此不存在 2020/1/20 和 2020/1/24 之间的日期。不仅如此,假设在 2020/2/3 和 2020/3/8 期间记录的利润在数据库中丢失了。我想恢复这个丢失的数据,用时间序列分析来预测2020/2/9以后的利润~。
我的方法是先每 6 天汇总一次利润,因为我必须在 2020/2/3 和 2020/3/8 之间收回利润。所以我清理过的数据看起来像这样
Date | Revenue |
---|---|
2020/1/16 ~ 2020/1/21 | 17$ |
2020/1/22 ~ 2020/1/27 | 14$ |
2020/1/28 ~ 2020/2/2 | 47$ |
2020/2/3 ~ 2020/2/8 | ? (to predict) |
将其应用到时间序列模型后,我想进一步预测2020/2/9~之后的利润。 这是我的总体想法,但作为 Python 的初学者,使用 pandas 库,我很难执行我的想法。请问如何汇总每6天的利润,让数据看起来像上面的那样table?
我建议使用 .rolling
, pd.date_range
, and .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)
第一步是 'fill in' 使用虚拟零收入的缺失天数。我们可以使用 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 天感兴趣:
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)
最简单的方法是使用 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
您可以为此使用 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)
对于 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
对于 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