【发布时间】:2018-07-12 23:20:52
【问题描述】:
我有以下一组数据 (pandas.DataFrame),我想使用 scipy.interpolate.UnivariateSpline 来拟合。我们称数据为data。
Date
2018-04-02 09:00:00 16249
2018-04-02 10:00:00 45473
2018-04-02 11:00:00 32050
2018-04-02 12:00:00 35898
2018-04-02 13:00:00 21577
2018-04-02 14:00:00 30545
2018-04-02 15:00:00 60925
2018-04-02 16:00:00 47124
2018-04-03 09:00:00 18534
2018-04-03 10:00:00 36064
2018-04-03 11:00:00 32387
2018-04-03 12:00:00 15903
2018-04-03 13:00:00 22291
2018-04-03 14:00:00 26367
2018-04-03 15:00:00 66269
2018-04-03 16:00:00 38478
2018-04-04 09:00:00 15803
2018-04-04 10:00:00 22511
2018-04-04 11:00:00 33123
2018-04-04 12:00:00 21000
2018-04-04 13:00:00 23132
2018-04-04 14:00:00 39270
2018-04-04 15:00:00 102544
2018-04-04 16:00:00 143421
2018-04-04 17:00:00 200
2018-04-05 09:00:00 23377
2018-04-05 10:00:00 52089
2018-04-05 11:00:00 99298
2018-04-05 12:00:00 24627
2018-04-05 13:00:00 33467
2018-04-05 14:00:00 26498
2018-04-05 15:00:00 114794
2018-04-05 16:00:00 44904
2018-04-06 09:00:00 12180
2018-04-06 10:00:00 41658
2018-04-06 11:00:00 64066
2018-04-06 12:00:00 12517
2018-04-06 13:00:00 12610
2018-04-06 14:00:00 43544
2018-04-06 15:00:00 65533
2018-04-06 16:00:00 123885
2018-04-09 09:00:00 13425
2018-04-09 10:00:00 38354
2018-04-09 11:00:00 59491
2018-04-09 12:00:00 21402
2018-04-09 13:00:00 24550
2018-04-09 14:00:00 25189
2018-04-09 15:00:00 67751
2018-04-09 16:00:00 16071
2018-04-10 09:00:00 35587
2018-04-10 10:00:00 58667
2018-04-10 11:00:00 41831
2018-04-10 12:00:00 35196
2018-04-10 13:00:00 22611
2018-04-10 14:00:00 23070
2018-04-10 15:00:00 40819
2018-04-10 16:00:00 20337
2018-04-11 09:00:00 7962
2018-04-11 10:00:00 23982
2018-04-11 11:00:00 21794
2018-04-11 12:00:00 16835
2018-04-11 13:00:00 16821
2018-04-11 14:00:00 13270
2018-04-11 15:00:00 34954
2018-04-11 16:00:00 15772
2018-04-12 09:00:00 8587
2018-04-12 10:00:00 47950
2018-04-12 11:00:00 24742
2018-04-12 12:00:00 16743
2018-04-12 13:00:00 21917
2018-04-12 14:00:00 43272
2018-04-12 15:00:00 50630
2018-04-12 16:00:00 104656
2018-04-13 09:00:00 15282
2018-04-13 10:00:00 30304
2018-04-13 11:00:00 65737
2018-04-13 12:00:00 17467
2018-04-13 13:00:00 10439
2018-04-13 14:00:00 19836
2018-04-13 15:00:00 52051
2018-04-13 16:00:00 99462
到目前为止我所做的是:
import matplotlib.pyplot as plt
import numpy as np
import scipy.interpolate as interp
x = [i for i in range(1, data.size+1)] # this gives x as an array from 1 to 82.
spl = interp.UnivariateSpline(x, data.values, s=0.5)
xx = np.linspace(min(x), max(x), 1000) # 1000 is an arbitrary number here.
plt.plot(x, data.values, 'bo')
plt.plot(xx, spl(xx), 'r')
plt.show()
# the plot is below and it seems to be very linear and does not look like a cubic spline at all. Cubic Spline is the default.
当我对x运行spl时,其他保持不变,即:
plt.plot(x, spl(x), 'r')
我得到以下信息:
唯一不同的是 y 轴最高为 14,000,这似乎意味着之前的图显示了某种程度的曲率。 (或者没有?)
我不确定我在这里错过了什么,但我显然错过了一些东西。我对spline 仍然很陌生,通常适合 python。
你能告诉我如何正确地拟合上面的时间序列吗?
编辑
根据您的评论,我想添加另一个情节,希望能更好地解释自己。我并不是说它是线性的,但我找不到更好的词。为了说明,
xxx = [10,20,40,60,80]
plt(x, data.values, 'bo')
plt(xx, sp(xx), 'r')
plt.show()
我认为下面的情节在我的意义上看起来相当线性。我猜,可能我的问题应该是,scipy.UnivariateSpline 到底是如何工作的?
它是否只显示在我们提供的点处评估的值的图(例如,对于这个图,它是xxx)?
我期待一个更平滑的情节,并展示出不错的曲率。 this 问题的答案显示了我期望的情节;它看起来更像是一个分段三次函数会生成的图,而我的看起来,对我来说,与那个图相比,它是线性的(或者如果更合适的话,它是一阶的。)
【问题讨论】:
-
为什么说情节看起来是线性的?在第一个图中,放大区间 [20
-
样条拟合看起来正确并且执行正确。我不太明白它的问题。所以当你说“我显然错过了什么”时,你是什么意思?情节有什么问题,您希望它看起来如何?
-
@WarrenWeckesser 对不准确之处深表歉意。我并不是真的打算说“线性”。我添加了另一个情节来帮助解释我的问题。
-
@ImportanceOfBeingErnest 感谢您抽出宝贵时间。我可能期待来自
UnivariateSpline的错误信息。我添加了一个链接到一个更像我想要的情节的链接。当我在 r 中使用gam做样条时,我通常使用r作为样条,它看起来正确,也是我所期望的。
标签: python matplotlib scipy spline timeserieschart