本人以简书作者 SeanCheney 系列专题文章并结合原书为学习资源,记录个人笔记,仅作为知识记录及后期复习所用,原作者地址查看 简书 SeanCheney,如有错误,还望批评指教。——ZJ
原作者:SeanCheney | 链接 | 來源:简书
环境:Python 3.6
第1章 准备工作
1.1 本书的内容
学习目标: 学会利用 Python 进行数据控制、处理、整理、分析等方面的具体细节和基本要点。掌握 Python 编程和用于数据处理的库和工具环境,成为数据分析专家。
什么样的数据?
- 结构化数据(structured data)
- 表格型数据,其中各列可能是不同的类型(字符串、数值、日期等)。比如保存在关系型数据库中或以制表符/逗号为分隔符的文本文件中的那些数据。
- 多维数组(矩阵)。
- 通过关键列(对于SQL用户而言,就是主键和外键)相互联系的多个表。
- 间隔平均或不平均的时间序列。
这绝不是一个完整的列表。大部分数据集都能被转化为更加适合分析和建模的结构化形式。
1.2 为什么要使用Python进行数据分析
- Python 现在已经成为最受欢迎的动态编程语言之一
- Python 发展出了一个巨大而活跃的科学计算(scientific computing)社区。
- Python 从一个边缘或“自担风险”的科学计算语言,成为了数据科学、机器学习、学界和工业界软件开发最重要的语言之一。
- 由于Python的库(例如 pandas 和 scikit-learn)不断改良,使其成为数据分析任务的一个优选方案。结合其在通用编程方面的强大实力,我们完全可以只使用Python这一种语言构建以数据为中心的应用。
- 解决“两种语言”问题 ,(很多组织通常都会用一种类似于领域特定的计算语言(如SAS和R)对新的想法进行研究、原型构建和测试,然后再将这些想法移植到某个更大的生产系统中去(可能是用Java、C#或C++编写的))Python不仅适用于研究和原型构建,同时也适用于构建生产系统。
1.3 重要的Python库
NumPy (Numerical Python的简称)是Python科学计算的基础包。本书大部分内容都基于NumPy以及构建于其上的库。它提供了以下功能(不限于此):
- 快速高效的多维数组对象ndarray。
- 用于对数组执行元素级计算以及直接对数组执行数学运算的函数。
- 用于读写硬盘上基于数组的数据集的工具。
- 线性代数运算、傅里叶变换,以及随机数生成。
成熟的C API, 用于Python插件和原生C、C++、Fortran代码访问NumPy的数据结构和计算工具。 - NumPy在数据分析方面还有另外一个主要作用,即作为在算法和库之间传递数据的容器。
pandas:提供了快速便捷处理结构化数据的大量数据结构和函数。
- 助使Python成为强大而高效的数据分析环境
- 本书用得最多的 pandas 对象是 DataFrame,它是一个面向列(column-oriented)的二维表结构,另一个是 Series ,一个一维的标签化数组对象。
- pandas 兼具 NumPy 高性能的数组计算功能以及电子表格和关系型数据库(如SQL)灵活的数据处理功能。
- 它提供了复杂精细的索引功能,以便更为便捷地完成重塑、切片和切块、聚合以及选取数据子集等操作。
- 因为数据操作、准备、清洗是数据分析最重要的技能,pandas 是本书的重点。
- 有标签轴的数据结构,支持自动或清晰的数据对齐。这可以防止由于数据不对齐,和处理来源不同的索引不同的数据,造成的错误。
- 集成时间序列功能。
- 相同的数据结构用于处理时间序列数据和非时间序列数据。
- 保存元数据的算术运算和压缩。
- 灵活处理缺失数据。
- 合并和其它流行数据库(例如基于SQL的数据库)的关系操作。
matplotlib:是最流行的用于绘制图表和其它二维数据可视化的Python库
IPython 和 Jupyter:
- IPython 大大提高交互式计算和软件开发的生产率
- IPython 鼓励“执行-探索”的工作流,它还可以方便地访问系统的shell和文件系统
- Jupyter 一个更宽泛的多语言交互计算工具的计划
- Jupyter notebook,现在支持40种编程语言。IPython 现在可以作为Jupyter 使用 Python的内核(一种编程语言模式)
SciPy: 是一组专门解决科学计算中各种标准问题域的包的集合
- scipy.integrate:数值积分例程和微分方程求解器。
- scipy.linalg:扩展了由numpy.linalg提供的线性代数例程和矩阵分解功能。
- scipy.optimize:函数优化器(最小化器)以及根查找算法。
- scipy.signal:信号处理工具。
- scipy.sparse:稀疏矩阵和稀疏线性系统求解器。
- scipy.special:SPECFUN(这是一个实现了许多常用数学函数(如伽玛函数)的Fortran库)的包装器。
- scipy.stats:标准连续和离散概率分布(如密度函数、采样器、连续分布函数等)、各种统计检验方法,以及更好的描述统计法。
scikit-learn: scikit-learn 成为了 Python 的通用机器学习工具包
- 分类:SVM、近邻、随机森林、逻辑回归等等。
- 回归:Lasso、岭回归等等。
- 聚类:k-均值、谱聚类等等。
- 降维:PCA、特征选择、矩阵分解等等。
- 选型:网格搜索、交叉验证、度量。
- 预处理:特征提取、标准化。
- 与p andas、statsmodels 和 IPython一起,scikit-learn 对于 Python成为高效数据科学编程语言起到了关键作用。
statsmodels: 是一个统计分析包,statsmodels包含经典统计学和经济计量学的算法
- 回归模型:线性回归,广义线性模型,健壮线性模型,线性混合效应模型等等。
- 方差分析(ANOVA)。
- 时间序列分析:AR,ARMA,ARIMA,VAR和其它模型。
- 非参数方法: 核密度估计,核回归。
- 统计模型结果可视化。
1.4 1.5 (略)
1.6 本书导航
与外部世界交互
阅读编写多种文件格式和数据商店;
数据准备
清洗、修改、结合、标准化、重塑、切片、切割、转换数据,以进行分析;
转换数据
对旧的数据集进行数学和统计操作,生成新的数据集(例如,通过各组变量聚类成大的表);
建模和计算
将数据绑定统计模型、机器学习算法、或其他计算工具;
展示
创建交互式和静态的图表可视化和文本总结。
引入惯例
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import statsmodels as sm
第2章 Python 语法基础,IPython 和 Jupyter Notebooks
2.1 Python解释器
Python 是解释性语言。Python 解释器同一时间只能运行一个程序的一条语句。标准的交互 Python 解释器可以在命令行中通过键入 python 命令打开:
C:\Users\qhtf>python
Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print(input('what\'s your name:'))
what's your name: ZJ
ZJ
>>> exit()
运行 Python 程序只需调用 Python 的同时,使用一个.py文件作为它的第一个参数。假设创建了一个 hello_world.py 文件,它的内容是:
print('Hello world')
你可以用下面的命令运行它(hello_world.py文件必须位于终端的工作目录):
$ python hello_world.py
Hello world
一些 Python 程序员总是这样执行 Python 代码的,从事数据分析和科学计算的人却会使用 IPython,一个强化的 Python 解释器,或 Jupyter notebooks,一个网页代码笔记本,它原先是 IPython 的一个子项目。
当你使用
%run
命令,IPython会同样执行指定文件中的代码,结束之后,还可以与结果交互:
D:\github\pythonpractice>ipython
Python 3.6.2 (v3.6.2:5fd33b5, Jul 8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: %run hello.py
Hello World
In [2]: exit()
2.2 IPython 基础
运行 IPython Shell
- 你可以用 ipython 在命令行打开 IPython Shell,就像打开普通的 Python 解释器
- 你可以通过输入代码并按Return(或Enter),运行任意Python语句。当你只输入一个变量,它会显示代表的对象:
In [1]: import numpy as np
In [2]: data = {i : np.random.randn() for i in range(7)}
In [3]: data
Out[3]:
{
0: -0.7871942220349025,
1: 0.5968958863243701,
2: -0.670023515225677,
3: -0.030930268126603183,
4: 2.0550986476324473,
5: -0.7468422713170355,
6: -0.2948531366214833}
In [4]: exit()
运行 Jupyter Notebook (略)
Tab 自动补全(略)
自省:在变量前后使用问号?,可以显示对象的信息:
In [1]: b = [2,3,4,5]
In [2]: b?
Type: list
String form: [2, 3, 4, 5]
Length: 4
Docstring:
list() -> new empty list
list(iterable) -> new list initialized from iterable's items
In [3]: exit()
- 这可以作为对象的自省。如果对象是一个函数或实例方法,定义过的文档字符串,也会显示出信息。假设我们写了一个如下的函数:
In [1]: def add_number(a, b):
...: '''
...: Add two numbers together
...: Returns
...: ---------
...: the_sum : type of arguments
...: '''
...: return a + b
...:
- 然后使用?符号,就可以显示如下的文档字符串:
In [2]: add_number?
Signature: add_number(a, b)
Docstring:
Add two numbers together
Returns
---------
the_sum : type of arguments
File: d:\github\pythonpractice\<ipython-input-1-0d88bc512be6>
Type: function
In [3]: exit()
- 使用??会显示函数的源码:
In [2]: add_number??
Signature: add_number(a, b)
Source:
def add_number(a, b):
'''
Add two numbers together
Returns
---------
the_sum : type of arguments
'''
return a + b
File: d:\github\pythonpractice\<ipython-input-1-0d88bc512be6>
Type: function
- ?还有一个用途,就是像 Unix 或 Windows 命令行一样搜索 IPytho n的命名空间。字符与通配符结合可以匹配所有的名字。例如,我们可以获得所有包含load的顶级 NumPy 命名空间:
def f(x,y,z):
return (x +y)/z
a =