Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有一种简单的方法可以在不考虑未来值和时间偏移的情况下平滑曲线?_Python_Pandas_Numpy_Scipy_Smoothing - Fatal编程技术网

Python 有没有一种简单的方法可以在不考虑未来值和时间偏移的情况下平滑曲线?

Python 有没有一种简单的方法可以在不考虑未来值和时间偏移的情况下平滑曲线?,python,pandas,numpy,scipy,smoothing,Python,Pandas,Numpy,Scipy,Smoothing,我有一个Unix时间序列(x)和一个每分钟生成的相关信号值(y),删除第一个值并附加一个新值。我试图在不降低时间精度的情况下平滑结果曲线,并特别强调平滑曲线的最终值,该值将写入数据库。我希望能够将平滑度调整到相当大的程度 我(作为数学门外汉,或多或少地)研究了我能找到并掌握的所有选项。我遇到了Savitzki Golay,它看起来很完美,直到我意识到它在过去的数据上工作得很好,但是如果没有未来的数据可以平滑,它就无法产生可靠的最终值。我尝试过许多其他方法,这些方法产生了效果,但无法像Savgol

我有一个Unix时间序列(x)和一个每分钟生成的相关信号值(y),删除第一个值并附加一个新值。我试图在不降低时间精度的情况下平滑结果曲线,并特别强调平滑曲线的最终值,该值将写入数据库。我希望能够将平滑度调整到相当大的程度

我(作为数学门外汉,或多或少地)研究了我能找到并掌握的所有选项。我遇到了Savitzki Golay,它看起来很完美,直到我意识到它在过去的数据上工作得很好,但是如果没有未来的数据可以平滑,它就无法产生可靠的最终值。我尝试过许多其他方法,这些方法产生了效果,但无法像Savgol那样进行调整

import pandas as pd
from bokeh.plotting import figure, show, output_file
from bokeh.layouts import column
from math import pi
from scipy.signal import savgol_filter
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from scipy.interpolate import splrep, splev
from scipy.ndimage import gaussian_filter1d
from scipy.signal import lfilter
from scipy.interpolate import UnivariateSpline
import matplotlib.pyplot as plt

df_sim = pd.read_csv("/home/20190905_Signal_Smooth_Test.csv")

#sklearn Polynomial*****************************************
poly = PolynomialFeatures(degree=4)
X = df_sim.iloc[:, 0:1].values
print(X)
y = df_sim.iloc[:, 1].values
print(y)
X_poly = poly.fit_transform(X)
poly.fit(X_poly, y)
lin2 = LinearRegression()
lin2.fit(X_poly, y)
# Visualising the Polynomial Regression results
plt.scatter(X, y, color='blue')
plt.plot(X, lin2.predict(poly.fit_transform(X)), color='red')
plt.title('Polynomial Regression')
plt.xlabel('Time')
plt.ylabel('Signal')
plt.show()

#scipy interpolate********************************************
bspl = splrep(df_sim['timestamp'], df_sim['signal'], s=5)
bspl_y = splev(df_sim['timestamp'], bspl)
df_sim['signal_spline'] = bspl_y

#scipy gaussian filter****************************************
smooth = gaussian_filter1d(df_sim['signal'], 3)
df_sim['signal_gauss'] = smooth

#scipy lfilter************************************************
n = 5  # the larger n is, the smoother curve will be
b = [1.0 / n] * n
a = 1
histo_filter = lfilter(b, a, df_sim['signal'])
df_sim['signal_lfilter'] = histo_filter
print(df_sim)

#scipy UnivariateSpline**************************************
s = UnivariateSpline(df_sim['timestamp'], df_sim['signal'], s=5)

xs = df_sim['timestamp']
ys = s(xs)
df_sim['signal_univariante'] = ys

#scipy savgol filter**************************************** 
sg = savgol_filter(df_sim['signal'], 11, 3)
df_sim['signal_savgol'] = sg

df_sim['date'] = pd.to_datetime(df_sim['timestamp'], unit='s')

#plotting it all********************************************
print(df_sim)
w = 60000
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
p = figure(x_axis_type="datetime", tools=TOOLS, plot_width=1000, plot_height=250,
            title=f"Various Signals y vs Timestamp x")
p.xaxis.major_label_orientation = pi / 4
p.grid.grid_line_alpha = 0.9
p.line(x=df_sim['date'], y=df_sim['signal'], color='green')
p.line(x=df_sim['date'], y=df_sim['signal_spline'], color='blue')
p.line(x=df_sim['date'], y=df_sim['signal_gauss'], color='red')
p.line(x=df_sim['date'], y=df_sim['signal_lfilter'], color='magenta')
p.line(x=df_sim['date'], y=df_sim['signal_univariante'], color='yellow')

p1 = figure(x_axis_type="datetime", tools=TOOLS, plot_width=1000, plot_height=250,
            title=f"Savgol vs Signal")
p1.xaxis.major_label_orientation = pi / 4
p1.grid.grid_line_alpha = 0.9
p1.line(x=df_sim['date'], y=df_sim['signal'], color='green')
p1.line(x=df_sim['date'], y=df_sim['signal_savgol'], color='blue')

output_file("signal.html", title="Signal Test")
show(column(p, p1))  # open a browser

我期望得到与Savitzky-Golay相似的结果,但数据系列的最终平滑值有效。其他方法中没有一种具有相同的灵活性来调整平滑等级。大多数其他方法将曲线向右移动。我可以提供csv文件进行测试。

这实际上取决于为什么要平滑数据。每一种平滑方法都会产生副作用,比如让一些“噪音”比其他的更容易通过。研究“滤波的相位响应”

避免对称过滤器末尾丢失数据问题的一种常见技术是,只需提前几点预测数据并使用它。例如,如果您使用的是5项移动平均值过滤器,则在计算最终值时将丢失2个数据点


要预测这两点,您可以使用
pmdarima
模块中的
auto_-arima()
函数,或者查看
fbprophet
模块(我发现该模块非常适合这种情况)。

我按照您的想法使用fbprophet,但未能生成未来的值。我想这是一个新的话题。我按照快速入门的要求做了详细的操作。>>m=Prophet()m.fit(bm.df_fb)future=m.make_future_dataframe(periods=2)future.tail()forecast=m.preecast(future)forecast[['ds','yhat','yhat_lower','yhat_upper']]tail()fig1=m.plot(forecast)fig2=m.plot_components(forecast)没有错误消息,仅信息:信息:禁用年度季节性。运行prophet with yearly_季节性=True以覆盖此选项。信息:fbprophet:禁用每周季节性。运行prophet with weekly_seasonality=True以覆盖此选项。信息:fbprophet:禁用每日季节性。运行prophet with daily_seasonality=True以覆盖此值。yhat是预测值。它提供了一个中间估计值,以及一个上下估计值。这是一种常见的统计语言,但我明白为什么不知道它就没有意义。禁用季节性只是表明它没有发现任何季节性,因此没有将其添加到模型中。这不是一个错误,可能只是一个没有太多数据的指标。