代码如下
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.interpolate import lagrange
data = pd.Series(np.random.rand(100)*100)
data[3,6,33,56,45,66,67,80,90] = np.nan
data.reindex()
print(data.head())
data_na = data[data.isnull()]
print('缺失数据占比 %.2f%%' % (len(data_na)/len(data)*100))
data_c = data.fillna(data.median())
fig, axes = plt.subplots(1,4,figsize = (20,5))
data.plot.box(ax = axes[0] ,grid = True, title = '数据分布')
data.plot(kind = 'kde', style = '--r', ax = axes[1], grid = True, title = '删除缺失值', xlim = [-50,150])
data_c.plot(kind = 'kde', style = '--b', ax = axes[2], grid = True, title = '缺失值填充中位数', xlim = [-50, 150])
print('-------------')
print(data)
def na_c(s,n,k=5):
# y = s.reindex(list(range(n-k, n)) + list(range(n+1, n+1+k))) #取数不报错代码段
y = s[list(range(n-k,n+1+k))] # 取数报错代码段
y = y[y.notnull()] # 剔除空值
return(lagrange(y.index,list(y))(n))
# 创建函数,做插值,由于数据量原因,以空值前后5个数据(共10个数据)为例做插值
na_re = []
for i in range(len(data)):
if data.isnull()[i]:
data[i] = na_c(data,i)
print(na_c(data,i))
na_re.append(data[i])
data.dropna(inplace=True) # 清除插值后仍存在的缺失值
data.plot(kind = 'kde',style = '--k',ax = axes[3],grid = True,title = '拉格朗日插值后',xlim = [-50,150])
print('finished!')
# 缺失值插值
使用这行代码则不会报错,可以改成这个
y = s.reindex(list(range(n-k, n)) + list(range(n+1, n+1+k))) #取数
使用这行代码会报错
y = s[list(range(n-k,n+1+k))] # 取数
原因: Series不支持反向索引,也就是类似于pd.Series[-1]
第一个缺失值位于第三位 n-k出现负值,所以报错。
另一种解决方案,忽略n-k<0的缺失值