使用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进阶教程之模块(module)介绍
Aug 30 Python
浅析Python多线程下的变量问题
Apr 28 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
TensorFlow实现iris数据集线性回归
Sep 07 Python
Django之Mode的外键自关联和引用未定义的Model方法
Dec 15 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 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下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
Python中实现的RC4算法
2015/02/14 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
python主线程捕获子线程的方法
2018/06/17 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
基于Python检测动态物体颜色过程解析
2019/12/04 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
森林防火宣传标语
2014/06/27 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
自我检讨报告
2015/01/28 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
宣传稿格式范文
2015/07/23 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL