如何使用Python中的lowess平滑年数据时间序列

我有一些按年记录的数据如下所示。

mydata = [0.6619346141815186, 0.7170140147209167, 0.692265510559082, 0.6394098401069641, 0.6030995845794678, 0.6500746607780457, 0.6013327240943909, 0.6273292303085327, 0.5865356922149658, 0.6477396488189697, 0.5827181339263916, 0.6496025323867798, 0.6589270234107971, 0.5498126149177551, 0.48638370633125305, 0.5367399454116821, 0.517595648765564, 0.5171639919281006, 0.47503289580345154, 0.6081966757774353, 0.5808742046356201, 0.5856912136077881, 0.5608134269714355, 0.6400936841964722, 0.6766082644462585]corresponding_year = [1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994]]

我使用statsmodels Python包计算lowess,如下所示。

import statsmodels.api as smlowess = sm.nonparametric.lowessz = lowess(x, y, frac= 1./3, it=3)

我得到的输出如下所示。

      [[1.96000000e+03, 6.95703548e-01],       [1.96100000e+03, 6.81750671e-01],       [1.96200000e+03, 6.68002318e-01],       [1.96300000e+03, 6.55138324e-01],       [1.96400000e+03, 6.38960761e-01],       [1.96500000e+03, 6.25042177e-01],       [1.96600000e+03, 6.18586936e-01],       [1.96700000e+03, 6.17026334e-01],       [1.96800000e+03, 6.14565102e-01],       [1.96900000e+03, 6.17610340e-01],       [1.97000000e+03, 6.20404414e-01],       [1.97100000e+03, 6.10193222e-01],       [1.97200000e+03, 5.90100648e-01],       [1.97300000e+03, 5.70935248e-01],       [1.97400000e+03, 5.47818726e-01],       [1.97500000e+03, 5.25788570e-01],       [1.97600000e+03, 5.18661218e-01],       [1.97700000e+03, 5.28921300e-01],       [1.97800000e+03, 5.42783400e-01],       [1.97900000e+03, 5.55425915e-01],       [1.98000000e+03, 5.71486587e-01],       [1.98100000e+03, 5.91539778e-01],       [1.98200000e+03, 6.13021691e-01],       [1.98300000e+03, 6.34508409e-01],       [1.98400000e+03, 6.57703989e-01]]

然而,我不清楚在statsmodel中我得到的两个值是什么。我是否做错了什么?此外,我还想知道fracit这两个参数的作用是什么?

此外,我还想使用seaborn绘制平滑的时间序列。看起来seaborn支持lowess。然而,它没有fracit参数。请看下面的代码。

import numpy as npimport seaborn as snsx = np.arange(0, 10, 0.01)ytrue = np.exp(-x / 5) + 2 * np.sin(x / 3)y = ytrue + np.random.normal(size=len(x))sns.regplot(x, y, lowess=True)

在这种情况下,是否可以使用statmodels的输出在seaborn中绘制regplot

如果需要,我很乐意提供更多细节。


回答:

lowess的结果可以如以下代码所示绘制。请注意,lowess()的第一个参数是y值(endog),第二个是xexog)。默认结果中,z[:,0]是排序后的x值,z[:,1]是相应的估计y值。

import matplotlib.pyplot as pltimport statsmodels.api as smimport numpy as npmydata = [0.6619346141815186, 0.7170140147209167, 0.692265510559082, 0.6394098401069641, 0.6030995845794678, 0.6500746607780457, 0.6013327240943909, 0.6273292303085327, 0.5865356922149658, 0.6477396488189697, 0.5827181339263916, 0.6496025323867798, 0.6589270234107971, 0.5498126149177551, 0.48638370633125305, 0.5367399454116821, 0.517595648765564, 0.5171639919281006, 0.47503289580345154, 0.6081966757774353, 0.5808742046356201, 0.5856912136077881, 0.5608134269714355, 0.6400936841964722, 0.6766082644462585]corresponding_year = [1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994]x = np.array(corresponding_year)y = np.array(mydata)z = sm.nonparametric.lowess(y, x, frac= 1./3, it=3)plt.plot(x, y, color='dodgerblue')plt.plot(z[:,0], z[:,1], 'ro-')plt.show()

结果图

附注:要在同一张图上与seaborn的regplot进行比较,请按以下方式调用它:

sns.regplot(x, y, lowess=True, ax=plt.gca())

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注