1. Python数据分析介绍及环境搭建
1.1python数据分析简介【了解】
1.1.1 python做数据分析的优势
-
可以独立完成数据分析的各种任务
-
功能强大,有海量的开源包(pandas,numpy...)
-
处理海量数据效率高
-
开源免费
1.1.2 常用python数据分析开源库
-
numpy:用于数组计算
-
pandas:分析结构化数据的工具集
-
series:类似一维数组的对象(一行数据或者一列数据)
-
dataframe:表格型数据结构(有行有列的数据)
-
-
matplotlib,seaborn:可视化开源库
-
scikit-learn:基于python语言的机器学习开源库
-
jupyter notebook:不是开源库,是数据分析的首选开发环境,类似于pycharm
1.2 python数据分析环境搭建
1.2.1 anaconda简介【了解】
-
是数据分析平台
-
可以管理安装包和虚拟环境
1.2.2 anaconda的虚拟环境管理
-
概念:是一个包含了特定 Python 解析器以及一些软件包的自包含目录【了解】
-
作用【知道】
-
隔离不同python版本或者相同开源库的不同版本
-
能够让不同版本的代码在不同的虚拟环境中运行
-
-
虚拟环境常用终端行命令【掌握】
# 创建虚拟环境 python=3.8 指定python版 conda create -n 虚拟环境名称 python=3.8 # 进入虚拟环境 conda activate 虚拟环境名称 # 退出虚拟环境 conda deactivate # 删除虚拟环境 conda remove -n 虚拟环境名称 --all # 查看已创建的虚拟环境 conda env list
1.2.3 anaconda的包管理功能
# 安装python的第三方包 pip install 包名 # 卸载python的第三方包 pip uninstall 包名 # 安装其他包速度慢可以指定国内镜像 # 阿里云:https://mirrors.aliyun.com/pypi/simple/ # 豆瓣:https://pypi.douban.com/simple/ # 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/ # 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/ pip install 包名 -i https://mirrors.aliyun.com/pypi/simple/ #通过阿里云镜像安装
1.2.4 jupyter notebook的使用
-
终端启动
这种方式先启动cmd,通过切换虚拟环境和磁盘位置,再启动Jupyter notebook
# 可选操作,切换虚拟环境,使用不同的python解释器和包,默认使用base环境 conda activate 虚拟环境名字 # 切换磁盘位置,到指定目录下启动 cd d:/test # 启动jupyter notebook jupyter notebook # 将终端网址复制到浏览器 # http://127.0.0.1:8888/?token=b37f5e4da9892205efd9d87db55260054232ddc0ebb25e78
-
常用快捷键【知道】
-
Jupyter Notebook中分为两种模式:命令模式和编辑模式
-
两种模式通用快捷键
-
Shift+Enter
,执行本单元代码,并跳转到下一单元 -
Ctrl+Enter
,执行本单元代码,留在本单元
-
-
按ESC进入命令模式
-
Y
,cell切换到Code模式 -
M
,cell切换到Markdown模式 -
A
,在当前cell的上面添加cell -
B
,在当前cell的下面添加cell -
双击D
:删除当前cell
-
-
编辑模式:按Enter进入,或鼠标点击代码编辑框体的输入区域
-
回退:
Ctrl+Z
(Mac:CMD+Z) -
补全代码:变量、方法后跟
Tab键
-
为一行或多行代码添加/取消注释:
Ctrl+/
(Mac:CMD+/)
-
-
-
使用markdown
-
在命令模式(ESC)中,按M即可进入到Markdown编辑模式
-
markdown基本语法:标题和缩进
# 一级标题 ## 二级标题 ### 三级标题 - 一级缩进 - 二级缩进 - 三级缩进
-
1.3 pandas dataframe入门
1.3.1导包并加载数据【知道】
import pandas as pd df = pd.read_csv('.../xxx.csv') df = pd.read_csv('.../xxx.tsv',sep='\t') ...
-
csv和tsv文件的区别
-
csv是以逗号作为行内数据的分隔符
-
tsv是以\t(table)作为行内数据的分隔符
-
二者都是以换行符\n为行与行之间的分割
-
-
Pandas导出导入数据
-
pd.read_xxx()
读取(导入)数据注意是pandas.read_xxx -
df.to_xxx('.../xxx.xxx')
保存(导出)数据注意是dataframe.to_xxx
-
1.3.2 查看部分数据【重要】
-
加载列数据
# 加载一列数据 df['列名'] # 加载多列数据 df[['列名1','列名2','列名3'...]]
-
加载行数据或者行列部分数据
# 通过行索引序号加载前五条数据,head(n=),默认n=5,可以手动传入想查看的行数 df.head() # # 通过行索引序号加载后五条数据,tail(n=),默认n=5,可以手动传入想查看的行数 df.tail()
-
loc:根据行索引标签/值加载行数据,还可以通过切片方法获取数据,左闭右闭
# 加载一行数据 df.loc['行索引值'] # 加载多行数据 df.loc[['行索引值1','行索引值2','行索引值3'...]] df.loc['行索引值1':'行索引值2'] # 加载某行某列数据 df.loc[['行索引值'],['列索引值']] # 加载多行多列 df.loc[['行索引值1','行索引值2'...],['列索引值1','列索引值2'...]] df.loc['行索引值1':'行索引值2','列索引值1':'列索引值2']
-
iloc:根据行索引序号加载行数据,还可以通过切片方法获取数据,左闭右开
# 加载一行数据 df.iloc['行索引序号'] # 加载多行数据 df.iloc[['行索引序号1','行索引序号2','行索引序号3'...]] df.iloc['行索引序号1':'行索引序号2'] # 加载某行某列数据 df.iloc[['行索引序号'],['列索引序号']] # 加载多行多列 df.iloc[['行索引序号1','行索引序号2'...],['列索引序号1','列索引序号2'...]] df.iloc['行索引序号1':'行索引序号2','列索引序号1':'列索引序号2']
-
1.3.3 分组聚合【重要】
-
分组聚合表达式
# 对一列分组一列聚合 df.groupby('分组的列名')['聚合的列名'].聚合函数() # 对多列分组多列聚合 注意多列分组聚合时,聚合部分为两个列表,否则报错 df.groupby(['分组的列名1','分组的列名2'...])[['聚合的列名1','聚合的列名2'...]].聚合函数()
-
常用的聚合函数
sum() # 求和 mean() # 求平均 std() # 标准差 max() # 最大值 min() # 最小值 count() # 非空值个数 nunique() # 唯一值个数
1.4 pandas数据结构
1.4.1 Series常用操作【知道】
-
Series创建:传入一个Python列表
-
如果传入的数据类型是统一的数字,那么最终的dtype类型是int64
-
如果传入的数据类型是统一的字符串,那么最终的dtype类型是object
-
如果传入的数据类型是多种类型,那么最终的dtype类型也是object
-
# data=,传入要python列表;index=指定行索引,不传的话行索引默认为0,1,2... pd.Series(data=,index=) # 例子1 s = pd.Series(['banana', 42]) # 输出结果如下 0 banana 1 42 dtype: object #例子2 s = pd.Series(['Wes McKinney','Male'],index = ['Name','Gender']) # 输出结果如下 Name Wes McKinney Gender Male dtype: object
-
Series常用属性
s.index # 获取行索引,属性 s.keys() # 获取行索引,方法 # 属性后面不加(),方法后面加() s.values # 获取值
-
Series常用方法
s.mean() # 平均值 s.max() # 最大值 s.min() # 最小值 s.std() # 标准差 s.value_counts() # 不同值(不同类别)的条目数量 s.count() # 非空值个数 s.describe() # 输出数值列统计描述:①count非空值个数,②mean平均值,③std标准差,④max最小值,⑤25%四分之一分位值,⑥50%二分之一分位值,⑦75%四分之三分位值,⑧最大值 # 输出非数值列统计描述:①count非空值个数,②unique唯一值个数,③top出现次数最多的值,④freq出现最多值的次数
-
通过布尔值列表获取Series部分数据
s[[True,False,True,False]] # 返回为True的值,最后返回两个值
-
Series运算
-
series和数值型变量计算
-
变量和series中的每个元素逐一进行计算
-
-
两个Series之间计算
-
根据索引匹配规则进行计算,相同的索引进行计算,不同的索引无法计算,用NaN填充
-
-
1.4.2 DataFrame常用操作【重要】
-
常用属性和方法
df.shape # 查看行数,列数 df.size # 查看数据个数 len(df) # 查看数据行数 df.count() # 查看各列非空值个数 df.max() # 查看各列最大值,数值列返回最大值,非数值列返回出现次数最多的值 df.min() df.describe() # 返回数值列统计描述
-
DataFrame的布尔索引
-
同Series一样,DataFrame也可以使用布尔索引获取数据子集
-
# 获取前5行数据中的第1、2、4个 movie.head()[[True,True,False,True,False]]
-
dataframe的运算
-
当DataFrame和数值进行运算时,DataFrame中的每一个元素会分别和数值进行运算
-
两个DataFrame之间进行计算,和series一样会根据索引的值进行对应计算
-
当两个DataFrame索引值不能对应时,不匹配的会返回NaN
-
DataFrame中如果有非数值列,只能进行相加或者相乘的操作,对非数值列进行复制,其他计算会发生报错
-
-
指定某列为DataFrame索引
df.set_index('列名') # 括号里列为指定索引列 pd.read_csv('path',index_col='列名') # 加载数据时通过index_col指定某列为df的索引 df.reset_index() # 重置索引,变为0,1,2,3...
-
修改行名列名
# 方法一 df.rename(index={'原行名1':'新行名1','原行名2':'新行名2'...},columns={'原列名1':'新列名1','原列名2':'新列名2'...},inplace=True) # index=,columns= 后跟要修改的行列名字典 # inplace=True 在源数据上修改,默认False,在内存或者副本上修改,源数据并没有修改 # 涉及到df修改删除操作,不指定inplace=True,默认源数据不会进行修改,或者将修改的数据重新保存为一个变量名 # 方法二 将df.index 和 df.columns属性提取出来,修改之后,再赋值回去
-
添加删除插入
-
通过
dataframe['列名']
添加新列,添加至最后df['新列名'] = 常数 df['新列名'] = df['列名1'] + df['列名2'] # 数值列加减乘除都可以,一行一行计算
-
删除列
df.drop('列名',axis='columns',inplace=True) # inplace=True源数据上删除,axis='columns',默认按行删除,axis='index'
-
插入列
df.insert(loc=列下标数字, column='列名', value=该列所有的值) # loc= 插入列的位置,按列索引序号 # column= 新插入列的名字 # value= 新插入列的值,可以是常用,也可以是计算完的结果
-
1.4.3 导出导入数据【重要】
-
导入加载数据
pd.read_xxx('文件路径') # 常用方法 read_csv(),read_excel() # 加载mysql数据库数据 # 方法一:用DBAPI构建数据库链接engine import pandas as pd import pymysql conn = pymysql.connect(host='localhost', user='root', password='', database='database_name') df = pd.read_sql("select * from table_name",con=conn) # 方法二:用sqlalchemy构建数据库链接engine import sqlalchemy from sqlalchemy import create_engine #connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}'.format('root', '', 'localhost', 3306, 'nowcoderdb') engine=create_engine(connect_info) df=pd.read_sql("select * from table_name",con=engine)
-
导出数据
pd.to_xxx('文件路径') # 常用方法 to_csv(),to_excel() # 导出数据到msyql数据库 import sqlalchemy from sqlalchemy import create_engine #connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}'.format('root', '', 'localhost', 3306, 'nowcoderdb') engine=create_engine(connect_info) df.to_sql('表名',engine,if_exists='') # if_exists='',replace:删除表,重新创建保存数据(覆盖数据),append:向表中追加数据
1.5 Pandas数据分析入门
-
describe() 【知道】
-
默认打印数据值列统计描述
-
打印非数值列统计描述
import numpy as np df.describe(include=[np.object, pd.Categorical]) # np.object 字符串类型 # pd.Categorical dataframe特有的类别类型
-
-
info() 【知道】
-
返回所有字段的条目数量、数据类型、是否缺失,及当前数据集整体的内存占用情况
-
常用排序方法
-
nlargest() 【知道】
df.nlargest(n,columns) # 根据指定列的值由大到小排列,返回n行数据
-
nsmallest() 【知道】
df.nsmallest(n,columns) # 根据指定列的值由小到大排列,返回n行数据
-
sort_values() 【重要】
# 对一列进行排序 ascending默认升序True,False为降序 df.sort_values(by='列名',ascending='') # 对多列进行排序 # 多列排序时,ascending 参数传入一个列表,排序参数也是一个列表,并且一一对应 df.sort_values(by=['列名1','列名2'...],ascending='') df.sort_values(by=['列名1','列名2'...],ascending=[True,False...])
-
-
去重 【重要】
# 删除列名1,列名2...相同的数据,默认保留第一条数据 df.drop_duplicates(subset=['列名1','列名2'...])