缺失值和异常值处理

缺失值处理

判断是否有缺失值: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()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jepson2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值