在进行数据处理过程中,面对多张数据表,需要对多张表的字段进行合并于提取,即数据整合;整合好的数据很可能存在错误和异常,需要进行数据清洗。
1 数据整合
数据整合:对数据进行列选择、创建、删除等基本操作。
数据整合普遍适用的方法是SQL。
SQL语句介绍
Select数据查询是最核心和常用的操作
import pandas as pd
import os
导入数据
os.chdir(r'D:\python商业实践\《Python数据科学技术详解与商业实践》PDF+源代码+八大案例\《Python数据科学技术详解与商业实践》PDF+源代码+八大案例\源代码\Python_book\5Preprocessing')
sale=pd.read_csv(r'sale.csv',encoding='gbk') #数据集中含中文 encoding='gbk'
import sqlite3 #sqlite3相当于轻量版,更多功能使用SQLAlchemy
con=sqlite3.connect(':memory:') #数据库连接,将数据在内存中
sale.to_sql('sale',con) #将DataFrame注册成可用sql查询的表,注册到con中
- 选择表中指定列
pd.read_sql_query (select <目标列> from <sql可查询的表> , 内存)
newTable=pd.read_sql_query('select year,sale,profit from sale',con) #选择year,sale,profit列
- 选择所有列
select * from sale
sqlResult = pd.read_sql_query('select * from sale', con)
- 选择满足条件的行
select * from sale where 目标
#指定目标条件为字符需加引号,数字不需加引号,若要求多个条件用where in('指定1','指定2 ','...')
pd.read_sql_query("select * from sale where market in ('东','西') and year=2012", con) #选择出2012年且market在东和西的销售额
- 对行进行排序
order by 表名
#默认为升序,降序则为order by sale desc
sql = '''select year, market, sale, profit
from sale
order by sale desc'''
pd.read_sql_query(sql, con)
- 删除某列重复的行
pd.read_sql_query("select DISTINCT year from sale", con)
2 数据清洗
数据问题类型
- 脏数据或错误数据
- 数据不一致:人为肉眼修正
- 数据重复:去重
- 缺失值:填补
- 离群值 ,离群值不一定就是错误值
读取数据
camp=pd.read_csv('teleco_camp_orig.csv')
2.1 错误值处理
识别噪声
利用图形快速对数据进行初步分析:直方图、饼图、条形图、折线图、散点图等。一般情况,连续变量选择直方图,分类变量选择柱形图或饼状图
错误值->改正、缺失值替代
导入绘图所需的包
import matplotlib.pyplot as plt
绘制直方图
plt.hist(camp['AvgIncome'],bins=20) #查看分布状况
camp['AvgIncome'].describe()
判断这里的0为缺失值
camp['AvgIncome']=camp['AvgIncome'].replace({0: np.NaN}) #将0替换为NaN
plt.hist(camp['AvgIncome'], bins=20,range=(camp.AvgIncome.min(),camp.AvgIncome.max())) #由于数据中存在缺失值,需要指定绘图的值域
camp['AvgIncome'].describe(include='all')
2.2 缺失值处理
缺失值->.填补
- 缺失值少于20%,连续变量使用均值或中位数填补;分类变量不需要填补,单算一类即可,或者用众数填补。
- 缺失值在20%~80%,用上述方法填补,同时每个有缺失值的变量生成一个指示哑变量,参与后续建模。
- 缺失值在大于80%,每个有缺失值的变量生成一个指示哑变量,参与后续建模,原变量不适用。
#不完整数据->填补后变量、缺失值指示变量
查看统计量
camp.describe() #如果count数量少于样本量,说明存在缺失,Age缺失了大概20%
用均值填补缺失值
vmean=camp['Age'].mean(axis=0,skipna=True) #计算均值 skipna=True去掉缺失值后的均值
camp['Age_empflag']=camp['Age'].isnull() #产生虚拟指标/指示变量
camp['Age']=camp['Age'].fillna(vmean) #用均值填补缺失值
camp['Age'].describe()
2.3 噪声值处理
-
单变量离群值发现
极端值,设置标准值
离群值,平均值法、四分位数法 -
单变量离群处理方法
1.剔除法
2.盖帽法:小于1%、大于99%替代
定义盖帽法函数
def blk(floor,root): # 'blk' will return a function
def f(x):
if x<floor:
x=floor
elif x>root:
x=root
return x
return f
q1=camp['Age'].quantile(0.01) #计算百分数
q99=camp['Age'].quantile(0.99)
blk_tot=blk(floor=q1,root=q99)
camp['Age']=camp['Age'].map(blk_tot)
camp['Age'].describe()
3.分箱法
- 等宽分箱:按照值域分组
pd.qcut()
camp['Age_group1'] = pd.qcut( camp['Age'], 4) # 等宽分为四份
camp.Age_group1
- 等深分箱:按照百分数分,每组样本量一样
pd.cut
camp['Age_group2'] = pd.cut( camp['Age'], 4)
camp.Age_group2.head()
输出干净数据
camp.to_csv('tele_camp_ok.csv')