判断是否有缺失值:isnull, notnull
删除缺失值: dropna
填充、替换缺失值:fillna(method=‘pad’,inplace=True)
method参数:pad/ffill 用之前的数据填充,backfill/bfill 用之后的数据填充
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
%matplotlib inline
#缺失值插补
#均值、中位数、众数、临近值插补、插值法(拉格朗日插值法)
#(1)均值、中位数、众数
s=pd.Series([1,2,3,np.nan,4,5,5,5,5,5,6,7,np.nan,np.nan,8,9,np.nan])
u=s.mean()
me=s.median()
mod=s.mode()
s.fillna(mod,inplace=True)
s
#拉格朗日插值法
from scipy.interpolate import lagrange
x=[3,6,9]
y=[10,8,4]
plt.scatter(x,y)
print(lagrange(x,y)) #输出的是多项式的n个系数
print('差值10为:%.2f' % lagrange(x,y)(10))
df=pd.DataFrame({'x':np.arange(15)})
df['y']=lagrange(x,y)(df['x'])
plt.plot(df['x'],df['y'],linestyle='--',color='r')
#拉格朗日差值法,实际运用
data=pd.Series(np.random.rand(100)*100)
data[3,6,33,56,45,66,67,80,90]=np.nan
data_na=data[data.isnull()]
print('缺失的数据量为:%.2f' % len(data_na))
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])
def f(s,n,k=5):
y=s[list(range(n-k,n+1+k))]
y=y[y.notnull()]
return(lagrange(y.index,list(y))(n))
for i in range(len(data)):
if data.isnull()[i]:
data[i]=f(data,i)
print('第%i个缺失值的拉格朗日插值为:%.4f' %(i,f(data,i)))
data.dropna(inplace=True)
data.plot(kind='kde',style='--k',ax=axes[3],grid=True,title='拉格朗日插值后',xlim=[-50,150])
异常值是指样本中的个别值,其数值明显偏离其余的观测值
异常值也称离群点,异常值的分析也称为离群点的分析
异常值分析 :3sigma原则/箱型图分析
异常值处理:删除、修正填补
#异常分析
#3sigma原则:如果数据服从正态分布,异常值被定义为一组测定值与平均值的偏差超过3倍标准差的值
data=pd.Series(np.random.randn(10000)*100)
data.head()
u=data.mean()
std=data.std()
stats.kstest(data,'norm',(u,std))
fig=plt.figure(figsize=(10,6))
ax1=fig.add_subplot(2,1,1)
data.plot(kind='kde',grid=True,style='-k',title='密度曲线')
plt.axvline(3*std,hold=None,color='r',linestyle='--',alpha=0.8)
plt.axvline(-3*std,hold=None,color='r',linestyle='--',alpha=0.8)
error=data[np.abs(data-u)>3*std]
data_c=data[np.abs(data-u)<=3*std]
ax2=fig.add_subplot(2,1,2)
plt.scatter(data_c.index,data_c,color='k',marker='.',alpha=0.2)
plt.scatter(error.index,error,color='b',marker='+',alpha=0.9)
plt.grid()
#箱线图分析
fig=plt.figure(figsize=(10,6))
ax1=fig.add_subplot(2,1,1)
color=dict(boxes='DarkGreen',whiskers='DarkOrange',medians='DarkBlue',caps='Gray')
data.plot.box(vert=False,grid=True,color=color,ax=ax1,label='样本数据')
s=data.describe()
q1=s['25%']
q3=s['75%']
iqr=q3-q1
q1,q3,iqr
mi=q1-1.5*iqr
ma=q3+1.5*iqr
ax2=fig.add_subplot(2,1,2)
error=data[(data<mi) | (data>ma)]
data_c=data[(data>=mi) & (data<=ma)]
print('异常值共%i条' % len(error))
plt.scatter(data_c.index,data_c,color='k',marker='.',alpha=0.2)
plt.scatter(error.index,error,color='b',marker='+',alpha=0.9)
#plt.xlim([-100,10100])
plt.grid()