假设我们有一个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()
尽管上述多项式代码有效,但存在两个主要问题:
计算时间禁止过长(2.5小时-使用jupyterlab)。有没有办法进行优化?有人能提出其他解决熊猫/numpy问题的方案吗?多处理是一种选择吗?(Python Multiprocessing Tutorial: Run Code in Parallel Using the Multiprocessing Module - 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的解决方案,使用此函数对两个具有形状(~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
目前没有回答
相关问题 更多 >
编程相关推荐