一个完整的数据分析流程大致应分为三步:收集数据、处理数据、数据建模预测及可视化。而在实际工作中,前两项内容占据的时间远远超过最后一步。
三种方法:数据接口、数据库、数据爬虫
在读取数据时,我们最常碰到的有两种形式:数据文件和数据库
数据,需要解压
import pandas as pd
df = pd.read_csv("test_file.txt", header=0, sep='\t')
#header=0 表示将第一行设为表头,而 sep='\t'则代表使用空格分隔字段
df
除了csv文件,Pandas 读取其他文件的方法如下:
除了数据文件,如果想要读取 MySQL,Oracle,Microsoft SQL 等数据库里面的数据。一般情况下都需要安装相应的第三方库。例如,读取 MySQL 时,我们需要安装 MySQLdb
df = pd.read_csv("test_file.csv")
df.head() # 浏览头部数据
df.tail() # 浏览尾部数据
df.describe() # 数据统计
df.count() # count() 用于计算数据集中非空数据的数量
缺失值处理
查找缺失值
df = pd.read_csv("test_file_nan.csv")
df.head(10)
#isnull() 和 notnull(),「是缺失值」和「不是缺失值」。默认会返回布尔值用于判断。
df.isnull()
df.notnull()
关于缺失值处理,主要有两种处理手段:删除缺失值所在的行或列或填充缺失值。
删除缺失值是最简单直接的办法之一。它适用于三种情况:
dropna() 方法可以将有缺失值的行或列全部移除。当然,你可以使用 axis=0 参数指定行,或 axis=1 参数指定列
df.dropna(axis=0) #删除含有空值的行
df.dropna(axis=1) #删除含有空值的行
填充缺失值
填充缺失值会直接改变原有数据集,这可能会影响后续预测分析的结果。所以,使用填充缺失值时一定要更加谨慎。
填充缺失值有三种方法:
df.fillna(method='pad') #空值用其前面的临近值进行了填充
df.fillna(method='bfill')
#空值用其后面的临近值进行了填充
#这种情况下,最后一列如果有空值,就不会被有效填充
除了临近填充,有时候我们还会用 mean() 进行平均值填充。
3.插值填充。
插值填充就是采用数学的方法对数据进行插值。举个例子,有一列数据为 [2011, 2012, 2013, NaN,NaN,2016, 2017]。这里,无论你采用向前还是向后填充,其实都不是最好的。你可以发现数据是一个等差数列,缺失值应该分别为[2014, 2015],这也就是一个线性插值的过程。
Pandas 提供了相关插值方法,通过 interpolate() 方法实现。默认为参数为线性插值,即 method=‘linear’
df.interpolate()
独热编码
对于一些分类变量,直接映射成数字是不行的。例如,某一装置的状态有三种情况,分别为:正常、机械故障、电路故障。如果我们要将这些数据运用到后续的预测分析中,就需要对文字状态进行转换。一般情况下,可以用 0 表示正常,1 代表机械故障,2 代表电路故障。
但是这种映射方式,往往会让学习器认为 2 代表电路故障比 1 代表机械故障更「大」,从而影响模型分析结果,这肯定是不行的。
df = pd.read_csv("one_hot_demo.csv", header=0)
df.head()
#在此演示文件中,status 共有 none, electric, engine 三类数值。
#color 有 red 和 green 两类
onehot = pd.get_dummies(df[['status', 'color']])
onehot
#字符串被进行了独热编码,特征也从原先的 2 列扩充为 5 列
#对每一个类别都单独拆成了一列,用0-1进行判断
重复值处理
pd.DataFrame.duplicated(df)
#pandas.DataFrame.duplicated() 可以用来标识重复数据,
#数据集中重复数据行会返回布尔类型 True
pd.DataFrame.drop_duplicates(df)
#pandas.DataFrame.drop_duplicates() 可以返回一个去重后的数据集
异常值检测
异常值检测:有从概率方法入手的一元正态分布及多元高斯方法,还有通过矩阵分解和神经网络进行异常值检测的相关方法
简单直观的异常值检测方法:箱形图(箱线图)
箱形图中,从上到下依次有 6 个数据节点,分别是上界、上四分位、均值、中位数、下四分位、下界。而那些超过上界的值就会被标记为离群点,也就是异常数据。
from matplotlib import pyplot as plt
%matplotlib inline
data = pd.read_csv("test_file.csv", header=0)
total_population = data["Total Population"]
plt.boxplot(total_population)
#做箱线图
#将离群点标记并导出
P = plt.boxplot(total_population)
outlier = P['fliers'][0].get_ydata()
outlier
data.boxplot()
#将data中所有列数据的箱形图画在一张图中对比