使用pandas的box_plot去除异常值


Posted in Python onDecember 10, 2019

我就废话不多说了,直接上代码吧!

#-*- coding:utf-8 _*- 
""" 
@author:Administrator
@file: standard_process.py
@time: 2018/8/9
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sys
import os
import seaborn as sns
from sklearn.preprocessing import StandardScaler
'''
通过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()


# 特征清洗:异常值清理用用箱图;
# 分为两步走,一步是单列异常值处理,
# 第二步是多列分组异常值处理
def remove_filers_with_boxplot(data):
 p = data.boxplot(return_type='dict')
 for index,value in enumerate(data.columns):
  # 获取异常值
  fliers_value_list = p['fliers'][index].get_ydata()
  # 删除异常值
  for flier in fliers_value_list:
   data = data[data.loc[:,value] != flier]
 return data

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.0 8760
2.0 5791
4.0 5442
1.0 2056
5.0 1828
6.0  429
0.0  159
7.0  82
由于样本存在不均衡得问题:所以只采用12345数据:也就是说去掉0,7,6,到时候测试数据也要做相同得操作;
还有一种是通过下采样或者是上采样的方式进行,这里暂时不考虑;
'''
# 只取bedrooms 为1,2,3,4,5 得数据
train = train[train['bedrooms'].isin([1,2,3,4,5])]
print(train.shape)


# 利用pivot分组后去掉异常点
def use_pivot_box_to_remove_fliers(data,pivot_columns_list,pivot_value_list):
 for column in pivot_columns_list:
  for value in pivot_value_list:
   # 获取分组的dataframe
   new_data = data.pivot(columns=column,values=value)
   p = new_data.boxplot(return_type='dict')
   for index,value_new in enumerate(new_data.columns):
    # 获取异常值
    fliers_value_list = p['fliers'][index].get_ydata()
    # 删除异常值
    for flier in fliers_value_list:
     data = data[data.loc[:, value] != flier]
 return data


# 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]

# --------------------------------》》》
# 对于数值类型得用均值填充,但是在填充之前注意一些原本就是分类型数据得列
# def fill_na(data):
#  for column in data.columns:
#   if column.dtype != str:
#    data[column].fillna(data[column].mean())
#  return data

# 以上是异常值,或者是离群点的处理,以及均值填充数据
# 下面将根据catter图或者是hist图来处理数据


# # 标准化数据
# train = StandardScaler().fit_transform(train)
# # 标准化之后画图发现数据分布并没有变
#
# sns.pairplot(pd.DataFrame(train))
# plt.show()

'''
1:循环遍历整个散点图用刚才写好的算法去除点;
'''

# 获取
# def get_outlier(x,y,init_point_count ,distance,least_point_count):
#  x_outliers_list = []
#  y_outliers_list = []
#  for i in range(len(x)):
#   for j in range(len(x)):
#    d =np.sqrt(np.square(x[i]-x[j])+np.square(y[i]-y[j]))
#    # print('距离',d)
#    if d <= distance:
#     init_point_count +=1
#   if init_point_count <least_point_count+1:
#    x_outliers_list.append(x[i])
#    y_outliers_list.append(y[i])
#    print(x[i],y[i])
#   init_point_count =0
#  return x_outliers_list,y_outliers_list
#
# def circulation_to_remove_outliers(data,list_columns=['longitude','latitude','price','daysOnMarket',]):
#  for column_row in list_columns:
#   for column_col in list_columns:
#    if column_row != column_col:
#     x = list(data[column_row])
#     y = list(data[column_col])
#     x_outliers_list ,y_outliers_list = get_outlier(x,y,0,0.01,2)
#     for x_outlier in x_outliers_list:
#      data = data[data.loc[:, column_row] != x_outlier]
#     for y_outlier in y_outliers_list:
#      data = data[data.loc[:, column_col] != y_outlier]
#  return data
#
# train = circulation_to_remove_outliers(train)
#
# print(train.shape)




# def get_outlier(x,y,init_point_count ,distance,least_point_count):
#  for i in range(len(x)):
#   for j in range(len(x)):
#    d =np.sqrt(np.square(x[i]-x[j])+np.square(y[i]-y[j]))
#    # print('距离',d)
#    if d <= distance:
#     init_point_count +=1
#   if init_point_count <least_point_count+1:
#    print(x[i],y[i])
#   init_point_count =0
#
# get_outlier(train['longitude'],train['latitude'],0,0.3,1)





# sns.pairplot(train)
# plt.show()
# train = train.dropna()
# print(train.tail())
# train.to_csv('./finnl_processing_train_data_6_no_remove_outliers_test.csv',index=False)
Python 相关文章推荐
Python 代码性能优化技巧分享
Aug 07 Python
python抓取京东商城手机列表url实例代码
Dec 18 Python
Python中分数的相关使用教程
Mar 30 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
用Python实现KNN分类算法
Dec 22 Python
python使用tornado实现简单爬虫
Jul 28 Python
Python地图绘制实操详解
Mar 04 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
python命令 -u参数用法解析
Oct 24 Python
Python3 中sorted() 函数的用法
Mar 24 Python
使用tensorflow根据输入更改tensor shape
Jun 23 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
Python 中如何实现参数化测试的方法示例
Dec 10 #Python
利用python读取YUV文件 转RGB 8bit/10bit通用
Dec 09 #Python
YUV转为jpg图像的实现
Dec 09 #Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 #Python
Python箱型图处理离群点的例子
Dec 09 #Python
Python实现非正太分布的异常值检测方式
Dec 09 #Python
python 实现检验33品种数据是否是正态分布
Dec 09 #Python
You might like
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
php实现水仙花数示例分享
2014/04/03 PHP
php文件下载处理方法分析
2015/04/22 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
详解微信小程序自定义组件的实现及数据交互
2019/07/22 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
Django配置文件代码说明
2019/12/04 Python
Python requests获取网页常用方法解析
2020/02/20 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
2020/11/17 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
Html5之title吸顶功能
2018/06/04 HTML / CSS
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
会计电算化应届生求职信
2013/11/03 职场文书
初中校园之声广播稿
2014/01/15 职场文书
节约粮食标语
2014/06/18 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
内勤岗位职责
2015/02/10 职场文书
文案策划岗位职责
2015/02/11 职场文书
煤矿安全保证书
2015/02/27 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android