连接和排序季节性时间序列的有效方法?

时间:2018-08-17 19:04:21

标签: python pandas numpy time-series

我有许多numpy数组,每个数组代表一系列季节性数据。频率是一年。

  • 第一个数组具有一年中第一周的所有销售额, 从2014年到2018年。

  • 第二个数组具有一年中第二个星期的所有销售额, 从2014年到2018年。

  • ...
  • 第52个数组具有一年中第52周的所有销售额, 从2014年到2018年。

以下示例有些棘手,因为不能严格通过计算“一年中的一周”和滑动来获得它们。而是根据相对于时间开始的一周的相对索引的剩余部分52来选择它们。但是想法很相似...

它们看起来像这样。

arr1 = array([[Timestamp('2014-01-04 00:00:00'), 138.52],
   [Timestamp('2015-01-03 00:00:00'), 25476.179999999997],
   [Timestamp('2016-01-02 00:00:00'), 87318.65000000001],
   [Timestamp('2016-12-31 00:00:00'), 194409.42],
   [Timestamp('2017-12-30 00:00:00'), 299190.06000000023]], dtype=object)

arr2 = array([[Timestamp('2014-01-11 00:00:00'), 0.0],
   [Timestamp('2015-01-10 00:00:00'), 23848.57000000001],
   [Timestamp('2016-01-09 00:00:00'), 86814.12],
   [Timestamp('2017-01-07 00:00:00'), 202016.92],
   [Timestamp('2018-01-06 00:00:00'), 344430.36000000004]], dtype=object)

现在,我想将它们加入一个完整且经过排序的时间序列中。

  • 因此索引将为[arr1.index[0], arr2.index[0], arr3.index[0], ... arr52.index[0], (here we begin a new year) arr1.index[1], arr2.index[1], ...]
  • 值将为[arr1.value[0], arr2.value[0], arr3.value[0], ... arr52.value[0], (here we begin a new year) arr1.value[1], arr2.value[1], ...]

我能想到的一种方法是先将所有子系列连接为完整的系列,然后按索引对系列进行排序。

但是有更好的方法吗?

谢谢!

背景 当我尝试在Python中实现stl分解时出现问题,第一步是独立平滑每个季节性子序列,然后将它们组合在一起。

1 个答案:

答案 0 :(得分:0)

我有个主意。假设我们已经准备好所有子系列了。

  1. 首先垂直堆叠所有子系列。
  2. 然后遍历每一列,并将它们依次连接起来。

因此,由于子系列的结构,我们避免了排序。

示例:

>> s1 
array([Timestamp('2013-12-28 00:00:00'), Timestamp('2014-12-27 00:00:00'),
       Timestamp('2015-12-26 00:00:00'), Timestamp('2016-12-24 00:00:00'),
       Timestamp('2017-12-23 00:00:00')], dtype=object)

>> s2
array([Timestamp('2014-01-04 00:00:00'), Timestamp('2015-01-03 00:00:00'),
       Timestamp('2016-01-02 00:00:00'), Timestamp('2016-12-31 00:00:00'),
       Timestamp('2017-12-30 00:00:00')], dtype=object)

>> np.vstack([s1, s2]).T.reshape([1, -1], order = 'c')[0]
array([Timestamp('2013-12-28 00:00:00'), Timestamp('2014-01-04 00:00:00'),
       Timestamp('2014-12-27 00:00:00'), Timestamp('2015-01-03 00:00:00'),
       Timestamp('2015-12-26 00:00:00'), Timestamp('2016-01-02 00:00:00'),
       Timestamp('2016-12-24 00:00:00'), Timestamp('2016-12-31 00:00:00'),
       Timestamp('2017-12-23 00:00:00'), Timestamp('2017-12-30 00:00:00')], dtype=object)