数据分析 | 三剑客浅尝一下~

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 Q1nlQR,大于 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:指定某个子图需要跨几列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ouroboroszzs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值