使用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 列表list使用介绍
Nov 30 Python
在Django中同时使用多个配置文件的方法
Jul 22 Python
Python中属性和描述符的正确使用
Aug 23 Python
python利用OpenCV2实现人脸检测
Apr 16 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
Python实现程序判断季节的代码示例
Jan 28 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
PyQt5实现简单的计算器
May 30 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 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
怎么使 Mysql 数据同步
2006/10/09 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php中error与exception的区别及应用
2014/07/28 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
js函数排序的实例代码
2013/07/01 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
JavaScript闭包详解
2015/02/02 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
bootstrap+jQuery实现的动态进度条功能示例
2017/05/25 jQuery
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
Python 多核并行计算的示例代码
2017/11/07 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
教师求职信范文
2014/05/24 职场文书
养成教育经验材料
2014/05/26 职场文书
保研推荐信格式
2015/03/25 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电