[英]Smoothing a large noisy data set with an orthogonal polynomial in Python
假设我们有一个包含 x(时间)和 y(压力)值的大型数据集(n > 40,000)。 这个来自压力传感器的 output 非常嘈杂:嘈杂的原始数据
为了减少噪音,我想出了一个非常简单的解决方案,不幸的是,它减少了 plot 的点数(而且不够科学):
import pandas as pd
...
for i in range(0, 7, 1):
xData = (xData.iloc[0::2, :].reset_index(drop=True) + xData.iloc[1::2, :].reset_index(drop=True)) / 2
yData = (yData.iloc[0::2, :].reset_index(drop=True) + yData.iloc[1::2, :].reset_index(drop=True)) / 2
结果:其他所有值的平均值
然后我从一些统计讲座中记起,可以使用正交多项式来降低噪声:
新值 = (7x 4 + 6(x 3 +x 5 )+3(x 2 +x 6 )-2(x 1 +x 7 )) / 21
工作代码示例:
# Using a loop to repeat the process several times
for i in range(0, 20, 1):
# Using list comprehension to calculate each new point
xData = [(7*xData.iloc[3+j, :]+6*(xData.iloc[2+j, :]+xData.iloc[4+j, :])+3*(xData.iloc[1+j, :] + xData.iloc[5+j, :])-2*(xData.iloc[0+j, :]+xData.iloc[6+j, :])) / 21 for j in range(0, xData.shape[0]-6, 1)]
xData = pd.concat(xData, axis = 1)
xData = xData.transpose()
yData = [(7*yData.iloc[3+j, :]+6*(yData.iloc[2+j, :]+yData.iloc[4+j, :])+3*(yData.iloc[1+j, :] + yData.iloc[5+j, :])-2*(yData.iloc[0+j, :]+yData.iloc[6+j, :])) / 21 for j in range(0, yData.shape[0]-6, 1)]
yData = pd.concat(yData, axis = 1)
yData = yData.transpose()
尽管上面的多项式代码有效,但它有两个主要问题:
计算时间非常长(2.5 小时 - 使用 jupyterlab)。 有什么优化的方法吗? 任何人都可以建议使用 pandas/numpy 的任何其他解决方案吗? 多处理是一种选择吗? ( Python 多处理教程:使用多处理模块并行运行代码 - Corey Schafer )
我不能把它分成几个块以便用两个循环阅读,例如:
for i in range(0, 20, 1): iL2 = xDataTest.shape[0]-6 # There are 6 fewer points with each iteration for j in range(0, iL2, 1): xData1 = 7*xDataTest.iloc[3+j, :] xData2 = 6*(xDataTest.iloc[2+j, :] + xDataTest.iloc[4+j, :]) xData3 = 3*(xDataTest.iloc[1+j, :] + xDataTest.iloc[5+j, :]) xData4 = 2*(xDataTest.iloc[0+j, :] + xDataTest.iloc[6+j, :]) xDataTest = (xData1 + xData2 + xData3 - xData4) / 21 xDataTest = pd.concat(xDataTest, axis = 1).transpose() # IndexError: single positional indexer is out-of-bounds
也欢迎有关平滑方法的建议(如果能从一些可靠的来源阅读更多关于该主题的内容,我会很高兴)。
编辑:
问题解决了。 使用 pandas 的解决方案,使用此 function 循环 2,000 次,用于两个形状为 (~42,000; 4) 的数据帧,将执行时间减少到约 39 秒。 不要遍历行孩子。
import pandas as pd
...
def ortho_poly_7(opDF):
rows = opDF.shape[0]
d0 = opDF.iloc[:rows-3, :]
data0=7*d0.iloc[3::1, :].reset_index(drop=True)
d11 = opDF.iloc[:rows-4, :]
d12 = opDF.iloc[:rows-2, :]
data1 = 6*(d11.iloc[2::1, :].reset_index(drop=True) + d12.iloc[4::1, :].reset_index(drop=True))
d21 = opDF.iloc[:rows-5, :]
d22 = opDF.iloc[:rows-1, :]
data2 = 3*(d21.iloc[1::1, :].reset_index(drop=True) + d22.iloc[5::1, :].reset_index(drop=True))
d31 = opDF.iloc[:rows-6, :]
d32 = opDF.iloc[:rows-0, :]
data3=2*(d31.iloc[0::1, :].reset_index(drop=True) + d32.iloc[6::1, :].reset_index(drop=True))
dAll = (data0+data1+data2-data3)/21
dataFinal = pd.DataFrame(dAll)
return dataFinal
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.