跳转到主要内容
ActivePapers 将您的数据存储为可重新计算的文档,确保任何发布的结果均可重新运行、验证并永久保存。

本站部分链接为联盟营销链接:如果您通过这些链接购买,我们可能会获得佣金,且不会增加您的成本。这绝不会影响我们的推荐建议。详情请参阅我们的联盟披露声明。 联盟营销披露.

Python 数据科学:实用指南

Python 数据科学是使用 Python 科学堆栈(NumPy、pandas、SciPy、Matplotlib、scikit-learn 和 Jupyter)来加载、清理、分析、建模和可视化数据的实践。它基于 1991 年首次发布的语言,现在支撑着大约十几个核心库。本指南解释了各个部分如何组合在一起、它们在何处失效,以及如何为实际研究工作选择工具。

要点

– Python 的数据科学堆栈有多个层次:下面的 NumPy 数组、用于标记表格数据的 Pandas、用于数值例程的 SciPy、用于绘图的 Matplotlib、用于经典机器学习的 Scikit-Learn 以及用于交互式叙事工作的 Jupyter。 – Python 包索引 (PyPI) 托管数十万个包,但稳定的 Python 数据科学环境取决于固定一个经过充分测试的小子集,而不是安装所有内容。

  • 对于仿真和仪器数据,瓶颈很少出现在模型中:它是 I/O、内存布局和再现性。 HDF5、Zarr 和 Parquet 解决了这个问题的不同部分。
  • Python 既是一种粘合剂,也是一种语言:繁重的循环通常在编译后的 C、C++、Fortran 或 CUDA 中执行,这就是为什么矢量化比 Python 巧妙的语法更重要。
  • 可重复性是一门工程学科,而不是一个库。锁定文件、容器映像和记录的随机种子确保结果可以在一年后再次运行。

“Python 数据科学”的实际含义

Python 数据科学描述的是一个工作流程,而不是单个工具。典型的流程包括摄取(文件、数据库、API、仪器流)、解析和清理、探索性分析、统计建模或机器学习、可视化,最后是报告或归档。每个阶段都有一个主要的库,阶段之间的转换是大多数项目浪费时间的地方。

Python 在这个领域的优势在于广度和浅学习曲线。读取 CSV 的同一语言可以调用编译的分子动力学引擎、拟合回归并呈现出版质量的图形。这种广度也是风险:一个项目可能会积累十几个未使用的依赖项,并且无法重建。

该语言本身由 Python 语言参考指定,并由 Python 软件基金会维护。 Python 3 是唯一受支持的版本; Python 2 已于 2020 年终止生命,任何仍然使用“print”作为语句的教程都已经过时了十年。

核心堆栈:逐层解析

理解层可以避免常见错误:当 NumPy 数组就足够时诉诸 pandas,或者当封闭式计算就足够时诉诸 scikit-learn。这是 Python 数据科学的基础。

Related: — Project-based data-science paths with a guided terminal and real datasets.

NumPy 提供 n 维数组和向量化运算,使数值 Python 变得更快。它的广播规则和数据类型系统是其他一切的基础。如果您不了解步幅和内存布局,您最终将编写出正确的代码,但比必要的慢十倍。

Pandas 添加了标签轴:带有行索引和列名称的 Series 和 DataFrame 对象。它擅长异构表格数据、时间序列对齐和分组聚合。它不太适合非常宽的数值矩阵,其中简单的数组更精简。

SciPy 收集数值算法:线性代数、优化、插值、信号处理、稀疏矩阵和统计。许多 SciPy 函数包装了经过良好测试的 Fortran 或 C 库,因此通常比手工实现更可取。

Worth a look: — One subscription for university-backed Python and data-science certificates.

Matplotlib 是默认的绘图库,也是大多数期刊所期望的。它的面向对象接口(“fig, ax = plt.subplots()”)比有状态的“pyplot”快捷方式更可控,并且当图形必须可从脚本中再现时,它是正确的选择。

scikit-learn 通过一致的“fit”/“predict”/“transform” API 涵盖经典机器学习:预处理、模型选择、交叉验证和指标。存在于不同框架中的深度学习被故意排除在外。

Jupyter 笔记本交错代码、输出和散文。它们非常适合探索和教学,但不适合版本控制和测试——这种张力值得明确管理而不是忽视。

任务第一选择寻找其他地方的理由
数值数组、线性代数NumPy稀疏或 GPU 阵列需要 SciPy 稀疏或 CuPy
标签表格数据pandas非常大的表有利于 Polars 或 DuckDB
数值算法SciPy专业领域有专门的库
经典机器学习scikit-learn深度学习需要 PyTorch 或 TensorFlow
绘图Matplotlib交互式仪表板需要 Bokeh 或 Plotly
互动叙事Jupyter生产服务需要简单的模块

Python 数据科学与替代方案

用于数据科学的 Python 主要与 R、Julia、MATLAB 以及越来越多的基于 SQL 和 Rust 的工具竞争。 Python 数据科学与其他数据科学的诚实比较是关于适用性,而不是优越性。

R 在统计学和特定领域的Bioconductor工作流程方面仍然强大,拥有成熟的基因组学和临床统计学生态系统。 Julia 以接近数学的语法为目标,以数值性能为目标,比 Python 更优雅地解决了两种语言问题,但代价是生态系统更小。 MATLAB 在工程课程和 Simulink 式建模中占有很重要的地位。 DuckDB 等 SQL 引擎可以处理远大于内存的数据集的聚合,并且比 pandas 更简洁。

Python 的实际优势是互操作性。它绑定到 C、C++、Fortran、Rust 和 CUDA;可以集成到更大的应用程序中;并拥有几乎所有科学领域的库。对于已经在编译代码中运行模拟的实验室来说,Python 是自然的编排层。

Related: — A deep technical library of scientific-computing books, videos and live training.

建立一个能够与现实接触的环境

在环境管理方面,Python 项目的数据科学最常失败。目标是一个可复制、隔离和记录的环境,而不是全局安装。

Conda 或 Mamba 处理二进制依赖关系,当包需要特定的 BLAS、MPI 或 CUDA 构建时,这一点非常重要。如果所有依赖项都提供 wheel 包,则 venv 与 pip 更轻且足够。 uv 原来是一个快速解析器和安装程序,还管理 Python 版本。

研究小组的可行模式:

If you are shopping: — Interactive Python and data-science courses you code directly in the browser.

1.为每个项目创建一个环境,以项目命名,而不是“base”。 2. 在锁定文件(“environment.yml”、带有哈希值的“requirements.txt”或“uv.lock”)中注册并提交依赖项。 3. 显式设置 Python 版本,因为次要版本会更改边缘情况下的行为。 4. 如果模拟具有大量编译依赖性,则将分析环境与模拟环境分开。 5. 从 CI 中的锁定文件重建环境,以便在偏差发生之前捕获偏差。

容器镜像(Docker、Apptainer/Singularity for HPC)冻结了整个堆栈,包括系统库。对于几年后必须重新运行的工作,映像加锁定文件是最持久的组合。

读写科学数据

文件格式是一项具有深远影响的设计决策。使用 Python 进行数据科学提供了多种可靠的选择,正确的选择取决于形状、大小和访问模式。

CSV 是通用且人类可读的,对于大型数字数据来说不是一个好的选择:除非仔细处理,否则未类型化、未压缩、解析速度慢以及有损浮点格式。

HDF5 将分层、类型化、分块和压缩的数组与元数据存储在单个文件中。它是模拟输出的主力,可通过 h5py 或 PyTables 访问。同时写入需要小心; HDF5 并不是为一个文件中的多个写入者而设计的。

Zarr 将分块数组存储在目录或对象存储中,这使其对并行和云工作流程友好。对于由许多进程写入的非常大的数组来说,这是一个强有力的选择。

Parquet 是一种表格数据的列格式,具有高效压缩和谓词下推功能。它与 pandas、Polars 和 Arrow 完美搭配,是中间表格结果的合理默认值。

NetCDF 仍然是气候和地球科学领域的标准,并且基于现代形式的 HDF5。

经验法则:对表使用 Parquet,对数组使用 Zarr 或 HDF5,仅对小型交换或人工检查使用 CSV。

矢量化、性能和时间都去哪儿了

数据科学中的 Python 很快,因为慢的部分不是 Python。解释代码中各个元素的循环速度很慢;表示为数组表达式的相同操作在编译代码中运行。

三个习惯会不断带来回报:

  • 优化前进行向量化。 用矩阵运算替换元素循环,并在代数允许的情况下使用 np.einsum 或矩阵乘积。
  • 在猜测前进行性能分析。 Jupyter 中的“cProfile”、“line_profiler”和“%prun”显示您实际花费时间的位置。对障碍的直觉常常是错误的。
  • 选择正确的内存布局。 行或列访问、连续或非连续数组以及 D 类型宽度(float32 或 float64)可以在很大程度上改变执行时间和内存。

当矢量化还不够时,升级路径是用于 JIT 编译循环的 Numba、用于紧密内核的 Cython 或 C 扩展,以及通过 CuPy 或 JAX 的 GPU 阵列用于合适的工作负载。并行选项包括“multiprocessing”、“concurrent.futures”、用于大于内存图的 Dask 以及通过集群上的 mpi4py 实现的 MPI。

可重复性:区分研究与演示的部分

可重复的研究需要的不仅仅是共享笔记本。必须捕获四件事:代码、环境、数据和随机状态。

该代码属于具有有意义提交的版本控制。环境与锁定文件和理想情况下的图像有关。数据需要一个稳定的标识符(通过 Zenodo 等存储库的 DOI 或记录的不可变路径),因为链接会失效。随机状态必须明确播种和记录,因为伪随机数生成器因库和版本而异。

Notebooks 值得特殊对待。它们存储输出,这会增加差异并可能泄漏数据。像“nbstripout”、“jupytext”和“papermill”这样的工具可以帮助清理输出、将笔记本与纯文本脚本结合起来,或者参数化和运行它们。一种常见的模式是在笔记本中进行开发并将稳定的逻辑提取到经过测试的模块中。

科学的代码测试本身就是一门学科。数值函数的单元测试应该在容差范围内断言而不是完全相等,并且基于属性的测试和假设捕获基于示例的测试遗漏的边缘情况。

在 Python 和数据科学工具之间进行选择

一个常见的困惑是将“Python 或数据科学”视为语言和领域之间的选择。它们是不同的类别:Python 是一种通用编程语言,而数据科学是一组实践。当考虑Python的数据科学时,真正的决策范围更窄。

按以下顺序决定:

  1. 问题是数值问题还是文本问题? 数值工作有利于数组堆栈;文本和表格业务数据更喜欢 pandas 和 SQL。
  2. 数据适合内存吗? 如果不适合,请从一开始就选择分块格式和核心外工具(Dask、Zarr、DuckDB)。
  3. 模型是经典的还是深度的? 经典统计和机器学习与 SciPy 和 scikit-learn 配合得很好;深度学习需要专门的框架。
  4. 谁来维护它? 一次性分析和实验室范围的管道有不同的测试、包装和文档要求。
  5. 什么必须是可重现的? 任何用于出版或监管审查的内容都需要完整的锁定文件和图像处理。

哪里可以了解更多信息

Python 官方文档和 Python 教程仍然是该语言本身的权威起点。对于科学堆栈,每个项目都维护自己的文档,并且科学 Python 生态系统 (SPEC) 记录了通用约定。专业社区(例如分子动力学和生物信息学工具链)发布自己的教程,这些教程通常比通用课程更相关。

培养 Python 数据科学能力的最可靠方法是从您自己的专业领域获取一组真实数据并将其端到端发送:加载它、清理它、分析它、绘制它并打包结果,以便同事可以再次运行它。此练习揭示了本指南中描述的所有问题。

资料来源和进一步阅读

  • 数据科学 — 维基百科:数据科学是一个跨学科的学术领域,它使用统计学、科学计算、科学方法、处理、科学可视化、算法…

常见问题

Python 适合数据科学吗?

Python 与 R 一起是两种主导的数据科学语言之一,因为它的科学堆栈涵盖了生态系统中的数值计算、表格数据、机器学习和可视化。它的主要弱点是原始循环性能,可以通过矢量化和编译扩展来缓解。对于大多数工业和研究工作来说,这是一个强有力的默认选择。

使用 Python 进行数据科学我应该首先学习什么?

从核心 Python 语法开始,然后是 NumPy 数组、pandas、matplotlib、scikit-learn。在 Pandas 之前学习 NumPy 很重要,因为 Pandas 基于它,并且数组思维可以防止许多性能错误。统计学和领域知识必须并行发展,因为没有统计判断的工具会产生看似笃定实则荒谬的结果。

我需要计算机科学学位才能使用 Python 进行数据科学吗?

不需要。许多在职计算科学家和分析师来自物理学、化学、生物学或经济学,并在工作中学习编程。重要的是熟练掌握版本控制、测试和环境管理——这些技能通常是自学或在实验室学到的。正式课程有助于算法和统计,但不是先决条件。

在数据科学领域,Python 与 R 有何不同?

R 专为统计而设计,拥有出色的统计建模和领域包,特别是在基因组学和临床研究方面。 Python 是一种通用语言,也精通数据科学,可以轻松集成到模拟代码、Web 服务和生产系统中。许多团队都使用两者,用 Python 构建流水线,用 R 进行特定分析。

Python 可以处理大型数据集吗?

当数据以 Parquet、HDF5 或 Zarr 等块格式存储并使用 Dask、DuckDB 或 Polars 等外部内存工具进行处理时,Python 可以处理大型数据集。限制因素通常是内存设计和 I/O 策略,而不是语言。机器上的工作流程通常处理比 RAM 大得多的数据集,并选择正确的格式。

是什么让 Python 数据分析具有可重复性?

可重复性需要四个记录元素:版本化代码、锁定的环境或容器映像、稳定的数据标识符(例如 DOI)以及显式随机种子。Notebook 应清除输出或与纯文本脚本结合使用。如果没有这四点,一个结果可能是正确的,但没有人可以重复它。

Frequently asked questions

Python 适合数据科学吗?

Python 与 R 一起是两种主要的数据科学语言之一,因为它的科学堆栈涵盖了生态系统中的数值计算、表格数据、机器学习和可视化。它的主要弱点是原始循环性能,可以通过矢量化和编译扩展来缓解。对于大多数工业和研究工作来说,这是一个严重的默认情况。

使用 Python 进行数据科学我应该首先学习什么?

从核心 Python 语法开始,然后是 NumPy 数组、pandas、matplotlib、scikit-learn。在 Pandas 之前学习 NumPy 很重要,因为 Pandas 基于它,并且数组思维可以防止许多性能错误。统计学和领域知识必须并行发展,因为没有统计判断的工具会产生自信的废话。

我需要计算机科学学位才能使用 Python 进行数据科学吗?

不会。许多在职计算科学家和分析师来自物理学、化学、生物学或经济学,并在工作中学习编程。重要的是熟练掌握版本控制、测试和环境管理——这些技能通常是自学或在实验室学到的。正式课程有助于算法和统计,但不是先决条件。

在数据科学领域,Python 与 R 有何不同?

R 专为统计而设计,拥有出色的统计建模和领域包,特别是在基因组学和临床研究方面。 Python 是一种通用语言,也精通数据科学,可以轻松集成到模拟代码、Web 服务和生产系统中。许多团队都使用两者,用 Python 进行管道,用 R 进行特定分析。

Python 可以处理大型数据集吗?

当数据以 Parquet、HDF5 或 Zarr 等块格式存储并使用 Dask、DuckDB 或 Polars 等核心外工具进行处理时,Python 可以处理大型数据集。限制因素通常是内存设计和 I/O 策略,而不是语言。机器上的工作流程通常处理比 RAM 大得多的数据集,并选择正确的格式。

是什么让 Python 数据分析具有可重复性?

可重复性需要四个注册元素:版本化代码、锁定的环境或容器映像、稳定的数据标识符(例如 DOI)以及显式随机种子。笔记本应免除输出或与纯文本脚本结合使用。如果没有这四点,一个结果可能是正确的,但没有人可以重复它。


Learn Python by coding in your browser

Interactive Python and data-science courses you code directly in the browser