Python 数据分析
Prerequisite
PS:只是做部分记录,具体的内容全记载在语雀,但不方便放出来
- NumPy 是一个用于数值运算的 Python 库,专门对数值运算进行优化,最大的优势是运行高效。
- Matplotlib 是常用的数据可视化的工具包,用来绘制各种图表,更好地展示数据。
- Pandas 是 Python 重要的数据分析工具包,也是目前非常流行的 Python 数据分析工具。最初它被作为金融数据分析工具由全球资产管理公司 AQR 在 2008 年 4 月开发,最终在 2009 年底开源出来。
PS:Pandas 的底层数据结构采用 NumPy 来实现,我们也可以把 pandas 理解成是对 NumPy 的封装,从而让数据分析的一些功能的实现变得更轻松方便。
Numpy
对列表分片后的数据进行更改不会影响原数据,但对多维数组分片后的数据进行更改会影响到原数据
# 列表
lst_data = [1, 2, 3]
lst_data2 = lst_data[:]
lst_data2[0] = 6
print(lst_data)
# 输出:[1, 2, 3]
# 多维数组
arr_data = np.array([1, 2, 3])
arr_data2 = arr_data[:]
arr_data2[0] = 6
print(arr_data)
# 输出:[6 2 3]
可以进行广播 和 无法进行广播
# 可以进行广播
# 示例一
data = np.array([[1, 2], [3, 4], [5, 6]])
ones = np.ones(2)
print(data.shape)
print(ones.shape)
# 输出:
# (3, 2)
# (2,)
# 实例二
ones = np.ones((2, 3))
data = np.array([1, 2, 1])
print(ones + data)
# [[2. 3. 2.] [2. 3. 2.]]
data 的形状是 (3, 2),ones 的形状是 (2,)。根据规则在较小维度的 shape 元组前补 1,直到和较大维度的 shape 元组长度相同,补 1 后 ones 的形状是 (1, 2)。
接着将元素在值为 1 的维度上进行复制,最后 ones 的形状变成了 (3, 2),和 data 的形状相同,因此可以进行计算。
# 无法进行广播
data = np.array([[1, 2], [3, 4], [5, 6]])
ones = np.ones(3)
print(data.shape)
print(ones.shape)
# 输出:
# (3, 2)
# (3,)
当 ones 的形状是 (3,) 时,补 1 后变成 (1, 3),最后变成 (3, 3)。形状与 data 不相同,无法进行计算。如果尝试执行 data + ones,会报错
布尔索引,顾名思义就是用布尔值作为索引去获取需要的元素
import numpy as np
data = np.array([[1, 2], [3, 4], [5, 6]])
print(data > 3)
"""
[[False False]
[False True]
[ True True]]
"""
data = np.array([[1, 2], [3, 4], [5, 6]])
print(data[data > 3])
# 输出:[4 5 6]
data = np.array([[1, 2], [3, 4], [5, 6]])
print(data[(data > 3) & (data < 5)])
# 输出:[4]
data = np.array([[1, 2], [3, 4], [5, 6]])
# 大于 3 或者小于 2
print(data[(data > 3) | (data < 2)])
# 输出:[1 4 5 6]
# 大于 3 或者不小于 2(即大于等于 2)
print(data[(data > 3) | ~(data < 2)])
# 输出:[2 3 4 5 6]
在 numpy 中多个条件的布尔索引正确写法是:and 改用 &,or 改用 |,not 改用 ~,并且每个条件要用括号括起来
np.random.randint() 和 random.randint()
import numpy as np
# 不传入形状时
print(np.random.randint(0, 5))
# 输出:3
# 形状为一维数组时
print(np.random.randint(0, 5, 3))
# 输出:[4 0 1]
# 形状为二维数组时
print(np.random.randint(0, 5, (2, 3)))
# 输出:
# [[0 2 1]
# [4 2 0]]
np.random.randint() 和 np.random.rand() 传入的参数不一样;
numpy 中的 np.random.randint() 方法和 Python 中的 random.randint() 类似,不同之处在于,random.randint(m, n) 生成的是 [m, n] 之间的整数,而 np.random.randint(m, n) 生成的是 [m, n) 之间的整数,这点一定注意要区分。
genfromtxt() 方法用于文件的读取
import numpy as np
data = np.genfromtxt('a.csv', delimiter=',', encoding='utf-8')
print(data)
'''
1,2,3
4,5,6
'''
"""
[[1. 2. 3.]
[ 4. 5. 6.]]
"""
Matplotlib
使用 Matplotlib 的前置是学完了 Numpy