绕 PyData 堆栈一圈
绕 PyData 堆栈一圈
数据分析和科学界长期以来一直由 R 编程语言主导。虽然 R 功能强大,但它面向的受众群体较小。它在更广泛的软件开发领域开始失去吸引力。换句话说,没有一个数据项目是孤岛。现代网络几乎强制要求数据随时随地可供任何人访问。解决方案是使用更通用的语言来实现数据解决方案。
Python 已成为实现数据解决方案的 R 的流行替代品。Python 占用空间很小,语法简单、干净,易于使用和记忆。Python 有一个非常活跃的开源社区,为各种任务(包括数据科学和分析)贡献软件包。最后,Python 是跨平台的。它在三大平台上都同样有效:macOS、Linux 甚至 Windows。
本指南不适用于 Python 新手。它已假设您具有基本的 Python 经验。但是,需要注意的是,具有其他语言(例如 Java、C#)丰富经验的人应该能够快速掌握 Python。概念大致相同。语法是唯一的主要区别。
“PyData” 一词并非官方名称,而是一个口语化名称,指的是数据科学社区中常用的 Python 包和工具的集合。因此,虽然它对不同的 Pythonistas 有不同的含义,但这个集合中有一些被普遍接受的成员。本指南将特别关注这些,然后在最后提到其他几个。
numpy
numpy包使用 Python 语言处理数值计算任务。现在,不要让“数值计算”这个词吓到你。你很快就会看到numpy如何为你处理大部分艰苦的工作。这些艰苦的工作主要包括操纵多维数据结构。
考虑矩阵乘法的任务。将 2x3 矩阵与 3x4 矩阵相乘,经过 24 次乘法运算和 8 次加法运算后,将得到一个 2x4 矩阵。这只需几行 Python 代码即可轻松完成。但请记住,Python 是一种解释型语言,速度可能相当慢。虽然从上述示例中很难观察到性能下降,但更高维度的数据结构很快就会压倒纯 Python。
这就是numpy主要用 C 实现的原因。C 代码编译为本机、平台特定的二进制文件,运行速度接近硬件,从而消除了纯 Python 的性能问题。但numpy仍然为用 C 实现的 API 提供 Python 绑定。这为开发人员提供了两全其美的优势:C 的性能和 Python 的易用性。
numpy的核心数据结构是ndarray。“nd”代表“n 维”,因此 ndarray能够表示多维数据结构。从 Python 列表创建ndarray很简单:
import numpy as np
data = list(range(20))
arr = np.array(data)
numpy的别名np是一种常见约定。您会看到它在许多 PyData 应用程序中使用。显示arr的值将产生:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
这看起来很像 Python 列表。而且 ndarray很多时候可以替代列表。但它学到了一些新技巧。例如,reshape方法:
mat = arr.reshape(5, 4)
这将返回一个传递给它的维度的ndarray ,在本例中为 5 行 4 列:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
虽然这看起来像是 Python 中的嵌套列表,但它实际上是一个ndarray。索引ndarray也学到了一些新技巧。例如,要访问第 1 行第 2 列中的值,您可以使用 Python 列表编写以下代码:
mat[1][2]
这也适用于ndarray,但有一种快捷方式可以减少一些语法噪音。
mat[1, 2]
ndarray索引的妙处在于,你可以用冒号选择维度中的每个值,如下所示:
mat[:,2]
这实际上选择了mat中的第二列。冒号表示选择每一行,然后在每行中索引两个。
numpy的另一个好处是广播的思想。考虑对整数列表求平方的必选示例:
my_list = list(range(10))
squares = []
for value in my_list:
sqaure_value = value ** 2
squares.append(square_value)
# or
squares = [value ** 2 for value in my_list]
尽管这个例子可以通过列表推导减少到一行代码,但需要花些心思才能将 Python 代码转换成它所表示的数学表达式。使用 ndarray做同样的事情更易读:
my_array = np.array(list(range(10))
square_array = my_array ** 2
并且numpy也可以将广播扩展到高维度:
my_array = np.random.randint(0, 10, size=(3, 2))
square_array = my_array ** 2
numpy中的random模块反映了Python 标准库中的random模块,并添加了一些额外功能以适应ndarray。在上面的例子中,randint将返回一个 3x2 ndarray,其整数值从 0 到 9。
对多个ndarray的操作同样简单:
A = np.random.randint(0, 10, size=(3, 2))
B = np.random.randint(0, 10, size=(3, 2))
mat_sum = A + B
还有本节开头提到的矩阵乘法问题?
A = np.random.randint(0, 10, size=(2, 3))
B = np.random.randint(0, 10, size=(3, 4))
dot_prod = A.dot(B)
最后,可以使用简单的布尔表达式来过滤ndarray :
arr = np.array(list(range(20)))
odds = arr[arr % 2 == 1]
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
这只是numpy的冰山一角。本指南无法涵盖许多其他有用的功能(请查看索引ndarray )。
熊猫
希望您能看到numpy的强大功能以及它可以节省多少时间。但归根结底, ndarray只不过是一大堆数字。这是因为没有与 ndarray 关联的元数据。为了在更易于理解的环境中处理数据,我们转向pandas。
您更可能花时间使用pandas API。numpy处理数值的核心操作,而pandas模仿 R 的大部分功能。这再次为您提供了两全其美的优势:R 的强大功能与 Python 的语法。
pandas中的核心数据结构是DataFrame。它模仿了同名的 R 数据结构。在pandas中,DataFrame是一种二维数据结构,具有命名的列和索引的行。换句话说,您可以从概念上将其视为一个表。DataFrame的值由ndarray表示,并且可以通过ndarray创建DataFrame。
import numpy as np
import pandas pd
raw = np.random.randint(0, 10, size=(5, 3))
df = pd.DataFrame(data=raw)
结果是
0 1 2
0 3 4 0
1 1 8 6
2 0 5 4
3 8 5 8
4 0 1 2
标题的顶行和索引的最左边一列由pandas生成。可以通过设置columns字段来修改标题:
df.columns = ['Foo', 'Bar', 'Baz']
现在的数据框:
Foo Bar Baz
0 3 4 0
1 1 8 6
2 0 5 4
3 8 5 8
4 0 1 2
也可以通过名称访问列:
df['Foo']
0 3
1 1
2 0
3 8
4 0
Name: Red, dtype: int64
虽然与DataFrame非常相似,但这实际上是一个Series 。Series是一个带有索引的ndarray。DataFrame的列名也可以用作字段:
df.Foo
像ndarray一样<font
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~