升采样
时间序列数据在降采样时,总体的数据量是减少的,只需要从高频向低频转换时,应用聚合函数即可。与降采样不同,升采样的时间颗粒是变小的,比如按周统计的数据要变成按天统计,数据量会增多,这很有可能导致某些时间戳没有相应的数据。
接下来,我们创建一个时间序列类型的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