Python & Data

这篇博客来速成以下python的数据处理。

主要讲讲一些回顾性的知识。博主是出于上可视化这门课程才要学习这一部分的。不知道以后能不能用的到。

涉及的内容:#

  • pandas(用来处理数据的模块)
  • matplotlib(一般使用内部的pyplot来绘制图形)
  • os(你的操作系统给python的接口)
  • numpy(用来进行科学计算 虽然这个课程我没主动地用)
  • 基本的python工具。

正式开始:#

我们做数据处理,一般涉及到这样的流程:数据获取(寻址)-选择感兴趣的数据-筛选其中的数据-数据再生产(计算)-展示数据体现的内涵/将数据保存输出。

下面我们就来根据这个框架来分析以上python模块为我们提供了什么样的帮助;

pandas:#

pandas是对数据做非可视化处理的一个非常强力的工具。在python中,如果你想用pandas来进行对数据的处理,只需要在你的脚本文件中导入pandas模块(前提是你的对应的python环境已经添加了pandas模块)即可,也就是

1
import pandas as pd

初识pandas:#

在pandas中,我们可以用很多种方式来表现我们的数据,最常见/基础的就是dataframe,这个对象可以通过如下方式来创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
df_0 = pd.DataFrame() # 创建一个空的dataframe,简写为df

# 从字典创建
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']
}
df_1 = pd.DataFrame(data)


# 使用列表创建
data = [
['Alice', 25, 'New York'],
['Bob', 30, 'Los Angeles'],
['Charlie', 35, 'Chicago']
]
df = pd.DataFrame(data, columns=['Name', 'Age', 'City']) # 字典中每一个数组有名字,这里没有,所以要指定其名称
# 也可以创建无名df,会默认提供一个索引,然后再指定

import numpy as np

# 使用NumPy数组创建
data = np.array([
['Alice', 25, 'New York'],
['Bob', 30, 'Los Angeles'],
['Charlie', 35, 'Chicago']
])
df = pd.DataFrame(data, columns=['Name', 'Age', 'City'])

# 后面我们还会提到,可以使用pandas提供的series(以及其他的内嵌数据集)来创建dataframe/从文件中导出数据为dataframe

如果你想知道numpy数组有什么不同,点这里

创建完数据对象之后,我们可以使用类似于python中使用字典/列表的方式,来对数据进行访问,例如

1

#

numpy#

在深度学习的实现中。在深度学习的实现中,经常出现数组和矩阵的计算。NumPy 的数组类(numpy.array )中提供了很多便捷的方法。

初识:#

创建numpy array 并进行简单的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np

x=np.array([1.0,2.0,3.0]) # 使用这个方法来生成numpy array,这个数组接受list作为参数。

print(x)
type(x)

y=np.array([2.0,4.0,6.0])

z=x+y # 结果:z=array([3.,6.,9.])

# 类似的还有x-y,x/y,x*y;全部都是element-wise的操作。

q=np.array([[1,2],[3,4]]) # 这是一个二维数组。也称为矩阵。
# numpy支持任意维数组。三维及以上数组称为张量/多维数组。

q.shape # 显示矩阵的形状,这里显示(2,2)是一个2*2的矩阵。
q.dtype # 显示元素的数据类型(dtype ~ datatype),这里显示'int64'

q[0][0] # 类似数组索引器;
for row in q:
print(row) # 打印每行

广播功能:#

形状不同的数组之间也可以进行运算,numpy会做出相应处理:
例子1
例子2
这种自动适应的行为称之为broadcast.
比如

1
print(np.array([1,2,3,4])>2)

将会得到一个np.array,其内容是[false,false,true,true],这里相当于将标量2扩展称为$(1*4)$的矩阵,然后进行element-wise的比较

访求数据:#

np.array为我们筛选数据提供了很方便的api,一方面,我们可以在索引器中写一个index数组,里面放置我们想要访问的数据的index,就像这样:

1
2
3
4
X=np.array([1,2,3,4])

X[ np.array[0,2,3] ]
# 将会获取索引为0,2,3的元素,也即array([1,3,4])

或者是使用一个和原数组等长的布尔数组,来决定每一个数据是否被访求。就像这样

1
2
3
X=np.array([1,2,3,4])

X[X>2] # 利用之前的广播+算数操作的特性,这里比较之后就能产生一个等长的array([false,false,true,true])

matplotlib:#

Matplotlib 是用于绘制图形的库,使用 Matplotlib 可以轻松地绘制图形和
实现数据的可视化。
一般都使用matplotlib.pyplot

初识:#

1
2
3
4
5
6
7
8
9
10
import numpy as np
import matplotlib.pyplot as plt

# 生成数据
x=np.arange(0,6,0.1) # 以 0.1 为单位,生成 0 到 6 的数据
y=np.sin(x)

# 绘制图形:根据已有数据进行简单的图形绘制
plt.plot(x,y)
plt.show()

再画一点:#

可以添加很多其他的功能,比如标签名称/图形标题之类的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt

x=np.arange(0,6,0.1)
y1=np.sin(x)
y2=np.cos(x)

plt.plot(x,y1,label='sin')
plt.plot(x,y2,linestyle='--',label='cos') # 使用虚线绘制。
plt.xlabel('x') # x轴的标签
plt.ylabel('y')
plt.title('sin & cos') # 标题
plt.legend()
plt.show()

plt还有很多其他的功能,比如,读取图像imread(),显示图像imshow()