下面是一段拉格朗日插值法解决表格异常值处理的问题。但有几行代码我看不懂,希望有人指点
(代码中加粗、倾斜的部分即是)
import os
import pandas as pd
import numpy as np
from scipy.interpolate import lagrange
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 数据的读取
data = pd.read_excel('try.xls', header=0)
**_neg_list = ['位移']_**
# 数据的行数
R = data.shape[0]
# 异常数据的个数
for item in neg_list:
iqr = **_data[item]_**.quantile(0.75) - data[item].quantile(0.25)
q_abnormal_L = data[item] < data[item].quantile(0.25) - 1.5 * iqr
q_abnormal_U = data[item] > data[item].quantile(0.75) + 1.5 * iqr
# print(item + '中有' + str(q_abnormal_L.sum() + q_abnormal_U.sum()) + '个异常值')
# 确定数据上限和下限
for item in neg_list:
iqr = data[item].quantile(0.75) - data[item].quantile(0.25)
Too_small = data[item].quantile(0.25) - 1.5 * iqr
Too_big = data[item].quantile(0.25) + 1.5 * iqr
data**_[u'位移']_**[(data[u'位移']<Too_small) | (data[u'位移']>Too_big)] = None #过滤异常值,将其变为空值
#s为列向量,n为被插值位置,k为取前后的数据个数
def ployinter(s,n,k=5):
y = s[list(range(n-k,n)) + list(range(n+1,n+1+k))]
y = y[y.notnull()] #剔除空值
return lagrange(y.index,list(y))(n)
#逐个元素判断是否需要插值
for i in data.columns:
for j in range(len(data)):
if(data[i].isnull())[j]:
data[i][j] = ployinter(data[i],j)
# print(data[u'位移'])
# 输出拉格朗日插值后的数据
data.to_excel("try_result.xls")
# 把表格列数据调整为arr,arr为修改后的数据
print("拉格朗日插值后的数据:")
d = []
k = 0
while k < R:
d.append(data[u'位移'][k])
k +=1
# print(d)
arr = np.array(d)
print(arr)
# 输出图像
x = np.arange(len(d))
plt.plot(x,d,'b-',label="one", marker='*',markersize=4,linewidth=1) # b代表blue颜色 -代表直线
plt.title('位移曲线')
plt.legend(loc='upper left',bbox_to_anchor=(1.0,1.0))
# 直接更改X轴坐标数
# plt.xticks((0,1,2,3,4,5,6,7,8),('0', '1', '2', '3', '4', '5', '6', '7', '8'))
plt.xlabel('时间/h')
plt.ylabel('位移/mm')
#plt.grid(x1)
plt.show()