学科分类
目录
数据分析

升采样

时间序列数据在降采样时,总体的数据量是减少的,只需要从高频向低频转换时,应用聚合函数即可。与降采样不同,升采样的时间颗粒是变小的,比如按周统计的数据要变成按天统计,数据量会增多,这很有可能导致某些时间戳没有相应的数据。

接下来,我们创建一个时间序列类型的DataFrame对象,示例代码如下。

In [49]: data_demo = np.array([['101', '210', '150'], ['330', '460', '580']])
         date_index = pd.date_range('2018/06/10', periods=2, freq='W-SUN')
         time_df = pd.DataFrame(data_demo, index=date_index, 
                                columns=['A产品', 'B产品', 'C产品'])
         time_df

Out[49]:
​       A产品 B产品 C产品
2018-06-10  101  210  150
2018-06-17  330  460  580

上述样本数据是从2018年6月10日开始采集的,每周一统计一次,总共统计了两周。现在有个新的需求,要求重新按天采样,这时需要使用resample() 和asfreq() 两个方法实现,asfreq()方法会将数据转换为指定的频率,示例代码如下。

In [50]: time_df.resample('D').asfreq()
Out[50]:
​      A产品 B产品 C产品
2018-06-10 101  210  150
2018-06-11 NaN  NaN   NaN
2018-06-12 NaN  NaN  NaN
2018-06-13 NaN   NaN  NaN
2018-06-14 NaN  NaN  NaN
2018-06-15 NaN  NaN  NaN
2018-06-16 NaN  NaN  NaN
2018-06-17 330  460  580

上述示例中,通过resample() 和asfreq() 方法将time_df中的数据重新按天采样。从输出结果可以看出,没有指定数据的部分都被填充为NaN值。

遇到这种情况,常用的解决办法就是插值,具体有如下几种方式:

(1) 通过ffill(limit)或bfill(limit)方法,取空值前面或后面的值填充,limit可以限制填充的个数。

(2) 通过fillna(‘ffill’)或fillna(‘bfill’)进行填充,传入ffill则表示用NaN前面的值填充,传入bfill则表示用后面的值填充。

(3) 使用interpolate()方法根据插值算法补全数据。

例如,通过ffill()方法用NaN值前面的值填充,示例代码如下。

In [51]: time_df.resample('D').ffill()
Out[51]:
​      A产品 B产品 C产品
2018-06-10 101  210   150
2018-06-11 101  210  150
2018-06-12 101  210  150
2018-06-13 101  210  150
2018-06-14 101  210  150
2018-06-15 101  210   150
2018-06-16 101  210  150
2018-06-17 330   460  580
点击此处
隐藏目录