数据分析三剑客基础
1. numpy
01 数组元素的获取
import numpy as np
arr1 = np.array([[1,3,5,7],
[2,4,6,8],
[11,13,15,17],
[12,14,16,18],
[100,101,102,103]])
arr2 = np.array(((1,2,3,4,5),
(6,7,8,9,10),
(12,13,14,11,15),
(1,2,3,4,5)))
# 一维数组元素的获取
age = np.array([13,19,14,22,19,11])
print(age[-1])
print(age[:3]) # 切片
print(age[[1,3,5]]) # 间断索引
print(age[age<18]) # 逻辑索引
# 二维数组元素的获取
print(arr1[3,3]) # 获取4行4列位置的元素
print(arr1[3,:]) # 获取第4行的所有元素
print(arr1[:,3]) # 获取第4列的所有元素
print(arr1[[1,3],:]) # 获取第2,4行的所有元素
02 数组的运算
1.数学运算符
运算符 | 含义 | 运算符 | 含义 |
---|---|---|---|
+ | 数组对应元素相加 | - | 数组对应元素的差 |
* | 数组对应元素相乘 | / | 数组对应元素的商 |
% | 数组对应元素商的余数 | // | 数组对应元素商的整除数 |
** | 数组对应元素的幂指数 |
2.常用数学函数
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
np.round(arr) | 对各元素四舍五入 | np.power(arr,a) | 各元素的指数 |
np.sqrt(arr) | 算术平方根 | np.log2(arr) | 以2为底的对数 |
np.square(arr) | 平方值 | np.log10(arr) | 以10为底的对数 |
np.exp(arr) | 以e为底的指数 | np.log(arr) | 以e 为底的对数 |
3.常用统计函数
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
np.min(arr,axis) | 最大值 | np.sum(arr,axis) | 和 |
np.max(arr,axis) | 最小值 | np.std(arr,axis) | 标准差 |
np.mean(arr,axis) | 平均值 | np.var(arr,axis) | 方差 |
np.median(arr,axis) | 中位数 |
axis = 0时,计算数组各列的统计值;axis = 1时,计算数组各行的统计值。
4.常用生成随机数函数
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
np.random.randint() | 随机整数 | np.random.normal() | 随机正态分布 |
np.random.uniform() | 随机均匀分布 |
2.pandas
01 外部数据的读取
文本文件的读取:
pd.read_csv(filepath or buffer, sep=',', header='infer', names=None, usecols=None, skiprows=None, skipfooter=None, converters=None, encoding=None)
解释说明:
- filepath or buffer:指txt或csv文件所在的具体路径
- sep:指定分隔符
- header:是否需要将原数据中第一行作为表头,不需要赋值 None
- names:若原数据没有表头,可以通过该参数添加具体的表头
- usecols:指定需要读取原数据集中的哪些变量名
- skiprows:数据读取时,指定需要跳过原数据集开头的行数
- skipfooter:数据读取时,指定需要跳过原数据集末尾的行数
- converters:用于数据类型转换,以字典形式指定
- encoding:指定字符编码
电子表格的读取:
pd.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None,
names=None, na_values=None, thousands=None, convert_float=True)
- io:指路径
- sheetname:工作表,可以传整数,也可以传工作表名
- header:是否需要将原数据中第一行作为表头,默认是需要
- na_values:指定原始数据中哪些特殊值代表了缺失值
- thousands:指定原数据集中的千分位符
- convert_float:将所有数值型数据都转化为浮点型
数据库的读取:
pymysql.connect(host=None, user=None, password='', database=None, port=0, charset='')
- host:指需要访问的Mysql服务器
- user:指访问用户名
- database:指定访问MySQL的具体库名
- port:指定访问MySQL数据库的端口号
- charset:指定服务MySQL数据库的字符集,若数据库表中含有中文,一般可以尝试将参数设置为"uft-8"、“gbk”
pd.read_sql(sql,con)
和 pd.read_sql_table(table_name,con)
- sql:指定SQL查询语句,将根据查询语句的逻辑返回数据框
- con:指定数据库与python之间的连接器,即通过pymysql.connect函数或pymssql.connect函数构造的连接器
- table_name:指定数据库中某张表的名称,根据表名称返回数据框
02 数据的预览
数据量:df.shape
变量列表:df.columns
变量类型:df.dtype
描述统计:df.describe()
,默认对数值型数据进行描述统计,参数include实现非数值变量的描述统计。
03 数据的筛选
列的筛选:df.column_name
(点方法)df['column_name']
(索引方法)
行的筛选:df.loc[condition,:]
,condition为条件语句
行列的筛选:df.loc[condition,:,column_list]
04 数据的清洗
数据类型的修改:
sec_cars.Boarding_time = pd.to_datatime(sec_car.Boarding_time,fomat='%Y年%m月')
#时间数据的更改
#函数to_datatime用于更改时间数据,更改为“0000-00-00”的标准形式,通过fomat参数帮助python发现年、月信息
sec_cars.New_price = sec_cars.New_price.str[:-1].astype(float)
#通过
数据冗余的识别与处理:
data.duplicated(subset='appname')
# 判断data数据的appname中是否存在重复,若重复该行返回True,否则该行返回False
# 若没有限定参数subset,则默认进行整行的对比,完全相同的返回True
data.drop_duplicates(inplace=True)
# 删除重复冗余数据,inplace参数使原数据发生改变,否则再次调用原数据冗余仍然存在
异常值的识别与处理:
- Z得分法:在正态分布中,对于 μ ± n σ ( n = 1 , 2 , 3 ) \mu \pm n\sigma (n=1,2,3) μ±nσ(n=1,2,3),可覆盖分别68%、95%、99%的数据,此外的数据即可视为异常值。
- 分位数法:假设数据的下四分位数、上四分位数分别为Q1,Q2,则小于 Q 1 − n l Q R Q_1-nlQR Q1−nlQR,大于 Q 2 + n l Q R Q_2+nlQR Q2+nlQR 的数据即可认为是异常值。
缺失值的识别与处理:
data.isnull()
# 判断每个单元格是否是缺失值,返回与原来大小相同的表格,表格中是Boolean数据
data.isnull().any(axis = 0)
# 判断每一列是否存在缺失值,默认是行,此处使用axis参数限定为列
data.isnull().sum(axis = 0)
# 计算每一列缺失值的个数值
本质上讲,any()
实现了或(OR)运算,而all()
实现了与(AND)运算。
data.dropna(inplace = True)
# 删除法去除缺失值,删除掉所有的缺失值所在行
data.fillna(value = {'gender':data.gender.mode()[0],'age':data.age.mean(),'income':data.income.median()})
# 填充法去除缺失值,将性别缺失值替换为性别众数,年龄缺失值替换为年龄的平均数,收入的缺失值替换为收入的中位数
# 其中需要注意的是mode()函数返回一个列表,提取其中元素需要[0]
05 数据汇总
透视表汇总:
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None,
margins=False, dropna=True, margins_name='All')
- data:需要构造透视表的数据集
- values:指定需要拉入数值框的字段列表
- index:指定需要拉入行标签框的字段列表
- columns:指定需要拉入列标签框的字段列表
- aggfunc:指定数值的统计函数,默认为统计均值,也可以为numpy模块中的其他函数
- fill_value:指定一个标量用于填充缺失值
- margins:是否需要显示行和列的总计值,默认为False
- dropna:是否需要删除整列为缺失的字段,默认为True
- margins_name:指定行或列的总计名称,默认为All
分组汇总:
groupby
方法用于汇总前,设定被分组的变量,aggregate
方法基于groupby的结果做进一步的统计汇总。
在aggregate阶段,需要以字典形式传递参数,用于选择被统计变量和对应的统计方法。
# 通过groupby方法,指定被分组变量
grouped = data.groupby(by = ['color','cut'])
# 对分组变量进行统计汇总
result = grouped.aggregate({'color':np.size,'carcat':np.min,
'price':np.mean,'table':np.max})
# 调整变量名的顺序
result = pd.DataFrame(result, columns=['color','carcat','price','table'])
# 数据集的重命名
result.rename(columns={'color':'counts','carcat':'min_weight','price':'avg_price',
'face_width':'max_face_width'}, inplace=True)
06 数据的合并与连接
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)
- objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表
- axis:指定数据合并的轴,默认axis=0,表示合并多个数据的行,若为1,表示合并多个数据的列
- join:指定合并的方式,默认为outer,表示合并所有数据,inner表示合并公共部分数据
- join_axes:合并数据后,指定保留的数据轴
- ignore_index:是否忽略原数据集的索引,默认为False,若为True,则表示忽略原数据索引并生成新索引
- keys:为合并后的数据添加新索引,用于区分各个数据部分。
# 构造数据集df1,df2
df1 = pd.DataFrame({'name':['张三','李四','王五'],'age':[18,19,10],'gender':['男','女','男']})
df2 = pd.DataFrame({'name':['赵四','丁一'],'age':[20,21],'gender':['男','男']})
pd.concat([df1,df2],keys=['df1','df2'])
#.reset_index().drop(labels='level_1',axis=1).rename(columns = {'level_0':'class'})
# 若要通过concat完成行合并操作时,各项变量名必须相同,但顺序可以不同
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x,_y'))
- left、right:指定左右表
- how:指定连接方式,默认为inner内连,左连left,右连right,外连outer
- on:指定连接两张表的共同字段
- left_on、right_on:当两表中连接变量名不同时,需要分别声明
3.matplotlib
01 离散型数据的可视化
饼图的绘制:
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, labeldistance=1.1)
- x:指定数据源
- explode:指定饼图某些部分的突出显示,即爆炸式
- labels:为饼图增加标签说明
- colors:指定饼图的填充色
- autopct:自动添加百分比显示,可以采用格式化的方法显示
- pctdistance:设置百分比标签与圆心的距离
- labeldistance:设置标签与圆心的距离
# 导入第三方模块
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # 解决中文无法显示的一种方案
# 构造数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']
explode = [0,0.1,0,0,0]
# 绘制饼图
plt.pie(x=edu, labels=labels, explode=explode,
autopct='%.1f%%'#设置百分比格式,这里保留一位小数
)
# 显示图形
plt.show()
条形图的绘制:
bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label=None, ecolor=None)
- x:传递数值序列,指定条形图中x轴上的刻度值
- height:传递数值序列,指定条形图y轴的高度
- width:指定条形图的宽度,默认为0.8
- bottom:用于绘制堆叠条形图
- color:指定填充色
- edgecolor:指定边框色
- tick_label:指定条形图的刻度标签
- label:指定条形图的标签,一般用于添加图例
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
# 读入数据
GDP = pd.read_excel(r'GDP_province.xlsx')
# 设置绘图风格
plt.style.use('ggplot')
# 绘制条形图
plt.bar(x = range(GDP.shape[0]), # 指定条形图x轴的刻度值
height = GDP.GDP, # 指定条形图y轴的数值
tick_label = GDP.province, # 指定条形图x轴的刻度标签
color = 'steelblue', # 指定条形图的填充色
)
# 添加y轴的标签
plt.ylabel('GDP(万亿)')
# 添加条形图的标题
plt.title('省份GDP分布')
# 为每个条形图添加数值标签
for x,y in enumerate(GDP.GDP):
plt.text(x,y+0.1,'%s'%round(y,1),ha='center')
# 显示图形
plt.show()
# 对读入的数据做升序排序
GDP.sort_values(by = 'GDP', inplace = True)
# 绘制条形图
plt.barh(y = range(GDP.shape[0]),
width = GDP.GDP,
tick_label = GDP.province,
color = 'steelblue',)
# 添加x轴标签
plt.xlabel('GDP(万亿)')
# 添加条形图的标题
plt.title('省份GDP分布')
# 为每个条形图添加数值标签
for y,x in enumerate(GDP.GDP):
plt.text(x+0.1,y,'%s'%round(x,1),va='center')
plt.show()
Hurun = pd.read_excel('Hurun.xlsx')
# Pandas模块,水平交错条形图
Hurun_reshaper = Hurun.pivot_table(index = 'City',colummns = 'Year',values = 'Counts').reset_index()
# 对数据集降序排列
Hurun_reshaper.sort_values(by = 2016, ascending = False, inplace = True)
Hurun_reshape.plot(x = 'City', y = [2016,2017], kind = 'bar', color = ['steelblue','indianred'],
rot = 0,# 用于旋转x轴刻度标签的角度,0表示水平显示刻度标签
width = 0.8, title = '近两年五座城市亿万资产家庭数比较')
# 添加y轴标签
plt.ylabel('亿万资产家庭数')
plt.xlabel('')
plt.show()
02 连续型数据的可视化
直方图的绘制:
plt.hist(x, bins=10, normed=False, orientation='vertical', color=None, label=None)
- x:数据源
- bins:指定直方图条形的个数
- normed:是否将直方图的频数换成频率
- orientation:设置直方图的摆放方向,默认为垂直
Titanic = pd.read_csv('titanic_train.csv')
# 检查年龄是否有缺失(若数据存在缺失值,则无法绘制直方图)
any(Titanic.Age.isnull())
# 删除含有缺失年龄的观察
Titanic.dropna(subset = ['Age'], inplace = True)
# 绘制条形直方图
plt.hist(x = Titanic.Age,
bins = 20,
color = 'steelblue',
edgecolor = 'black')
# 添加x轴和y轴标签
plt.ylabel('频数')
plt.xlabel('年龄')
# 添加标题
plt.title('乘客年龄分布')
plt.show()
箱线图的绘制:
plt.boxplot(x, vert=None, whis=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None,showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)
- x:数据源
- vert:是否需要箱线图垂直摆放,默认为垂直摆放
- whis:指定上下须与上下四分位的距离,默认为1.5倍的四分位差
- patch_artist:是否填充箱体颜色,默认为False
- meanline:是否用线的形式表示均值,默认为False
- showmeans:是否显示均值,默认为False
- showcaps:是否显示箱线图顶端和末端的两条线,默认为True
- showbox:是否显示箱线图的箱体,默认为True
- showfliers:是否呈现异常值
- boxprops:设置箱体属性,如边框色、填充色等
- flierprops:设置异常值属性,如异常点形状、大小、颜色等
- medianprops:设置中位线的属性,如线的粗细、类型等
- capprops:设置上下须的属性,如颜色、粗细等
- whiskerprops:设置须的属性,如颜色、粗细、类型等
Sec_buildings = pd.read_excel(r"sec_buildings.xlsx")
Sec_buildings
# 绘制箱线图
plt.boxplot(x = Sec_buildings.price_unit, # 指定绘图数据
patch_artist = True,
showmeans = True,
boxprops = {'color':'black','facecolor':'steelblue'},
flierprops = {'marker':'o','markerfacecolor':'red','markersize':3},
meanprops = {'marker':'D','markerfacecolor':'indianred','markersize':4},
medianprops = {'linestyle':'--','color':'orange'},
labels = [''] # 删除x轴的刻度标签,否则图像显示刻度标签为1
)
plt.title('二手房单价分布的箱线图')
plt.show()
折线图的绘制:
plt.plot(x, y, linestyle, linewidth, color, marker, markersize, markeredgecolor, markerfacecolor, markeredgewidth, label, alpha)
03 关系型数据的可视化
散点图的绘制:
scatter(x, y, s=20, c=None, marker='o', alpha=None, linewidths=None, edgecolors=None)
- x:指定散点图的x轴数据
- y:指定散点图的y轴数据
- s:指定点的大小,默认为20,通过传入其他数值型变量,可以呈现气泡图
- c:指定点的颜色,默认为蓝色,也可以传入其他数值型变量,通过cmap参数的色阶表示数值大小
- marker:指定散点图点的形状,默认为空心圆
- alpha:设置点的透明度
- linewidths:设置散点边界线的宽度
- edgecolors:设置散点边界线的颜色
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
# 读入数据
iris = pd.read_csv(r'D:\笔记\python\数据分析\89a8d04fc3fbe10a0c7ad5d725a7374e\Python数据分析与挖掘【326789】数据类型不同,包装不同-离散型(一)\第10章 Python数据可视化\iris.csv',engine='python')#中文解决方案
# 绘制散点图
plt.scatter(x = iris.Petal_Width, y = iris.Petal_Length,
color = 'steelblue')
plt.xlabel('花瓣宽度')
plt.ylabel('花瓣长度')
plt.title('鸢尾花的花瓣长度与宽度之间的关系')
plt.show()
热力图的绘制:
seaborn.heatmap(data, cmap=None, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white')
- cmap:指定一个colormap对象,用于热力图的填色
- annot:指定一个bool类型的值或一个与data参数形状一样的数组,若为True,就在热力图的每个单元上显示数值
- fmt:指定单元格中数据的显示格式
- annot_fwt:有关单元格中数值标签的其他属性描述,如颜色、大小等
- linewidths:指定每个单元格的边框宽度
- linecolor:指定每个单元格的边框颜色
# 读入数据
Sales = pd.read_excel(r'D:\\笔记\\python\\数据分析\\89a8d04fc3fbe10a0c7ad5d725a7374e\\Python数据分析与挖掘【326789】数据类型不同,包装不同-离散型(一)\\第10章 Python数据可视化\\Sales.xlsx')
# 根据交易信息,衍生出年份和月份字段
Sales['year'] = Sales.Date.dt.year
Sales['month'] = Sales.Date.dt.month
# 统计每年各月份的销售总额(绘制热力图之前,必须将数据转换为交叉表形式)
Summary = Sales.pivot_table(index = 'month', columns = 'year', values = 'Sales', aggfunc = np.sum)
# 绘制热力图
sns.heatmap(data = Summary,# 指定绘图数据
cmap = 'PuBuGn', # 指定填充色
linewidths = .1, # 设置每个单元格的边框宽度
annot = True,# 显示数值
fmt = '.1e', # 以科学计算法显示数据
)
plt.title('每年各月份销售总额热力图')
plt.show()
04 组合图的绘制:
plt.subplot2grid(shape, loc, rowspan=1, colspan=1, **kwags)
- shape:指定组合图的框架形状,以元组形式传递,如2*3的矩阵可表示为(2,3)
- loc:指定子图所在位置,如shape中的第一行第一列可表示为(0,0)
- rowspan:指定某个子图需要跨几行
- cplspan:指定某个子图需要跨几列