Python 用';固定点';
我有周期性(相当于正弦)的时间序列数据。我根据周期对数据进行了相位调整,以便所有点都位于0和1之间。您可以将其视为从0到其周期2pi的正弦波采样点。这里有一个典型的例子: 我已尝试使用各种Python 用';固定点';,python,scipy,time-series,spline,interpolation,Python,Scipy,Time Series,Spline,Interpolation,我有周期性(相当于正弦)的时间序列数据。我根据周期对数据进行了相位调整,以便所有点都位于0和1之间。您可以将其视为从0到其周期2pi的正弦波采样点。这里有一个典型的例子: 我已尝试使用各种scipy.interpolate函数对该数据进行插值,例如: >>> scipy.interpolate.UnivariateSpline(x,y)(numpy.linspace(0, 0.99, 100)) array([ 15.13403109, 15.10173144, 15.0
scipy.interpolate
函数对该数据进行插值,例如:
>>> scipy.interpolate.UnivariateSpline(x,y)(numpy.linspace(0, 0.99, 100))
array([ 15.13403109, 15.10173144, 15.07070986, 15.04094629,
15.01242068, 14.98511296, 14.95900308, 14.93407098,
14.91029659, 14.88765987, 14.86614074, 14.84571915,
14.82637504, 14.80808836, 14.79083904, 14.77460702,
14.75937224, 14.74511465, 14.73181418, 14.71945078,
14.70800439, 14.69745494, 14.68778239, 14.67896666,
14.6709877 , 14.66382545, 14.65745985, 14.65187085,
14.64703838, 14.64294238, 14.6395628 , 14.63687957,
14.63487264, 14.63352194, 14.63280742, 14.63270902,
14.63320668, 14.63428034, 14.63590994, 14.63807542,
14.64075672, 14.64393378, 14.64758655, 14.65169496,
14.65623896, 14.66119848, 14.66655347, 14.67228387,
14.67836961, 14.68479064, 14.69152691, 14.69855834,
14.70586488, 14.71342648, 14.72122306, 14.72923458,
14.73744098, 14.74582219, 14.75435815, 14.76302882,
14.77181411, 14.78069399, 14.78964838, 14.79865724,
14.80770049, 14.81675809, 14.82580996, 14.83483606,
14.84381632, 14.85273069, 14.8615591 , 14.87028149,
14.87887781, 14.887328 , 14.895612 , 14.90370974,
14.91160117, 14.91926624, 14.92668487, 14.93383702,
14.94070261, 14.9472616 , 14.95349392, 14.95937952,
14.96489834, 14.9700303 , 14.97475537, 14.97905347,
14.98290455, 14.98628855, 14.98918541, 14.99157507,
14.99343747, 14.99475255, 14.99550026, 14.99566053,
14.9952133 , 14.99413852, 14.99241612, 14.99002605])
例如,x为(请注意,某些值重复):
例如,y是:
>>> y
array([ 15.048, 15.046, 15.046, 15.037, 15.035, 15.048, 15.034,
15.041, 15.03 , 15.034, 15.037, 15.04 , 15.038, 15.028,
14.998, 14.976, 15.012, 15.007, 14.996, 14.979, 14.922,
14.876, 14.881, 14.931, 14.912, 14.904, 14.906, 14.897,
14.871, 14.786, 14.778, 14.78 , 14.782, 14.788, 14.729,
14.735, 14.661, 14.722, 14.668, 14.657, 14.715, 14.647,
14.607, 14.627, 14.607, 14.625, 14.619, 14.592, 14.583,
14.596, 14.596, 14.595, 14.584, 14.593, 14.601, 14.597,
14.605, 14.596, 14.61 , 14.6 , 14.582, 14.609, 14.606,
14.619, 14.601, 14.612, 14.619, 14.612, 14.612, 14.618,
14.619, 14.62 , 14.62 , 14.619, 14.633, 14.629, 14.611,
14.62 , 14.629, 14.618, 14.645, 14.634, 14.633, 14.644,
14.647, 14.649, 14.67 , 14.661, 14.658, 14.67 , 14.667,
14.682, 14.676, 14.675, 14.68 , 14.67 , 14.673, 14.676,
14.68 , 14.654, 14.689, 14.699, 14.694, 14.691, 14.699,
14.703, 14.683, 14.691, 14.706, 14.703, 14.715, 14.73 ,
14.727, 14.72 , 14.729, 14.718, 14.712, 14.721, 14.734,
14.722, 14.738, 14.724, 14.73 , 14.729, 14.735, 14.751,
14.741, 14.752, 14.753, 14.765, 14.758, 14.759, 14.766,
14.766, 14.774, 14.774, 14.768, 14.775, 14.789, 14.788,
14.793, 14.787, 14.783, 14.808, 14.789, 14.793, 14.804,
14.804, 14.793, 14.805, 14.808, 14.811, 14.825, 14.816,
14.827, 14.827, 14.827, 14.838, 14.83 , 14.839, 14.848,
14.844, 14.834, 14.838, 14.845, 14.861, 14.856, 14.847,
14.853, 14.868, 14.845, 14.857, 14.859, 14.859, 14.868,
14.853, 14.871, 14.873, 14.875, 14.893, 14.882, 14.883,
14.884, 14.899, 14.904, 14.907, 14.909, 14.903, 14.909,
14.909, 14.91 , 14.911, 14.904, 14.909, 14.933, 14.923,
14.924, 14.907, 14.928, 14.913, 14.939, 14.944, 14.946,
14.952, 14.935, 14.946, 14.943, 14.948, 14.952, 14.957,
14.974, 14.981, 14.967, 14.967, 14.977, 14.987, 14.97 ,
15.013, 14.98 , 15.011, 15.004, 15.013, 15. , 15.017,
15.02 , 15.047, 15.03 , 15.05 , 15.029, 15.043, 15.038,
15.03 , 15.042, 15.052])
函数在0处的计算结果应该(几乎)与1相同,因为基础数据是周期性的(就像我们期望插值正弦的函数在0处的值与在2pi处的值相同)。然而,它显然有很长的左偏,与0附近的数据不太相似。0和1处的值之间的差值约为0.144,大于数据集的标准偏差
有什么想法吗?我可以在设置固定点时进行某种插值吗,即边界的起点和终点应该大致相同的规范?splrep/
splev
对函数声称支持周期样条曲线,c.f.per
参数
它在单变量PLINE中不可用是一个错误。这是一个最小的实现(但最好不要使用它,因为访问\u数据
可能不向后兼容):
您可以尝试
单变量样条线(相位,磁位,s=0)
以确保获得无平滑的纯插值。沃伦:不幸的是,这对我不起作用。生成的样条曲线在所有输入上返回“nan”。事实上,scipy.interpolate.InterpolatedUnivariateSpline给出了同样的不幸结果。您解决了吗?我也有类似的问题,我想知道numpy.polyfit是否也适合你。。。它使用n次曲线工作,但也许你可以用第三或第四个多项式来近似你的正弦函数。是的,我最终使用了numpy.polyfit。我不能让它对我工作。你能解释一下如何使用它吗?当我仅用x和y的参数调用它时,会得到一系列错误,结果样条曲线对所有输入返回0。另外,当我试图用数据调用splrep时,我得到ValueError:输入数据错误。有什么想法吗?你认为重复一些X值重要吗?换句话说,数据中有多个具有相同X坐标的点。例如,(0.102,14.996)和(0.102,14.979)都在数据中。对于重复的点,我会收到一条错误消息:以下条件必须保持不变:xbI将其更改为不存在重复点。但是,当在0和1之间求值时,得到的样条曲线给出了无意义的答案。结果似乎在-5000和5000之间随机变化,没有明显的模式。这是我试过的文件:,你还有什么想法吗?(再次感谢您的帮助)您的观察结果对我来说太吵了,无法进行插值。当s=0.1时,我得到了一条带有pus_点[0],pus_点[-1](14.867401700528857,14.868547533207527)的参差不齐的正弦曲线。感谢pv的配方,我不知道scipy中的样条曲线有一个周期选项。
>>> y
array([ 15.048, 15.046, 15.046, 15.037, 15.035, 15.048, 15.034,
15.041, 15.03 , 15.034, 15.037, 15.04 , 15.038, 15.028,
14.998, 14.976, 15.012, 15.007, 14.996, 14.979, 14.922,
14.876, 14.881, 14.931, 14.912, 14.904, 14.906, 14.897,
14.871, 14.786, 14.778, 14.78 , 14.782, 14.788, 14.729,
14.735, 14.661, 14.722, 14.668, 14.657, 14.715, 14.647,
14.607, 14.627, 14.607, 14.625, 14.619, 14.592, 14.583,
14.596, 14.596, 14.595, 14.584, 14.593, 14.601, 14.597,
14.605, 14.596, 14.61 , 14.6 , 14.582, 14.609, 14.606,
14.619, 14.601, 14.612, 14.619, 14.612, 14.612, 14.618,
14.619, 14.62 , 14.62 , 14.619, 14.633, 14.629, 14.611,
14.62 , 14.629, 14.618, 14.645, 14.634, 14.633, 14.644,
14.647, 14.649, 14.67 , 14.661, 14.658, 14.67 , 14.667,
14.682, 14.676, 14.675, 14.68 , 14.67 , 14.673, 14.676,
14.68 , 14.654, 14.689, 14.699, 14.694, 14.691, 14.699,
14.703, 14.683, 14.691, 14.706, 14.703, 14.715, 14.73 ,
14.727, 14.72 , 14.729, 14.718, 14.712, 14.721, 14.734,
14.722, 14.738, 14.724, 14.73 , 14.729, 14.735, 14.751,
14.741, 14.752, 14.753, 14.765, 14.758, 14.759, 14.766,
14.766, 14.774, 14.774, 14.768, 14.775, 14.789, 14.788,
14.793, 14.787, 14.783, 14.808, 14.789, 14.793, 14.804,
14.804, 14.793, 14.805, 14.808, 14.811, 14.825, 14.816,
14.827, 14.827, 14.827, 14.838, 14.83 , 14.839, 14.848,
14.844, 14.834, 14.838, 14.845, 14.861, 14.856, 14.847,
14.853, 14.868, 14.845, 14.857, 14.859, 14.859, 14.868,
14.853, 14.871, 14.873, 14.875, 14.893, 14.882, 14.883,
14.884, 14.899, 14.904, 14.907, 14.909, 14.903, 14.909,
14.909, 14.91 , 14.911, 14.904, 14.909, 14.933, 14.923,
14.924, 14.907, 14.928, 14.913, 14.939, 14.944, 14.946,
14.952, 14.935, 14.946, 14.943, 14.948, 14.952, 14.957,
14.974, 14.981, 14.967, 14.967, 14.977, 14.987, 14.97 ,
15.013, 14.98 , 15.011, 15.004, 15.013, 15. , 15.017,
15.02 , 15.047, 15.03 , 15.05 , 15.029, 15.043, 15.038,
15.03 , 15.042, 15.052])
from scipy.interpolate import UnivariateSpline, splrep
class PeriodicUnivariateSpline(UnivariateSpline):
def __init__(self, x, y, w=None, bbox=[None]*2, k=3, s=0):
#_data == x,y,w,xb,xe,k,s,n,t,c,fp,fpint,nrdata,ier
tck, fp, ier, msg = splrep(x, y, k=k, w=w, xb=bbox[0], xe=bbox[1],
s=s, per=1, full_output=1)
self._data = (x,y,w,bbox[0],bbox[1],k,s,len(tck[0]),tck[0],tck[1],
fp,None,None,ier)
self._reset_class()