文章目录
- 前言
-
- IPython
-
- 使用IPython的两种方式
- IPython的帮助和文档
- IPython中的快捷键
- IPython 魔法命令
- 输入输出历史
- IPython和shell命令
- 错误和调试
- 代码的分析和计时
- NumPy入门
-
- Python中的数据类型
- NumPy数组基础
- NumPy数组的计算:通用函数
- 聚合:最小值、最大值和其他值
- 数组的计算:广播
- 比较、掩码和布尔逻辑
- 花哨的索引
- 数组的排序
- 结构化数据:NumPy的结构化数组
- Pandas数据处理
-
- Pandas对象简介
- 数据取值与选择
- Pandas数值运算方法
- 处理缺失值
- 层级索引
- 合并数据集:Concat与Append操作
- 合并数据集:合并与连接
- 累计与分组
- 数据透视表
- 向量化字符串操作
- 处理时间序列
- 高性能Pandas:eval()与query()
- Matplotlib数据可视化
-
- Matplotlib常用技巧
- 两种画图接口
- 简易线形图
- 简易散点图
- 可视化异常处理
- 密度图与等高线图
- 频次直方图、数据区间划分和分布密度
- 配置图例
- 配置颜色条
- 多子图
- 文字与注释
- 自定义坐标轴刻度
- Matplotlib自定义:配置文件与样式表
- 用Matplotlib画三维图
- 用Basemap可视化地理数据
- 用Seaborn做数据可视化
- 机器学习
-
- 什么是机器学习
- Scikit-Learn简介
- 超参数与模型验证
- 特征工程
- 专题:朴素贝叶斯分类
- 专题:线性回归
- 专题:支持向量机
- 专题:决策树与随机森林
- 专题:主成分分析
- 专题:流行学习
- 专题:k-means聚类
- 专题: 高斯混合模型
- 专题: 核密度估计
前言
数据科学
数据科学维恩图
数据科学是一个跨学科的课题。数据科学综合了三个领域的能力:统计学家的能力—能够建立模型和聚合(数据量正在不断增大的)数据;计算机科学家的能力—能够设计并使用算法对数据进行高效存储、分析和可视化;领域专家的能力—在细分领域中经过专业训练,既可以提出正确的问题,又可以作为专业的解答。
IPython
IPython是用Python进行有效的交互式科学计算和数据密集型计算。IPython Notebook是Jupyter Notebook结构的特例,Jupyter Notebook不仅支持Python,还包括Julia、R和其他编程语言的Notebook。
使用IPython的两种方式
- IPython Shell:命令行中输入ipython启动IPython解释器。
- IPython notebook:Jupyter notebook是IPython shell基于浏览器的图像界面,提供了一个丰富的动态展示功能。尽管IPython notebook是通过Web浏览器窗口进行查看和编辑的,但是它必须与一个正在运行的Python进程连接才能执行代码。需要在命令行中输入jupyter notebook。
IPython的帮助和文档
- 用符号?获取文档
- 用符号??获取代码
- 用Tab补全的方式探索模块
IPython中的快捷键
- 导航快捷键
- 文本输入快捷键
- 命令历史快捷键
- 其他快捷键
IPython 魔法命令
IPython在普通Python语法基础之上的增强功能,称为IPython魔法命令。
魔法命令有两种形式:
- 行魔法(line magic),行魔法以单个%字符作为前缀,作用于单行输入。
- 单元魔法(cell magic),单元魔法以两个%%作为前缀,作用于多行输入。
常用命令:
- 粘贴代码块:%paste和%cpaste(解决包含符号的多行输入问题)
- 执行外部代码:%run(运行后,代码中包含的所有函数都可以在IPython会话中使用)
- 计算代码运行时间:%timeit
- 单行
- 多行
- 魔法函数的帮助:?、%magic和%lsmagic
输入输出历史
- IPython的输入输出对象
- 下划线快捷键和以前的输出
- 禁止输出
- 相关的魔法命令
IPython和shell命令
IPython终端可以直接执行shell命令的语法。一行中任何在!后面的内容将不会通过Python内核运行,而是通过系统命令行运行。
错误和调试
- 控制异常:%xmode
- 调试:当阅读轨迹追溯不足以解决问题时
标准的 Python 交互式调试工具是 pdb,它是 Python 的调试器。这个调试器允许用户逐行运行代码,以便查看可能导致错误的原因。IPython 增强版本的调试器是 ipdb,它是 IPython专用的调试器。IPython 中最方便的调试界面可能就是 %debug 魔法命令了。
代码的分析和计时
NumPy入门
有效的存储和操作数值数组是数据科学中绝对的基础过程。Python中用来处理这些数值数组的工具:NumPy包和Pandas包。
NumPy(Numerical Python的简称)提供了高效存储和操作密集数据缓存的接口。NumPy数组几乎是整个Python数据科学工具生态系统的核心。
Python中的数据类型
Python变量不仅是它们的值,还包括了关于值的类型的一些额外信息。
标准的Python实现是用C语言编写的。每一个Python对象都是一个聪明的伪C语言结构体,该结构体不仅包含其值,还有其他信息。
- Python整型
C语言整型本质上是对应某个内存位置的标签,里面存储的字节会编码成整型。而Python的整型其实是一个指针,指向包含这个Python对象所有信息的某个内存位置,其中包括可以转换成整型的字节。由于Python的整型结构体里面还包含了大量的额外信息,所以Python可以自由、动态的编码。但是Python类型中的这些额外信息也会成为负担,在多个对象组合的结构体中尤为明显。
- Python列表
Python具有动态类型特性,所以可以创建一个异构的列表。
拥有灵活性是要付出代价的,为了获得这些灵活的类型,列表中的每一项必须包含各自的类型信息、引用计数和其他信息,每一项都是一个完整的Python对象。如果列表中的所有变量都是同一类型的,那么很多信息就会显得很多余,这时将数据存储在固定类型的数组中应该会更高效。动态类型的列表和固定类型的(NumPy式)数组间的区别如下所示:
在实现层面,数组基本上包含一个指向连续数据块的指针。另一方面,Python 列表包含一个指向指针块的指针,这其中的每一个指针对应一个完整的 Python 对象(如前面看到的Python 整型)。另外,列表的优势是灵活,因为每个列表元素是一个包含数据和类型信息的完整结构体,而且列表可以用任意类型的数据填充。固定类型的 NumPy 式数组缺乏这种灵活性,但是能更有效地存储和操作数据。
- Python固定类型数组
内置的数组(array)模块(在 Python 3.3 之后可用)可以用于创建统一类型的密集数组:
更实用的是 NumPy 包中的 ndarray 对象。Python 的数组对象提供了数组型数据的有效存储,而 NumPy 为该数据加上了高效的操作。
- Python列表创建NumPy数组
- NumPy内置方法创建数组
NumPy数组基础
- 数组的属性(确定数组的大小、形状、存储大小、数据类型)
- ndim:数组的维度
- shape:数组每个维度的大小
- size:数组的总大小
- dtype:数组的数据类型
- itemsize:每个数组元素字节大小
- nbytes:数组总字节大小(一般来说,可以认为nbytes跟itemsize和size的乘积大小相等。)
- 数组的索引(获取和设置数组各个元素的值)
- 数组的切分(在大的数组中获取或设置更小的子数组)
- 数组的变形(改变给定数组的形状)
- 数组的拼接和分裂(将多个数组合并为一个,以及将一个数组分裂成多个)
NumPy数组的计算:通用函数
NumPy提供了一个简单灵活的接口来优化数据数组的计算。NumPy数组计算有时非常快,有时非常慢。使NumPy变快的关键是利用向量化操作,通常在NumPy的通用函数(ufunc)中实现。
- 缓慢的循环
事实上,这里的处理瓶颈并不是运算本身,而是 CPython 在每次循环时必须做数据类型的检查和函数的调度。
- 通用函数介绍哦哦
NumPy 中的向量操作是通过通用函数实现的。通用函数的主要目的是对 NumPy 数组中的值执行更快的重复操作。
- 探索NumPy的通用函数
- 高级的通用函数特性
聚合:最小值、最大值和其他值
当你面对大量的数据时,第一个步骤通常都是计算相关数据的概括统计值。最常用的概括统计值可能是均值和标准差,这两个值能让你分别概括出数据集中的“经典”值,但是其他一些形式的聚合也是非常有用的(如求和、乘积、中位数、最小值和最大值、分位数,等等)。
数组的计算:广播
另外一种向量化操作的方法是利用 NumPy 的广播功能。广播可以简单理解为用于不同大小数组的二进制通用函数(加、减、乘等)的一组规则。
- 广播的介绍
浅色的盒子表示广播的值。同样需要注意的是,这个额外的内存并没有在实际操作中进行分配,但是这样的想象方式更方便我们从概念上理解。
- 广播的规则
- 广播的实际应用
比较、掩码和布尔逻辑
- 和通用函数类似的比较操作
- 操作布尔数组
- 将不二数组作为掩码
花哨的索引
利用简单的索引值(如 arr[0])、切片(如 arr[:5])和布尔掩码(如 arr[arr > 0])获得并修改部分数组。另外一种数组索引,也称作花哨的索引(fancy indexing)。花哨的索引和前面那些简单的索引非常类似,但是传递的是索引数组,而不是单个标量。花哨的索引让我们能够快速获得并修改复杂的数组值的子数据集。
数组的排序
结构化数据:NumPy的结构化数组
NumPy的结构化数组合记录数组,为复合的、异构的数据提供了有效的存储。虽然列举的模式对简单的操作有用,但是这些场景通常可以用Pandas的DataFrame来实现。
- 生成结构化数组
- 更高级的复合类型
- 记录数组:结构化数组的扭转
Pandas数据处理
Pandas是在NumPy的基础上建立的新程序库,提供了一种高效的DataFrame数据结构。DataFrame本质上是一种带行标签和列标签、支持相同类型和缺失值的多维数组。Pandas不仅为带各种标签的数据提供了便利的存储界面,还实现了许多强大的操作。
Pandas对象简介
从底层视角可以把Pandas对象看成增强版的NumPy结构化数组,行列都不再只是简单的整数索引,还可以带上标签。Pandas有三个基本数据结构:Series、DataFrame和Index。
- Pandas的Series对象
- Pandas的DataFrame对象
- Pandas的Index对象
数据取值与选择
- Series数据选择方法
- DataFrame数据选择方法
Pandas数值运算方法
- 通用函数:保留索引
- 通用函数:索引对齐
- 通用函数:DataFrame和Series的运算
处理缺失值
- 选择处理缺失值的方法
- Pandas缺失值
- 处理缺失值
层级索引
Pandas 提供了 Panel 和 Panel4D 对象解决三维数据与四维数据。而在实践中,更直观的形式是通过层级索引(hierarchical indexing,也被称为多级索引,multi-indexing)配合多个有不同等级(level)的一级索引一起使用,这样就可以将高维数
组转换成类似一维 Series 和二维 DataFrame 对象的形式。
- 多级索引Series
- 多级索引的创建方法
- 多级索引的取值与切片
- 多级索引行列转换
- 多级索引的数据累计方法
合并数据集:Concat与Append操作
合并数据集:合并与连接
Pandas 的基本特性之一就是高性能的内存式数据连接(join)与合并(merge)操作。
- 关系代数
pd.merge() 实现的功能基于关系代数(relational algebra)的一部分。关系代数是处理关系型数据的通用理论,绝大部分数据库的可用操作都以此为理论基础。关系代数方法论的强大之处在于,它提出的若干简单操作规则经过组合就可以为任意数据集构建十分复杂的操作。借助在数据库或程序里已经高效实现的基本操作规则,你可以完成许多非常复杂的操作。Pandas 在 pd.merge() 函数与 Series 和 DataFrame 的 join() 方法里实现了这些基本操作规则。
- 数据连接的类型
pd.merge() 函数实现了三种数据连接的类型:一对一、多对一和多对多。这三种数据连接类型都通过 pd.merge() 接口进行调用,根据不同的数据连接需求进行不同的操作。
- 设置数据合并的键
- 设置数据连接的集合操作规则
- 重复列名:suffixes参数
累计与分组
- Pandas的简单累计功能
- GroupBy:分割、应用和组合
数据透视表
GroupBy 抽象类是如何探索数据集内部的关联性。数据透视表(pivot table)是一种类似的操作方法,常见于 Excel 与类似的表格应用中。数据透视表将每一列数据作为输入,输出将数据不断细分成多个维度累计信息的二维数据表。数据透视表更像是一种多维的 GroupBy 累计操作。虽然也可以分割 - 应用 - 组合,但是分割与组合不是发生在一维索引上,而是在二维网格上(行列同时分组)。
向量化字符串操作
使用 Python 的一个优势就是字符串处理起来比较容易。在此基础上创建的 Pandas 同样提供了一系列向量化字符串操作(vectorized string operation),它们都是在处理(清洗)现实工作中的数据时不可或缺的功能。
- Pandas 字符串操作简介
- Pandas字符串方法列表
处理时间序列
- Python的日期与时间工具
- Pandas时间序列:用时间作索引
Pandas 时间序列工具非常适合用来处理带时间戳的索引数据。
- Pandas时间序列数据结构
- 时间频率与偏移量
- 重新取样、迁移和窗口
- query()与eval()的设计动机:复合代数式
- 用Pandas.eval()实现高性能运算
- 用DataFrame.eval()实现列间运算
- DataFrame.query()方法
- 性能决定使用时机
高性能Pandas:eval()与query()
Matplotlib数据可视化
Matplotlib常用技巧
import matplotlib as mpl
import matplotlib.pyplot as plt
plt.style.use('classic')
两种画图接口
In[9]: plt.figure() # 创建图形
# 创建两个子图中的第一个,设置坐标轴
plt.subplot(2, 1, 1) # (行、列、子图编号)
plt.plot(x, np.sin(x))
# 创建两个子图中的第二个,设置坐标轴
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x));
- 面向对象接口
In[10]: # 先创建图形网格
# ax是一个包含两个Axes对象的数组
fig, ax = plt.subplots(2)
# 在每个对象上调用plot()方法
ax[0].plot(x, np.sin(x))
ax[1].plot(x, np.cos(x));
简易线形图
- 调整图形:线条的颜色与风格
- 调整图形:坐标轴上下限
- 设置图形标签
简易散点图
- 用plt.plot画散点图
- 用plt.scatter画散点图
- plot与scatter:效率对比
可视化异常处理
x = np.linspace(0,10,50)
dy = 0.8
y = np.sin(x) + dy * np.random.randn(50)
plt.errorbar(x, y, yerr = dy, fmt='.k')
plt.errorbar(x,y,yerr=dy,fmt='o',color='black',ecolor='lightgray',elinewidth=3,capsize=0)
密度图与等高线图
频次直方图、数据区间划分和分布密度
配置图例
- 选择图例显示的元素
- 在图例中显示不同尺寸的点
- 同时显示多个图例
配置颜色条
- 选择配色方案
- 颜色条刻度的限制与扩展功能的设置
- 离散型颜色条
多子图
- plt.axes:手动创建子图
- plt.subplot:简易网格子图
- plt.subplots:用一行代码创建网格
- plt.GridSpec:实现更复杂的排列方式
文字与注释
自定义坐标轴刻度
- 主刻度与次要刻度
- 隐藏刻度和标签
- 增减刻度数量
- 花哨的刻度格式
- 格式生成器与定位器
Matplotlib自定义:配置文件与样式表
- 手动配置图形
- 修改默认配置:rcParams
- 样式表
用Matplotlib画三维图
- 三维数据点与线
- 三维等高线图
- 线框图和曲面图
- 曲面三角剖分
用Basemap可视化地理数据
用Seaborn做数据可视化
Seaborn 在 Matplotlib 的基础上开发了一套 API,为默认的图形样式和颜色设置提供了理智的选择,为常用的统计图形定义了许多简单的高级函数,并与 Pandas DataFrame 的功能有机结合。
Seaborn 不仅有许多高级的画图功能,而且可以改写 Matplotlib 的默认参数,从而用简单的 Matplotlib 脚本获得更好的效果。可以用Seaborn 的 set() 方法设置样式。
Seaborn 的主要思想是用高级命令为统计数据探索和统计模型拟合创建各种图形。
- 频次直方图、KDE和密度图
- 矩阵图
- 分面频次直方图
- 因子图
- 联合分布
- 条形图
机器学习
什么是机器学习
虽然对机器学习的研究确实是源自人工智能领域,但是机器学习的方法却应用于
数据科学领域,因此我认为把机器学习看作是一种数学建模更合适。
机器学习的本质就是借助数学模型理解数据。当我们给模型装上可以适应观测数据的可调参数时,“学习”就开始了;此时的程序被认为具有从数据中“学习”的能力。一旦模型可以拟合旧的观测数据,那么它们就可以预测并解释新的观测数据。
Scikit-Learn简介
- Scikit-Learn的数据表示
- Scikit-Learn的评估器API
超参数与模型验证
有监督机器学习模型的基本步骤:
特征工程
- 分类特征
- 文本特征
- 图像特征
机器学习还有一种常见需求,那就是对图像进行编码。处理手写数字图像时使用的方法,是最简单的图像编码方法:用像素表示图像。
- 衍生特征
- 缺失值填充
- 特征管道
专题:朴素贝叶斯分类
朴素贝叶斯模型是一组非常简单快速的分类算法,通常适用于维度非常高的数据集。因为运行速度快,而且可调参数少,因此非常适合为分类问题提供快速粗糙的基本方案。
- 贝叶斯分类
- 高斯朴素贝叶斯
- 多项式朴素贝叶斯
- 朴素贝叶斯的应用场景
专题:线性回归
专题:支持向量机
- 支持向量机的 由来
- 支持向量机:边界最大化
- 支持向量机总结
专题:决策树与随机森林
- 速记森林的诱因:决策树
- 评估器集成算法:随机森林
- 随机森林回归
- 随机森林总结
专题:主成分分析
- 主成分分析简介
- 用PCA作噪音过滤
- 主成分分析总结
当然,PCA 并不是一个对每个高维数据集都有效的算法,但是它提供了一条直接且有效的路径,来获得对高维数据的洞察。
经常受数据集的异常点影响是 PCA 的主要弱点。
专题:流行学习
- 多维标度法(MDS)
- 将MDS用于流行学习
- 非线性嵌入:当MDS失败时
- 非线性流形:局部线性嵌入
- 关于流形方法的一些思考
专题:k-means聚类
- k-means简介
- k-means算法:期望最大化
专题: 高斯混合模型
专题: 核密度估计