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

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

的组合

假设您的 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)

第一步是 '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