Week 11
本周学习主要内容为Python数据学科相关(Matplotlib、Pandas)
学习内容
- 主要包括:Python数据分析、数据挖掘、机器学习、金融量化等
- 侧重内容:
- 数据清洗
- 数据可视化(画图表)
- 数据分析、文本挖掘
- 建模预测:机器学习、集成学习、深度学习
- 金融量化:策略重现、回测、实盘交易
- Pandas:数据处理和数据分析库
- Numpy:数值计算库
- Matplotlib/PyEcharts:绘图库、数据可视化
- scikit-learn:机器学习库
- Tensorflow:深度学习库
- 需要基础:
基础语法即可 – 变量、列表、字典操作,算术比较逻辑运算,分支、循环、函数,基本面向对象、其他相关
Python数据科学和人工智能技术栈
Excel派、SPSS派、MATLAB派、R派、Julia派……
Python派技术栈
- 环境和工具:Python原生环境/Anaconda/Miniconda
- 包和环境管理器:pip和conda
- 交互式编辑器:Jupyter-Notebook
- 标记语言:Markdown
- 文档工具:GotBook
- 数据分析
- Pandas:Python数据预处理、可视化和数据分析库(表格容器)
- 数据可视化
- Matplotlib:Python底层绘图库(多用于数据可视化)
- Echarts/PyEcharts:web数据可视化库,JS库
- Seaborn:Python上层数据可视化库
- 科学计算
- Numpy:树脂基短裤,第层,基础,N维数组容器
- SymPy:符号计算库,计算机代数系统,(符号计算,用计算机推导和计算数学公式)
- SciPy:科学计算函数库,集成大量科学计算用算法
- statsmodels:统计建模和计量经济学库
- 文本分析(非格式化数据分析,文本挖掘)
- Jieba:中文分词
- WordCloud:词云
- SnowNLP,TextBlob:情感分析
- Gensim:主题建模,文本相似度度量,词向量,发现文本语义结构
- NLTK:自然语言处理工具包
- 机器学习
- scikit-learn:Python机器学习库
- xgboost/lightGBM/CatBoost:集成学习库
- 深度学习
- Tensorflow:Python深度学习库,2016
- Keras:Python深度学习上层库(已被收入Tensorflow)
- PyTorch:Python深度学习库,2017(2018年4月与caffe2合并)
- 其他相关
- 数据获取:
- Web展示,模型应用
- Django:流行的大型Web框架
- Flask:简洁快速的Web框架
- 数据库相关
- 关系型数据库:MySQL(SQL非常重要)
- 非关系型数据库:MongoDB
- 大数据
- Hadoop
- Spark
Jupyter notebook使用快捷键
数据分析报告书写套路(模板,流水线,pipline)
- 背景介绍
- 情况介绍(公司情况、接单情况)
- 数据介绍
- 需求(分析什么)
- 数据载入清洗
- 数据分析
1. 描述性分析:
- 指标计算
- 数据可视化
- 反复进行
2. 探索性分析(建模预测),战略
- 结论
- 总结分析结果
- 意见建议
绘图库(Matplotlib)
- Python可视化:Matplotlib、seaborn、Pandas可视化
- Web可视化:Echarts、Pyecharts
为何绘图:
一个图表数据的直观分析:
- Matplotlib是最流行的Python二位底层绘图库,主要用作数据可视化图表绘制
- 模仿MATLAB创建
- 支持所有2D作图和部分3D作图
- 生成印刷质量图像
Matplotlib常用图表
折线图
- 用于显示随时间或有序类别的变化趋势
- 标记字符:标记线条中的点
- 线条颜色:color
- 线条风格:linestyle
- 线条粗细:linewidth
- 标记风格:marker
- 标记颜色:markercolor
- 标记尺寸:markersize
- 透明度:alpha
散点图/气泡图
- 但组数据,可以查看数据分布(不常用,最好采用直方图实现
- 多组数据,可以查看个数据之间是否存在相关性
- 坐标系中,每个值用一个点(x轴,y轴确定)表示
条形图/柱状图
为了比较各独立类别下单独数据的大小
饼图/扇形图
直方图
-
直方图是数据离散化的可视化
-
直方图是表达数据的分布情况的统计图表,一般用来表示同等区间内,某类数值出现的个数或频率(频率=出现次数/总数)
-
x轴表示分组数据,y轴表示分布情况
-
从频率分布直方图可以只管估计出:
- 众数:频率分布直方图中最高举行的底边中点的横坐标
- 中位数:吧频率分布直方图分成两个面积相等部分的平行于y轴的直线横坐标
-
直方图和柱状图的区别:
- 直方图:分区之间连续无间断,表示连续变量;值用矩形面积表示
- 条形图:各柱之间有间隙,表示孤立的、不连续的分类变量;只用矩形长度表示
-
直方图和柱状图的应用:
柱状图和直方图是数据可视化中最常用的图表
- 少量离散数据比较大小,使用柱状图
- 大量连续数据看分布,使用直方图(一般数据量30以上)
箱线图
- 又叫盒须图,是一种用作显示一组数据离散情况的统计图表,常用作多组数据的综合统计比较
- 四分位数的可视化:
第一四分位数(Q1),又叫“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;
第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;
第三四分位数(Q3),又叫“较大四分位数”,等于该样本中所有数值由小到大派鄂侯第75%的数字。
- 最大非异常值,上边线
- Q3,箱体上边缘上四分位数
- Q2,中位数线
- Q1,箱体下边缘下四分位数
- 最小非异常值,下边线
- 除此之外上下边缘外侧可能还有异常值
- Q3-Q1即四分位数差
- 大于Q3 + 1.5 x (Q3-Q1)或小于Q1 - 1.5 x (Q3-Q1)的值称为异常值
众数、中位数、平均数的区别
- 众数:出现频率最高的数
- 平均数:对极值非常敏感
- 中位数:对极值不敏感,95%置信区间
总结:
- 数据区间范围固定的,一般用平均值
- 数据区间范围不固定,一般用中位数或者95%置信区间
比赛打分之所以用平均数,利用平均值的敏感(中位数会出现大量的相同分数)
同时为了降低平均值的敏感程度,去掉最高和最低分
热力图
- 热力图以二维形式来展示数据大小,主要用于数据的重要程度 / 相关度展示
数据分析库:Pandas
Pandas库学习的内容
- 数据类型的操作(创建/增/查/改/删)
- 分组聚合/透视表/交叉表
- 数据清洗/规整
抽象和维度
维度:观察事物的角度
日常保存数据的数据格式:
- 0维:单值变量,一大堆字符串
- 1维:列表,字典(一层括号)
- 2维:Excel表格,MySQL数据库表
- 3维或以上:JSON,HTML,Mongodb数据库表
日常见过的数据形式:
- 表格式数据:Excel,CSV,MySQL数据表
- 字符串式数据:txt
- 图像
- 音频(时间序列)
- 视频
Pandas数据类型
Pandas各个数据类型的关系:
0维单值变量 -> 1维Series -> 2维DataFrame ->3维及以上
Pandas - Series数据操作
创建
Series可以存储不同类型的数据;
虽然可以,但建议存储同一类型,因为Series更向表格中的列,列应该是同一类型的;
如果存储数据类型不同,Series会变成所存储的最大类型.
查询
整体查询
- S.dtype:Series的整体数据类型
- S.shape:Series的形状(每个维度的值个数,用元组表示)
- S.count():Series里非空的元素个数
- S.value_counts():统计Series里非空元素值出现次数,并自动降序
- S.unique():Series里不重复的元素(去重)
查询值(values)和索引(index)
- 一个Series数据是有两个ndarray数组组成的
- 查询值
- 根据索引查询值:
- 切片查询:查询连续多值,切片查询
- 默认索引,包含起始值不包含结束值
- 自定义索引,包含起始和结束值;
原因是自定义索引没有顺序,难以确定索引前后的值
- 索引查询
- 查询不连续多值,索引查询(两层中括号)
- 索引不能混用
#class1[[‘hua’,3]] 报错
- 根据条件反查索引:
类Numpy数组操作和类Python字典操作
- Pandans数据可以执行全部Numpy数据操作(因为Pandas底层基于Numpy,所以通用)
- 也可以执行部分Python原生列表或字典操作(仅限于Pandas实现的操作)
- 保留字in操作:判断某索引是否存在
- 使用.get()方法:判断某索引是否存在,存在直接输出至,不存在输出定义值
修改
- 修改值,values
- 修改单个索引,index
- 正确操作:使用rename方式修改单个索引
- 修改整体索引,可以直接赋值
Pandas - DataFrame数据结构
DataFrame对象是Pandas最常用的数据类型
DataFrame对象是由多个Series增加一个索引后组成的一种表格类型数据结构
DataFrame对象既有行索引又有列索引
- 行索引,表明行不同,横向索引,叫index,0轴,axis=0
- 列索引,表明列不同,纵向索引,叫columns,1轴,axis=1
创建
- 列表创建:
- 字典创建:
- 字典内嵌套列表:要求内部列表等长
- 字典内嵌套几点:内部字典不需要等长
- 直接自定义字典或Series自带的行列索引,相当按索引查询(了解)
使用index/columns属性自定义已有索引的DF索引,相当于查询(已有的会查到,没有的缺失值)
原因是:是用字典定义DataFrame,他的行列索引都已经被自定义过了(字典的键),再次修改就相当于查询
查询(整体查询)
属性查询
常用属性:
a.shape:表格形状,行数列数
a.dtypes:列数据类型
a.index:行索引
a.columns:列索引
a.values:对象值,二维ndarray数组
整体数据情况
- a.info():整体信息,查看数据是否异常,有没有缺失值,列数据类型是否正确
- a.describe():整体统计指标
- a.head():前五行
- a.tail():后五行
整体信息,查看数据是否异常
重要,每次数据分析前先用他查询数据问题
表格快速综合统计指标
用来查看数据整体统计分布情况(兼具发现数据异常功能)
- count,计数(非缺失值)
- mean,平均值
- std,标准差
- 四分位数:min,q1,q2(中位数),q3,max
表头和表尾
直接输出表格,默认输出前三十行和后三十行(列相同)
#注:Pandas默认输出表格前十列和后十列,如想输出更多可以执行:pd.set_option(‘display.max_columns’,500
内容查询
- 类列表/字典/ndarray数组的查询方式
- 功能简陋,一般仅用于查询单列
DataFrame原生查询方式(推荐)
上面中括号的索引容易产生歧义(要索引列还是行?),只能应用于非常简单的查询,复杂的要用DaraFrame原生查询方式
查询(专用查询 - 索引和切片)
Pandas专用查询方式(经过优化,推荐)
三种查询方式:
索引和切片查询,两种查询方式:
- a.loc[行,列],标签索引,自定义索引
- a.iloc[行,列],位置索引,默认索引
参数书写顺序都是先行后列
- 索引查询: 用于不连续(行列有间隔)行列块区查询
- 切片查询:用于查询连续的行列块
索引查询和切片查询的区别
- 索引插片式和查询不连续的行列数据
- 切片查询适合查询连续行列数据
索引查询可以实现切片查询的所有功能,只是有书写效率问题
- 用索引查询查连续数据,需要将每个索引都写上,效率低
- 切片查询连续数据,只要写起始和结束索引即可
查询时:优先使用切片拆线呢,无法实现功能时在使用索引查询
查询(专用查询 - 过滤查询)
索引查询和切片查询,都是通过索引查询值
过滤查询(布尔查询)
通过值查询索引
通过布尔值过滤值、筛选数据来查询
- 过滤查询不通过索引,而是通过值查询
- 用于结果索引不确定的查询
- 通过运算所得布尔值对擦汗寻结果进行过滤
类list/类字典查询方式
where过滤方法(了解)
另一种简洁的布尔查询写法
原生布尔查询条件
- 原生的布尔查询,需要每列单独判断条件,然后用逻辑运算符组合条件,得出最终结果
- where过滤法过滤:现将所有需要的判断条件的列抽出来,整体判断,得出最终结果
- 优点:写法简洁
- 缺点:where过滤所有列的判断条件,只能有一个,使用受限
where和mask函数,查询和替换(了解)
where替换较为常用:
a.where(b > 60,c)
- 当判断条件为True时返回a
- 但判断条件为False时返回c
Pandas数据操作:其他操作 - 命名和遍历(了解)
- Pandas对象的命名:name
- Pandas对象的遍历
Pandas对象的命名:name
- Sereis和DataFrame对象本身、索引都可以命名
Sereis命名的用处
- Series的name会变成DataFrame列索引
- Sereis的索引name会变成DataFrame的行索引
Pnadas对象的遍历
Pandas数据存取
数据的输入和输出是Pandas的基础操作
Pandas可以存取多种介质类型的数据,常见的有:
- 文本类数据:CSV,JSON
- 二进制磁盘数据:Excel,pkl,HDF5
- 数据库:SQL(略)
- Web API数据:HTML
- 其他:内存
文本类数据文件读入Pandas时会自动推断每列数据类型(类型判断)并转化,
二进制类数据文件会在格式中存储数据类型
对Pandas不能直接支持或不方便使用的数据格式,
可以使用支持软件将其转为CSV或者使用Pandas读写,如SPSS文件
- 中小型数据(几百M以下的数据),一般存为csv格式
- 发给别人的数据,一般存为xlsx格式
- 大型数据(几百M以上的数据),一般存为HDF5格式
什么叫大数据:
- 个人认为:凡是超过一台电脑处理能力的数据就算大数据
- 计算机处理数据的大小受限于内存大小
- 如果需要同时使用一台以上计算机处理数据,使用的技术栈和一台电脑处理数据完全不同
- 超出一台电脑后使用的数据处理技术是大数据技术,不再是单机数据处理技术
- 单机数据技术:Excel,SPSS,Matlib,R,Python,SAS……
- 大数据使用的是Java技术栈:Hadoop,Spark(Scala)……
视图和副本(类似浅拷贝深拷贝)
Pandas对象修改的视图模式和副本模式
- 视图模式:多个变量指向同一内存数据
- 修改一个变量,另一个变量也会变
- 操作如:将一个对象整体赋值给另一个变量
- 副本模式:每个变量都指向独立的内存数据
- 修改一个变量,另一个变量值不会变
- 操作如:将一个对象查询的一部分赋值给另一个变量
- 视图模式:两个变量对应的内存地址相同,秀发i一个变量,另一个变量也会改变
- 副本模式:修改一个变量不会影响另一个变量
- 当使用copy()将一个对象赋值给另一个变量时
- 或者擦汗寻一个对象的“一部分”(不是整个对象)把结果赋值给另一个变量时
- 注意赋值用的查询要使用原生loc语法,不宜使用类似列表字典的查询方式,否则修改时会报警告(但能修改成功)
链式调用错误(了解)
- 整体调用,一步到位,查询效率高,修改不会出错
- 链式调用,多部操作,查询效率低,修改容易出错
尽量避免使用链式调用方式修改,很容易错误
Pandas存取CSV
CSV(Comma-Seperated Values,逗号分隔值)
以纯文本形式存储表格数据的一种格式
二维表格数据结构
CSV是一种简单、通用的文本格式,常用于在不同程序和环境之间中转表格数据,这些程序本身是在不兼容的格式上进行操作的(往往是私有的和/或无规范的格式),基本所有数据类软件和环境都支持读写CSV文件
- CSV:
- JSON:
- 多维数据格式
- 冗余,费空间
- 主要用于编程、数据交换领域
CSV写入
默认utf-8格式
保存其他格式可以自行设置参数encoding
注意:Excel打开utf-8的csv文件,中文会乱码,建议保存为GBK
CSV读取
注意文本文件编码格式的问题
utf-8,默认支持
其他编码,需要手动设置encoding参数
注意:utf-8格式的csv文件,Excel读取时中文会乱码
读取csv常见设置
关于文本文件编码问题:
- 计算机内部文件储存基本是两种文件:二进制文件、文本文件
- 实际只有一种文件格式:二进制
- 文本文件也是二进制格式
- 人们问了能看懂和编辑某些文件,发明了编码,把二进制转换为人能看懂的字符
- 只有文本文件(非英文字符)有编码问题,纯二进制没有编码
- 国际编码:Ascii,UTF-8
- 国内编码:gb2312,gbk,gb18030
a3 = pd.read_csv(
'data/foo.csv',
sep=',',
na_values=['male'],
keep_default_na=False
)
合并时间列及自定义某些列为行索引
多用于时间序列,金融数据分析
参数:parse_dates
- 尝试将数据解析为日期
- 可以使用列表指定需要解析的一组列名,如果列表元素为字典包含的列表或元组,会将多个列组合到一起在解析日期(如日期和时间分别在两列的情况)
参数:keep_date_col
- 如果连接多列解析日期,保存参与链接的列,默认False
数据:aaa.csv
注意:使用txt记事本保存csv格式是,注意编码
JSON
JSON(JavaScript Object Notation)是通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一
Json和CSV比较:
- JSON是多位数据文件,SCV是二维数据文件
- JSON数据比较冗余,体积较大,CSV精简,体积小
- JSON多用于WEB数据交互,CSV多用于数据领域不同环境切换的数据交互
如果JSON数据格式维度超过2维,转为DataFrame后,只能将0/1维转为表格,其他维度的JSON会以Python字典格式存入表格单元格
Pandas存取pkl
- pkl是Python专有的二进制数据存储格式,可以存储原生的Python数据类型
使用HDF5格式
科学领域大数据存储的通行标准,如天文、物理、地球科学等
XML 和HTML:Web信息收集
网页中有多个表格的,返回列表,可按列表索引逐个输出
- 有些网站由于网络原因、反爬虫、服务器原因导致无法抓取网页内容,400、500错误,这时可以将网页另存到本地后读取
- 有些网站的表格HTML结构复杂混乱,导致解析表格结构出错,只能手动处理
Pandas从剪贴板(内存)读取数据
Pandas分组聚合 - 基础(重要)
没有Pandas,Python做不了数据分析
没有分组聚合,Pandas做不了指标计算(描述性分析:指标计算/可视化)
- 分组聚合(透视表/交叉表)
- 数据分析阶段:
- 数据规整(清洗)后,下一阶段就是分组聚合
- 对数据集分组并对各组应用一个函数是数据分析中的重要环节
- 一般将数据准备好后,首先就是计算分组统计
sql能够方便的链接、过滤、转换和聚合数据,但sql能执行的分组运算种类有限,Pandas强大灵活的多
数据聚合
- 一般指应用某些方法(自定义的聚合函数或系统自带Pandas的统计方法等)给数据降维
- 最常用的聚合函数:
- 平均值:.mean()
- 个数:.size() (交叉表)
单列或多列聚合
对于大数据集,很可能只需要对部分列进行聚合
下列三种写法结果一样:
- 分组聚合参数,传入标量形式的单个列名,返回Series
- 分组聚合参数,传入列表或数组,返回DataFrame(默认传入所有列)
数据分组
分组聚合:groupby(),一般指以下一个或多个操作步骤的集合:
- Splitting 分组:将列分割成n组
- Applying 应用:将每个分组应用聚合函数
- Combining 合并:合并分组和聚合的结果