如何解决在 Python 中使用正交多项式平滑大型噪声数据集
已解决 - 最后的解决方案
假设我们有一个包含 x(时间)和 y(压力)值的大型数据集 (n > 40,000)。 压力传感器的输出非常嘈杂: Noisy raw data
为了减少噪音,我想出了一个非常简单的解决方案,但不幸的是它减少了要绘制的点数(而且不够科学):
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
结果:Average of every other value
然后我从一些统计学讲座中想起可以使用正交多项式来降低噪声:
new_value = (7x4 + 6(x3+x5)+3(x2 +x6)-2(x1+x7)) / 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,yData.shape[0]-6,1)]
yData = pd.concat(yData,axis = 1)
yData = yData.transpose()
虽然上述多项式代码有效,但有两个主要问题:
-
计算时间太长了(2.5 小时 - 使用 jupyterlab)。有什么优化方法吗?任何人都可以建议使用 pandas/numpy 的任何其他解决方案吗?多处理是一种选择吗? (Python Multiprocessing Tutorial: Run Code in Parallel Using the Multiprocessing Module - Corey Schafer)
-
为了便于阅读,我无法将其分成几个块以使用两个循环进行阅读,例如:
for i in range(0,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 的解决方案,使用此函数为两个形状为 (~42,000; 4) 的数据帧循环 2,000 次,将执行时间降低到约 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。