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

Python 如何为时间序列分析聚合不规则采样数据,python,pandas,dataframe,time-series,data-science,Python,Pandas,Dataframe,Time Series,Data Science,我试图使用时间序列分析预测每日利润,但每日利润不仅记录不均,而且缺少一些数据 原始数据: 日期 收入 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$ 我建议使用、和的组合 假设您的DataFrame是df,具有正确的日期时间索引: df = pd.DataFrame([['2020/1/19',10], ['2020/1

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

原始数据:

日期 收入 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$
我建议使用、和的组合

假设您的
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\u range
获得一个索引,该索引包含从2020/1/16到2020/2/8的等距日期,然后
.reindex
将其放入主
df
数据框中:

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天的周期取一个滚动总和。我们对每天六天的总收入不感兴趣,只对每六天的总收入感兴趣,不过:

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)

我建议使用、和的组合

假设您的
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\u range
获得一个索引,该索引包含从2020/1/16到2020/2/8的等距日期,然后
.reindex
将其放入主
df
数据框中:

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天的周期取一个滚动总和。我们对每天六天的总收入不感兴趣,只对每六天的总收入感兴趣,不过:

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天对总利润进行重新采样就像
您的数据帧一样简单。重新采样('6D').sum()


您可以进行各种重采样(月末、季度末、周初、每小时、每分钟、每秒钟……)。如果您感兴趣,请查看完整文档:

最简单的方法是使用pandas
重采样功能

如果您有一个类型为
Datetime
的索引,那么每6天对总利润进行重新采样就像
您的数据帧一样简单。重新采样('6D').sum()


您可以进行各种重采样(月末、季度末、周初、每小时、每分钟、每秒钟……)。如果您感兴趣,请查看完整文档:

您可以为此使用
重采样

确保“日期”列为datetime类型

>>> 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)
对于小于1.1.0的熊猫

对于熊猫>=1.1.0


您可以为此使用
重采样

确保“日期”列为datetime类型

>>> 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)
对于小于1.1.0的熊猫

对于熊猫>=1.1.0