将每周时间序列转换为每日(使用比例标准)

Posted

技术标签:

【中文标题】将每周时间序列转换为每日(使用比例标准)【英文标题】:Converting Weekly timeseries into Daily (with a proportion criteria) 【发布时间】:2019-09-17 14:08:26 【问题描述】:

我有一个代表每日产品需求的数据框。 由于该产品的需求不规律,因此先知模型表现不佳,如下图所示:

因此,我转换成每周时间序列,模型拟合得更好。

df.resample('W',how='y': 'sum', 
                loffset=pd.offsets.timedelta(days=-6))

我现在想要做什么:

1 - 再次转换为每日,尊重每周的季节性:

工作日优先:

    星期六 星期二 星期五 星期一 星期四 星期三 星期日

所以,如果我对第一周的预测是需求等于 3,我希望发生这种情况:

    星期六:1 星期二:1 星期五:1 星期一:0 星期四:0 星期三:0 星期日:0

我的意思是,将每周的预测转换为尊重本周的每日订单以分配值:

         ds      y
0   2018-01-07  5.0
1   2018-01-14  5.0
2   2018-01-21  4.0

预期结果:

         ds      y
0   2018-01-01  1
1   2018-01-02  1
2   2018-01-03  0 (Wednesday)
3   2018-01-04  1
4   2018-01-05  1
5   2018-01-06  1
6   2018-01-07  0 (Sunday)

【问题讨论】:

看起来你的预测不都是整数,如果预测等于 4.5 会怎样? 都是整数。第一张照片我先取对数。我将使用正常值更新图像。 现在是正确的。每个黑点都是一个观察值,都是整数。 因此,如果观察值为 8,那么系列将是 2 1 1...? 是的,你是对的。 【参考方案1】:

由于您的数据是按日期索引的,我敢打赌它不会很长。所以我们可以构造一个函数,然后apply

def to_daily(val):
    # order of the day in a week
    order = np.argsort([5, 1, 4, 0, 3, 2, 6])

    b, r = val//7, val%7
    ret = np.array([b+1]*r + [b]*(7-r))

    return ret[order]

to_daily(5)
# array([1, 1, 0, 1, 1, 1, 0])

ret_df  = pd.DataFrame('ds': pd.date_range(df.ds[0]-pd.to_timedelta('6d'),
                                 df.ds.values[-1], freq='d'),
                           'y' : np.array([to_daily(val) 
                                 for val in df.y.astype(int)]).flatten())
ret_df

输出:

    ds                     y
--  -------------------  ---
 0  2018-01-01 00:00:00    1
 1  2018-01-02 00:00:00    1
 2  2018-01-03 00:00:00    0
 3  2018-01-04 00:00:00    1
 4  2018-01-05 00:00:00    1
 5  2018-01-06 00:00:00    1
 6  2018-01-07 00:00:00    0
 7  2018-01-08 00:00:00    1
 8  2018-01-09 00:00:00    1
 9  2018-01-10 00:00:00    0
10  2018-01-11 00:00:00    0
11  2018-01-12 00:00:00    1
12  2018-01-13 00:00:00    1
13  2018-01-14 00:00:00    0
14  2018-01-15 00:00:00    1
15  2018-01-16 00:00:00    1
16  2018-01-17 00:00:00    1
17  2018-01-18 00:00:00    1
18  2018-01-19 00:00:00    1
19  2018-01-20 00:00:00    2
20  2018-01-21 00:00:00    1

【讨论】:

以上是关于将每周时间序列转换为每日(使用比例标准)的主要内容,如果未能解决你的问题,请参考以下文章

通过 Python 中的 pandas 将每日库存数据转换为每周

从每日时间序列转换为每周时间序列时,R apply.weekly() 返回不正确的时间段

将每日股票价格变成每周/每月/每季度/学期/每年?

Mysql 将给定日期范围内的每日总计转化为每周总计

熊猫将每小时时间序列重新采样为每小时比例时间序列

特征缩放以相同比例转换列中的不同值