4小时学完Python数据分析入门笔记(二)
接上文:4小时学完Python数据分析入门笔记(一)
写在前面
freecodecamp.org + RMOTR的Python数据分析课的笔记,全视频4小时22分钟。以下内容斜体和(括号)部分仅为我个人的想法或补充,图片和其他文字为视频截图和中文翻译。分几次发完,转载标明出处。
原视频链接:https://www.youtube.com/watch?v=r-uOLxNrNk8
Data Analysis with Python - Full Course for Beginners (Numpy, Pandas, Matplotlib, Seaborn)
Jupyter Notebook工具
和写文档用Word/txt一样,写代码需要编辑器。我平时非数据分析用VS code和PyCharm,但数据分析需要一个不同的编辑器,视频中介绍Jupyter Notebook,是非常常用的数据分析工具。由于之前mac升级导致Jupyter Notebook无法使用,我开始用Google Colab,感官上和Jupyter相似,也是很好的工具。现在也可以在VS code里用Jupyter Notebook了,看个人喜好。下面正式开始:
一本Jupyter Notebook像一个python文件,Jupyter Lab像VS code。视频使用Notebook AI(我没有用过),界面如下:
我自己电脑通过anaconda打开的jupyter notebook长这样:
注意这里用的语言不是Python而是R,所以不要参考这里的代码
我常用的Google Colab界面是这样:
无论你选择用哪款工具,使用方法基本一致,用多了就熟练了,接下来我根据视频用Google Colab演示。
Notebook内的基本结构叫cell,就是上图里灰色的框,写程序的话直接在cell里写Python代码,每个cell运行结果会在框下面显示出来。当然,我们也可以使用Markdown添加注释,点击右上角 +Text 按钮添加文字cell即可。
按回车后键效果如下:
每次一个cell运行结束后左边会出现一个数字,这个数字代表运行框的顺序,比如下图我就没有按照从上到下的顺序运行。没有运行的cell不会有数字出现。
删除一个cell的方法就是点击cell右侧的垃圾桶图标即可。
知道这三个基本操作就可以开始啦。快捷键之类的用多了以后可以自己摸索出来。
Python库/包
先解释一下什么叫Python库/包。上面的图里的Python代码都是最最简单基础的代码(我写来做示范而已),但是这些简单的东西像一块块乐高一样可以组合拼成机器人完成更高级的工作。更令人开心的是,好多机器人前辈们已经拼完了,不需要你写几百行代码再重新搭建一遍。这些“机器人”就被存在Python库/包里面,可以直接调用,比如上图最后一个未运行的cell里的import pandas就导入了Pandas。数据科学/数据分析可以调用的包之多,我们都要成为调包小能手lol。
回忆一下这个系列第一篇提到的常用数据分析Python包/库:
- Numpy
- Pandas
- Matplotlib
- Seaborn
- scipy
- scikit-learn
接下来我们会一一介绍打勾的这几个,下面先说Numpy。
Numpy
Numpy支持矩阵和数组运算。看excel或者csv文件(见第一篇图)里数据m行n列的样子就符合矩阵的长相,所以Numpy是不二人选。一些高端一点的库如pandas也是基于Numpy运行的。其实我用到Numpy的不多,即使是数据分析用的也没有Pandas多。反而我在做深度学习处理图像的时候由于图像的矩阵特征用Numpy多一点。我没有系统的学过这个包,所以入门的话还是看看。
我们终于开始写Python代码。首先导入Numpy库。
import numpy as np # as XXX 只是因为不喜欢写numpy全称所以把名字简化一下
Numpy基础
创建1D numpy array
a = np.array([1,2,3,4])
a[1:-1]
array([2, 3])
基础操作上numpy array和Python list基本一样。不同在于numpy array可以multi-indexing。
b = np.array([2.5, -1, 9, 14, 6.7])
b[[1, 3, -1]]
array([-1. , 14. , 6.7])
Numpy array有不同的数据类型,我们先来查看一下上面创建的a和b的数据类型。
print(a.dtype)
print(b.dtype)
int64
float64
a中元素都是整数,b中元素有小数,所以有int和float的区别。我们也可以手动指定数据类型。整数变小数容易,但小数变整数会只保留小数的整数部分。
c = np.array([1,2,3,4], dtype=np.float)
d = np.array([2.5, -1, 9, 14, 6.7], dtype=np.int)
print(c)
print(d)
[1. 2. 3. 4.]
[ 2 -1 9 14 6]
numpy array 还有<U1(string),O(object),int8(占内存比int64少一点)等数据类型。
nD array
上面的例子都不是矩阵(2D array),我们操作数据的时候也不可能只有一行,所以100行5列的数据就应该对应一个100*5的矩阵。我们看一下numpy怎么操作矩阵。
A = np.array([[1,2,3], [4,5,6]])
print(A.shape) # 几行几列
print(A.ndim) # 行数
print(A.size) # 元素个数
(2, 3)
2
6
当然我们也可以创建3D array,这往往是在处理图像的时候使用的。因为图像有RGB三通道,所以是m x n x 3的numpy array。
B = np.array([
[[1,2,3], [4,5,6]],
[[7,8,9], [10, 11, 12]]
])
print(B.shape)
print(B.ndim)
print(B.size)
(2, 2, 3)
3
12
注意不要少些漏写任何一行或者任何一个数字,否则数据类型就变成object了。
获取某行某列这样操作:
print(A[1][1])
print(A[1, 1]) # 两种方法都可以
print(B[1][1][:2])
print(B[1, 1, :2]) # 两种方法都可以
print(B[1, :, :2])
5
5
[10 11]
[10 11]
[[ 7 8]
[10 11]]
改变一行:
A[1] = 10
A
array([[ 1, 2, 3],
[10, 10, 10]])
基本统计
求和,平均,标准差,方差。
a = np.array([1,2,3,4])
print(a.mean())
print(a.sum())
print(a.std())
print(a.var())
2.5
10
1.118033988749895
1.25
A = np.array([
[1, 2 ,3],
[4, 5, 6],
[7, 8, 9]
])
print(A.mean())
print(A.sum())
print(A.std())
print(A.var())
# 按照行(1)或者列(0)
print(A.sum(axis=0))
print(A.sum(axis=1))
print(A.mean(axis=0))
print(A.mean(axis=1))
print(A.std(axis=0))
print(A.std(axis=1))
print(A.var(axis=0))
print(A.var(axis=1))
5.0
45
2.581988897471611
6.666666666666667
[12 15 18]
[ 6 15 24]
[4. 5. 6.]
[2. 5. 8.]
[2.44948974 2.44948974 2.44948974]
[0.81649658 0.81649658 0.81649658]
[6. 6. 6.]
[0.66666667 0.66666667 0.66666667]
基本运算
加减乘除
a = np.arange(4)
b = np.array([10] * 4)
print('a:', a)
print('b:', b)
print(a + 10) # 每个元素加10
print(a * 10) # 每个元素乘10
print(a + b) # 两两元素相加
print(a * b) # 两两元素相乘
a: [0 1 2 3]
b: [10 10 10 10]
[10 11 12 13]
[ 0 10 20 30]
[10 11 12 13]
[ 0 10 20 30]
Boolean Array
通过布尔值,我们可以进行筛选。
a = np.arange(4) # [0,1,2,3]
print(a[[0, -1]])
print(a[[True, False, False, True]]) # 效果同上一行
print(a >= 2)
print(a[a >= 2])
print(a[a > a.mean()])
print(a[~(a > a.mean())])
print(a[(a == 0)| (a == 1)])
[0 3]
[0 3]
[False False True True]
[2 3]
[2 3]
[0 1]
[0 1]
A = np.random.randint(100, size=(3,3))
print(A)
print(A > 30)
print(A[A > 30])
[[28 73 6]
[94 1 72]
[76 98 15]]
[[False True False]
[ True False True]
[ True True False]]
[73 94 72 76 98]
线性代数
机器学习里常用到线性代数。以下是简单的矩阵运算。
A = np.array([
[1,2,3],
[4,5,6],
[7,8,9]
])
B = np.array([
[6, 5],
[4, 3],
[2, 1]
])
print(A.dot(B)) # 点乘
print(A @ B) # 同上
print(B.T) # 转置矩阵
print(B.T @ A)
[[20 14]
[56 41]
[92 68]]
[[20 14]
[56 41]
[92 68]]
[[6 4 2]
[5 3 1]]
[[36 48 60]
[24 33 42]]
小节
Numpy的计算比loop python list快,主要在矩阵运算上使用很多。
翻译又不到位之处表示抱歉,轻喷谢谢。欢迎留言交流,互相学习。
原视频链接:https://www.youtube.com/watch?v=r-uOLxNrNk8
Data Analysis with Python - Full Course for Beginners (Numpy, Pandas, Matplotlib, Seaborn)
接下来写Pandas。
未完待续To be continued…