使用pandas的box_plot去除异常值
我就废话不多说了,直接上代码吧!
#-*-coding:utf-8_*-
"""
@author:Administrator
@file:standard_process.py
@time:2018/8/9
"""
importpandasaspd
importnumpyasnp
importmatplotlib.pyplotasplt
importsys
importos
importseabornassns
fromsklearn.preprocessingimportStandardScaler
'''
通过box_plot(盒图来确认)异常值
'''
#获取项目根目录
input_data_path=os.path.dirname(os.path.dirname(os.getcwd()))+'/input/'
print(input_data_path)
#获取数据得位置
month_6_train_path=input_data_path+'month_6_1.csv'
month_6_test_path=input_data_path+'test_data_6_1.csv'
#读取数据
data_train=pd.read_csv(month_6_train_path)
data_test=pd.read_csv(month_6_test_path)
#print(data_train.head())
#print(data_test.head())
#暂时不考虑省份城市地址
#月份只有一个月,暂时不考虑
#bedrooms需要看成分类型得数据
#只取出longitude,latitude,price,buildingTypeId,bedrooms,daysOnMarket
#取出这些数据;
#train=data_train[['longitude','latitude','price','buildingTypeId','bedrooms','daysOnMarket']]
#train=train.dropna()
train=data_test[['longitude','latitude','price','buildingTypeId','bedrooms','daysOnMarket']]
print(train.head())
#print(test.head())
#print(train.isna().sum())
#sns.pairplot(train)
##sns.pairplot(test)
#plt.show()
#特征清洗:异常值清理用用箱图;
#分为两步走,一步是单列异常值处理,
#第二步是多列分组异常值处理
defremove_filers_with_boxplot(data):
p=data.boxplot(return_type='dict')
forindex,valueinenumerate(data.columns):
#获取异常值
fliers_value_list=p['fliers'][index].get_ydata()
#删除异常值
forflierinfliers_value_list:
data=data[data.loc[:,value]!=flier]
returndata
print(train.shape)
train=remove_filers_with_boxplot(train)
print(train.shape)
'''
以上得异常值处理还不够完善,
完善的异常值处理是分组判断异常值,
也就是他在单独这一列种,还有一种情况是多余不同的分类,他是不是存在异常
所以就需要用到分组获取数据再箱图处理掉异常数据;
'''
train=train[pd.isna(train.buildingTypeId)!=True]
print(train.shape)
print(train['bedrooms'].value_counts())
'''
3.08760
2.05791
4.05442
1.02056
5.01828
6.0429
0.0159
7.082
由于样本存在不均衡得问题:所以只采用12345数据:也就是说去掉0,7,6,到时候测试数据也要做相同得操作;
还有一种是通过下采样或者是上采样的方式进行,这里暂时不考虑;
'''
#只取bedrooms为1,2,3,4,5得数据
train=train[train['bedrooms'].isin([1,2,3,4,5])]
print(train.shape)
#利用pivot分组后去掉异常点
defuse_pivot_box_to_remove_fliers(data,pivot_columns_list,pivot_value_list):
forcolumninpivot_columns_list:
forvalueinpivot_value_list:
#获取分组的dataframe
new_data=data.pivot(columns=column,values=value)
p=new_data.boxplot(return_type='dict')
forindex,value_newinenumerate(new_data.columns):
#获取异常值
fliers_value_list=p['fliers'][index].get_ydata()
#删除异常值
forflierinfliers_value_list:
data=data[data.loc[:,value]!=flier]
returndata
#train=use_pivot_box_to_remove_fliers(train,['buildingTypeId','bedrooms'],['price','daysOnMarket','longitude','latitude'])
print(train.shape)
#print(train.isna().sum())
#以上就不考虑longitude和latitude的问题了;应为房屋的类型以及房间个数和经纬度关系不大,但是也不一定,
#实践了一下加上longitude和latitude之后样本数据并没有减少;
#sns.pairplot(train)
#plt.show()
#先进一步做处理将纬度小于40的去掉
train=train[train.latitude>40]
#--------------------------------》》》
#对于数值类型得用均值填充,但是在填充之前注意一些原本就是分类型数据得列
#deffill_na(data):
#forcolumnindata.columns:
#ifcolumn.dtype!=str:
#data[column].fillna(data[column].mean())
#returndata
#以上是异常值,或者是离群点的处理,以及均值填充数据
#下面将根据catter图或者是hist图来处理数据
##标准化数据
#train=StandardScaler().fit_transform(train)
##标准化之后画图发现数据分布并没有变
#
#sns.pairplot(pd.DataFrame(train))
#plt.show()
'''
1:循环遍历整个散点图用刚才写好的算法去除点;
'''
#获取
#defget_outlier(x,y,init_point_count,distance,least_point_count):
#x_outliers_list=[]
#y_outliers_list=[]
#foriinrange(len(x)):
#forjinrange(len(x)):
#d=np.sqrt(np.square(x[i]-x[j])+np.square(y[i]-y[j]))
##print('距离',d)
#ifd<=distance:
#init_point_count+=1
#ifinit_point_count声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。