29期第十一周笔记

Week 11

本周学习主要内容为Python数据学科相关(Matplotlib、Pandas)

学习内容

  • 主要包括:Python数据分析、数据挖掘、机器学习、金融量化等
  • 侧重内容:
  1. 数据清洗
  2. 数据可视化(画图表)
  3. 数据分析、文本挖掘
  4. 建模预测:机器学习、集成学习、深度学习
  5. 金融量化:策略重现、回测、实盘交易
  • 侧重库:
  1. Pandas:数据处理和数据分析库
  2. Numpy:数值计算库
  3. Matplotlib/PyEcharts:绘图库、数据可视化
  4. scikit-learn:机器学习库
  5. 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使用快捷键

29期第十一周笔记_第1张图片

数据分析报告书写套路(模板,流水线,pipline)

  1. 背景介绍
    - 情况介绍(公司情况、接单情况)
    - 数据介绍
    - 需求(分析什么)
  2. 数据载入清洗
  3. 数据分析
    1. 描述性分析:
    - 指标计算
    - 数据可视化
    - 反复进行
    2. 探索性分析(建模预测),战略
  4. 结论
    - 总结分析结果
    - 意见建议

绘图库(Matplotlib)

  • Python数据可视化学习内容:
  1. Python可视化:Matplotlib、seaborn、Pandas可视化
  2. Web可视化:Echarts、Pyecharts

为何绘图:

一个图表数据的直观分析:

  • 可视化前
  • 可视化后

  • Matplotlib是最流行的Python二位底层绘图库,主要用作数据可视化图表绘制
  • 模仿MATLAB创建
  • 支持所有2D作图和部分3D作图
  • 生成印刷质量图像

Matplotlib常用图表

折线图

  • 用于显示随时间或有序类别的变化趋势
  • 标记字符:标记线条中的点
    • 线条颜色:color
    • 线条风格:linestyle
    • 线条粗细:linewidth
    • 标记风格:marker
    • 标记颜色:markercolor
    • 标记尺寸:markersize
    • 透明度:alpha

散点图/气泡图

  • 但组数据,可以查看数据分布(不常用,最好采用直方图实现
  • 多组数据,可以查看个数据之间是否存在相关性
  • 坐标系中,每个值用一个点(x轴,y轴确定)表示

条形图/柱状图

  • 条形图(横向)
    • 粗细属性:height
    • 条形图的x、y轴坐标翻转
  • 柱状图(竖向)

为了比较各独立类别下单独数据的大小

饼图/扇形图

  • 用于显示各项相对总和的百分比大小

直方图

  • 直方图是数据离散化的可视化

  • 直方图是表达数据的分布情况的统计图表,一般用来表示同等区间内,某类数值出现的个数或频率(频率=出现次数/总数)

  • x轴表示分组数据,y轴表示分布情况

  • 从频率分布直方图可以只管估计出:
    - 众数:频率分布直方图中最高举行的底边中点的横坐标
    - 中位数:吧频率分布直方图分成两个面积相等部分的平行于y轴的直线横坐标

  • 直方图和柱状图的区别:

    • 直方图:分区之间连续无间断,表示连续变量;值用矩形面积表示
    • 条形图:各柱之间有间隙,表示孤立的、不连续的分类变量;只用矩形长度表示
  • 直方图和柱状图的应用:
    柱状图和直方图是数据可视化中最常用的图表

    • 少量离散数据比较大小,使用柱状图
    • 大量连续数据看分布,使用直方图(一般数据量30以上)

箱线图

  • 又叫盒须图,是一种用作显示一组数据离散情况的统计图表,常用作多组数据的综合统计比较
  • 四分位数的可视化:

第一四分位数(Q1),又叫“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;
第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;
第三四分位数(Q3),又叫“较大四分位数”,等于该样本中所有数值由小到大派鄂侯第75%的数字。

  • 箱线图主要包括五个统计量(从上到下,由高到低):
  1. 最大非异常值,上边线
  2. Q3,箱体上边缘上四分位数
  3. Q2,中位数线
  4. Q1,箱体下边缘下四分位数
  5. 最小非异常值,下边线
  6. 除此之外上下边缘外侧可能还有异常值
  • Q3-Q1即四分位数差
  • 大于Q3 + 1.5 x (Q3-Q1)或小于Q1 - 1.5 x (Q3-Q1)的值称为异常值

众数、中位数、平均数的区别

  • 众数:出现频率最高的数
  • 平均数:对极值非常敏感
  • 中位数:对极值不敏感,95%置信区间

总结:

  • 数据区间范围固定的,一般用平均值
  • 数据区间范围不固定,一般用中位数或者95%置信区间

比赛打分之所以用平均数,利用平均值的敏感(中位数会出现大量的相同分数)
同时为了降低平均值的敏感程度,去掉最高和最低分

热力图

  • 热力图以二维形式来展示数据大小,主要用于数据的重要程度 / 相关度展示

数据分析库:Pandas

  • Pandas(panel data & Data Analysis):最流行的Python数据分析库
    基于numpy,专用于数据预处理和数据分析的Python第三方库,最适合处理大型结构化表格数据

  • 三种常用功能:

    • 数据预处理
    • 数据分析
    • 数据可视化
  • Pandas两大数据类型:

    • Series:一维
    • DataFrame:二维

Pandas库学习的内容

  • 数据类型的操作(创建/增/查/改/删)
  • 分组聚合/透视表/交叉表
  • 数据清洗/规整

抽象和维度

维度:观察事物的角度

日常保存数据的数据格式:

  • 0维:单值变量,一大堆字符串
  • 1维:列表,字典(一层括号)
  • 2维:Excel表格,MySQL数据库表
  • 3维或以上:JSON,HTML,Mongodb数据库表

日常见过的数据形式:

  • 表格式数据:Excel,CSV,MySQL数据表
    • Pandas表格数据分析
  • 字符串式数据:txt
    • 文本分析
  • 图像
  • 音频(时间序列)
  • 视频

Pandas数据类型

Pandas各个数据类型的关系:

0维单值变量 -> 1维Series -> 2维DataFrame ->3维及以上

Pandas - Series数据操作

  • 创建/增/删/改/查

创建

  • 列表创建:默认索引,自定义索引

Series可以存储不同类型的数据;
虽然可以,但建议存储同一类型,因为Series更向表格中的列,列应该是同一类型的;
如果存储数据类型不同,Series会变成所存储的最大类型.

  • 字典创建:

    • 索引就是字典的键
    • 创建时自定义索引会替换字典索引
  • 其他创建:

    • 标量创建
    • 序列创建
    • Numpy的序列函数创建

查询

整体查询
  • S.dtype:Series的整体数据类型
  • S.shape:Series的形状(每个维度的值个数,用元组表示)
    • len(S):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

创建

  • 列表创建:
    • ndarray数组创建
  • 字典创建:
    • 字典内嵌套列表:要求内部列表等长
    • 字典内嵌套几点:内部字典不需要等长
      • 字典内嵌套Series:等同嵌套字典
  • 直接自定义字典或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的基础操作

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=',', #指定分隔符,csv默认都好,如果是table表格数据一般为 \t
    
    #列索引
#    header=0, #列索引,默认0将第一行设为表头(其他行号也可)
#    header=None, #None不降第一行设为表头(列索引)
#    header=[0,1,2], #[0,1]列表可将多行同时设为表头(层次化索引)
#    names=['x','姓名','性别','年龄','身高','体重','地址','成绩'], #配合header=0,自定义列索引
#    
    #行索引
#    index_col=None, #行索引,默认值None:不使用数据列,而是使用系统自带索引
#    index_col=0, #把第0列作为行索引
#    index_col='name', #(自定义列 作为行索引)
#    index_col=[0,1,2], #默认索引,多列,层次化索引
#    index_col=['name','sex','age'], #自定义索引,多列
#    
    #读取指定的行和列
#    usecols=[0,2,4], #读取指定列,默认索引
#    usecols=['name','address','grade'], #读取指定列,自定义索引
#    nrows=3, #读取前几行
#    skiprows=3, #从表格开始算起,忽略的行
#    skiprows=[2,4], #[2,4]跳过文件第2/4行
#    skipfooter=2, #从表格末尾算起忽略的行,必须配合engine='python'否则会报警告
#    engine='python', #引擎,c更快(默认编码是utf-8),python更完善(默认编码GBK),要设置编码
#    encoding='utf-8', #编码,默认utf-8,隐情史python时需要手动设置,例如GBK
    
    #替换空值
    na_values=['male'], #将csv中某些字符替换为空值
    keep_default_na=False #默认True同时使用系统自带空值替换和自定义空值,如NA,N/A等,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从剪贴板(内存)读取数据

  • 多用于将网页表格内容直接转换为DataFrame

Pandas分组聚合 - 基础(重要)

没有Pandas,Python做不了数据分析
没有分组聚合,Pandas做不了指标计算(描述性分析:指标计算/可视化)
  • 分组聚合(透视表/交叉表)
  • 数据分析阶段:
    • 数据规整(清洗)后,下一阶段就是分组聚合
    • 对数据集分组并对各组应用一个函数是数据分析中的重要环节
    • 一般将数据准备好后,首先就是计算分组统计

sql能够方便的链接、过滤、转换和聚合数据,但sql能执行的分组运算种类有限,Pandas强大灵活的多

数据聚合

  • 一般指应用某些方法(自定义的聚合函数或系统自带Pandas的统计方法等)给数据降维
  • 最常用的聚合函数:
    • 平均值:.mean()
    • 个数:.size() (交叉表)
单列或多列聚合

对于大数据集,很可能只需要对部分列进行聚合

下列三种写法结果一样:
- 分组聚合参数,传入标量形式的单个列名,返回Series
- 分组聚合参数,传入列表或数组,返回DataFrame(默认传入所有列)

数据分组

分组聚合:groupby(),一般指以下一个或多个操作步骤的集合:

  • Splitting 分组:将列分割成n组
  • Applying 应用:将每个分组应用聚合函数
  • Combining 合并:合并分组和聚合的结果

你可能感兴趣的:(python)