繁体   English   中英

在 Python 中使用正交多项式平滑大型噪声数据集

[英]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()

尽管上面的多项式代码有效,但它有两个主要问题:

  1. 计算时间非常长(2.5 小时 - 使用 jupyterlab)。 有什么优化的方法吗? 任何人都可以建议使用 pandas/numpy 的任何其他解决方案吗? 多处理是一种选择吗? Python 多处理教程:使用多处理模块并行运行代码 - Corey Schafer

  2. 我不能把它分成几个块以便用两个循环阅读,例如:

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM