时间序列数据Python的最低平滑度

时间:2018-12-11 11:36:59

标签: python time-series smoothing

我正在尝试使用LOWESS平滑以下数据:

https://i.stack.imgur.com/T7bKq.png

我想获得一条平滑的线,以过滤掉数据中的尖峰。我的代码如下:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import HourLocator, DayLocator, DateFormatter
from statsmodels.nonparametric.smoothers_lowess import lowess

file = r'C:...'
df = pd.read_csv(file) # reads data file   

df['Date'] = pd.to_datetime(df['Time Local'], format='%d/%m/%Y  %H:%M')     

x = df['Date']  
y1 = df['CTk2 Level'] 

filtered = lowess(y1, x, is_sorted=True, frac=0.025, it=0)

plt.plot(x, y1, 'r')
plt.plot(filtered[:,0], filtered[:,1], 'b')

plt.show()

运行此代码时,出现以下错误:

  

ValueError:最小查看限制-7.641460199922635e + 16小于1,并且是无效的Matplotlib日期值。如果您将非datetime值传递给具有datetime单位的轴,通常会发生这种情况

我的数据中的日期格式为2018年7月5日00:07:00。我认为问题在于LOWESS难以处理日期时间数据,但不确定吗?

能帮我吗?

1 个答案:

答案 0 :(得分:0)

Lowess不尊重DateTimeIndex类型,而只是将日期返回为自纪元以来的十亿分之一秒。幸运的是,转换回来很容易:

smoothedx, smoothedy = lowess(y1, x, is_sorted=True, frac=0.025, it=0)
smoothedx = smoothedx.astype('datetime64[s]')