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

2024-10-06 08:12:21 发布

您现在位置:Python中文网/ 问答频道 /正文

已解决-结束时的解决方案

假设我们有一个x(时间)和y(压力)值的大数据集(n>;40000)。 压力传感器的输出噪音很大: 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

然后,我从一些统计学讲座中记起,正交多项式可以用来降低噪音:

新值=(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, :])) / 21 for j in range(0, yData.shape[0]-6, 1)]
    yData = pd.concat(yData, axis = 1)
    yData = yData.transpose()

尽管上述多项式代码有效,但存在两个主要问题:

  1. 计算时间禁止过长(2.5小时-使用jupyterlab)。有没有办法进行优化?有人能提出其他解决熊猫/numpy问题的方案吗?多处理是一种选择吗?(Python Multiprocessing Tutorial: Run Code in Parallel Using the Multiprocessing Module - 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的解决方案,使用此函数对两个具有形状(~42000;4)的数据帧循环2000次,将执行时间降低到约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

Tags: intrueforindexrangedroprowspd