使用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之模块的加载
Oct 24 Python
线程和进程的区别及Python代码实例
Feb 04 Python
编写Python脚本来获取mp3文件tag信息的教程
May 04 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
由面试题加深对Django的认识理解
Jul 19 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
Pycharm生成可执行文件.exe的实现方法
Jun 02 Python
pandas针对excel处理的实现
Jan 15 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
解析php开发中的中文编码问题
2013/08/08 PHP
Linux下安装oracle客户端并配置php5.3
2014/10/12 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
鼠标图片振动代码
2006/07/06 Javascript
js工具方法弹出蒙版
2013/05/08 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
不得不分享的JavaScript常用方法函数集(上)
2015/12/23 Javascript
javascript数组去重小结
2016/03/07 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
[48:22]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
java直接调用python脚本的例子
2014/02/16 Python
Python深入学习之对象的属性
2014/08/31 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
基于Python的ModbusTCP客户端实现详解
2019/07/13 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
python生成特定分布数的实例
2019/12/05 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
传播学专业毕业生自荐书
2014/07/01 职场文书
三严三实学习心得体会
2014/10/13 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
OpenCV实现普通阈值
2021/11/17 Java/Android