本篇博客所有示例使用Jupyter NoteBook演示。
Python数据分析系列笔记基于:利用Python进行数据分析(第2版)
目录
1.NumPy简介
NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy数组作为构建基础。
NumPy部分功能:
- ndarray,一个具有矢量运算和复杂广播能力的快速且节省空间的多维数组
- 提供对整个数组数据进行快速运算的标准数学函数 (不需要编写循环)
- 提供读写磁盘数据的工具以及用于操作内存映射文件的工具
- 线性代数、随机数生成以及傅立叶变换功能
- 用于集成由C、C++、Fortran等语言编写的代码的A C API
由于NumPy提供了一个简单易用的C API,因此很容易将数据传递给由低级语言编写的外部库,外部库也能以NumPy数组的形式将数据返回给Python。这个功能使Python成为一种包装C/C++/Fortran历史代码库的选择,并使被包装库拥有一个动态的、易用的接口。
2.NumPy数据分析
NumPy本身并没有提供很多高级的数据分析功能,理解NumPy数组以及面向数组的计算将有助于我们更加高效地使用诸如pandas之类的工具。因为NumPy是一个很大的知识点,在Python数据分析系列中我们会分多篇博客/主题进行系统的介绍。
对于大部分数据分析应用而言,最关注的功能集中在:
- 用于数据整理和清洗、子集构造和过滤、转换等快速的矢量化数组运算
- 常用的数组算法,如排序、唯一化、集合运算等
- 高效的描述统计和数据聚合/摘要运算
- 用于异构数据集的合并/连接运算的数据对齐和关系型数据运算
- 将条件逻辑表述为数组表达式(而不是带有if-elif-else分支的循环)
- 数据的分组运算(聚合、转换、函数应用等)
虽然NumPy提供了通用的数值数据处理的计算基础,但是我们还是将pandas作为统计和分析工作的基础,尤其是处理表格数据时。pandas还提供了一些NumPy所没有的特定功能,如时间序列处理等。
Python的面向数组计算可以追溯到1995年,Jim Hugunin创建了Numeric库。接下来的10年,许多科学编程社区纷纷开始使用Python的数组编程,但是进入21世纪后,库的生态系统变得碎片化了。2005年,Travis Oliphant从Numeric和Numarray项目整合出了NumPy项目,进而所有社区都集合到了这个框架下。
3.NumPy高效性
NumPy之于数值计算特别重要的原因之一,是因为他可以高效处理大数组的数据,因为:
- NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象。NumPy的C语言编写的算法库可以操作内存,而不必进行类型检查或其他前期工作。比起Python的内置序列(列表,元组、集合等),NumPy数组使用的内存更少。
- NumPy可以在整个数组上执行复杂的计算,矢量化运算,而不需要Python的for循环。
基于NumPy的算法要比纯Python快10-100倍(甚至更多),并且使用的内存更少。下面用一个例子,来查看2者具体的性能差距:
import numpy as np
arr = np.arange(1000000) #声明一个包含1000000个元素的数组 0-999999
list1 = list(range(1000000)) #声明一个包含1000000个元素的列表 0-999999 range()产生一个迭代器 使用list()对其进行实体化
%time for _ in range(10): arr1 = arr*2 #向量化运算不需要for循环 对数组中的每个元素乘以2
%time for _ in range(10): list2 = [x*2 for x in list1] #对列表中的每个元素乘以2 需要使用for循环