数据科学家离不开的7个Python库
不是那些习惯性被列出的库。而是那些真正改变了我编写代码、调试管道和交付六个月后不会让我感到尴尬的项目的库。
AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo
每一篇关于 Python 库的清单文章读起来都像是从同一个维基百科页面复制过来的。NumPy、Pandas、Scikit-learn,完了。都是对的,但都没用,因为没有人会因为被告知 Pandas 的存在而成为更好的数据科学家。你是通过那些悄然修复了那些让你变慢的工作部分的小型库而变得更好的。
这不是那种列表。这些是我在真实项目中反复使用的七个库——那种截止日期是真实的、数据集是丑陋的项目。有些很出名,有几个不那么出名。每一个都通过改变一个习惯而赢得了它的位置,而不是通过出现在搜索排名上。

1、Polars
我抵制 Polars 的时间长得令人尴尬。Pandas 已经成了肌肉记忆,重写这种肌肉记忆感觉像是一种负担。然后我在几百万行数据上运行了一个连接操作,Pandas 花了足够长的时间让我泡了杯茶,而 Polars 在水壶还没响之前就完成了。
速度是头条新闻,但留住我的不是速度。让我变得更好的是 API 本身。Polars 迫使你用表达式和查询计划来思考,而不是一堆可变的就地编辑。你的转换变成了一个可读的链条,而不是一个你忘记删除的中间变量的坟墓。
import polars as pl
df = (
pl.scan_csv("events.csv") # 懒加载,还没有执行任何操作
.filter(pl.col("value") > 0)
.group_by("user_id")
.agg(pl.col("value").sum().alias("total"))
.sort("total", descending=True)
.collect() # 现在整个计划执行,经过优化
)
那个从 scan_csv 到 collect 的模式就是关键。这个库在接触你的数据之前会规划整个管道,然后整体优化它。一旦你内化了延迟求值,你开始在任何地方都写出更深思熟虑的代码,即使回到普通的 Pandas 中也是如此。
这个列表上最快的库,恰好也是那个以最好的方式让我的思考变慢的库。
2、Pandera
大多数数据科学 bug 不是你模型中的 bug。它们是一个本应是整数的列以字符串形式到达,一个悄然超过百分百的百分比,一个静默创建了空值的连接。你在三个笔记本之后才发现,此时你已经得出了结论。
Pandera 让你声明你的数据应该是什么样子,然后在运行时强制执行它。它对待 DataFrame 就像类型系统对待函数签名一样。
import pandera.polars as pa
from pandera import Column, Check
schema = pa.DataFrameSchema({
"age": Column(int, Check.in_range(0, 120)),
"score": Column(float, Check.le(1.0)),
"email": Column(str, Check.str_matches(r".+@.+")),
})
validated = schema.validate(df) # 当现实与声明不符时立即抛出异常
这里的行为改变是心理上的。一旦验证与你的转换逻辑并存,你就不再凭信仰信任数据。你开始每次分析时都在代码中陈述你的假设,这个单一的习惯为我捕获的静默灾难比任何仔细的人工检查都要多。
3、DuckDB
在你的笔记本电脑上的 CSV 和真正的数据仓库之间有一个奇怪的空白。文件太大以至于在内存中不舒服,太小以至于不值得启动基础设施。DuckDB 恰好填补了这个空白,它是一个礼物。
它是一个在你进程内运行的分析数据库,没有服务器,没有设置,完整的 SQL。你可以直接查询磁盘上比你的 RAM 还大的 Parquet 文件,就像查询一张表一样。
import duckdb
result = duckdb.sql("""
SELECT region, AVG(revenue) AS avg_rev
FROM 'sales_*.parquet'
WHERE year = 2026
GROUP BY region
ORDER BY avg_rev DESC
""").df() # 直接返回 DataFrame
让我变得更好的不是便利性。而是记住 SQL 往往是正确的工具,即使在一个以 Python 为主的世界中。对于聚合和连接,一个可读的查询通常胜过一塔方法链。DuckDB 消除了一切我不用 SQL 的借口——当 SQL 是更清晰的答案时。

4、Rich
这个听起来很 frivolous(无关紧要),直到你习惯了它。Rich 把终端变成了可读的东西。你可以实际阅读的彩色回溯、对齐的表格、告诉你通宵任务是否还活着或已悄悄死掉的进度条。
from rich import print
from rich.progress import track
import time
for _ in track(range(100), description="Training..."):
time.sleep(0.02)
print("[bold green]Done[/]" + " — model converged")
它之所以属于这里,是因为反馈循环塑造行为。当你的回溯可读时,你调试得更快,不再那么害怕错误。当一个长时间运行的作业显示真实的进度时,你不再紧张地检查它,而是更信任自己的管道。更好的工具让你的眼睛能看到的东西,使你成为一个更冷静、更快的从业者。
5、Pydantic
每个项目最终都会长出超参数、文件路径和环境设置的纠缠,通常以松散的字典和魔法字符串的形式散布在笔记本中。Pydantic 给这种混乱加了一根脊梁。
from pydantic import BaseModel, Field
class TrainConfig(BaseModel):
lr: float = Field(3e-4, gt=0)
epochs: int = 10
model_name: str = "resnet18"
cfg = TrainConfig(lr=0.001, epochs=50) # 已验证、有类型、可自动补全
这与 Pandera 是同一个教训,只不过应用于配置而非数据。用类型陈述你的期望,让库拒绝任何违反它们的东西。我以前遇到的一半可复现性问题,实际上是披着伪装的配置问题。
几乎每一个让我变得更好的工具都做了同样的事情:它把我脑海中模糊的假设变成了机器可以检查的东西。
6、MLflow
我丢失过好的模型。我训练了一个有效的东西,改了五个东西,就再也回不到那个好的版本了,因为好的版本只存在于记忆和一种感觉中。MLflow 结束了那个时代。
import mlflow
with mlflow.start_run():
mlflow.log_params({"lr": 0.001, "epochs": 50})
mlflow.log_metric("val_acc", 0.927)
mlflow.log_artifact("model.pt") # 权重与它们的上下文一起保存
它建立的习惯是把每一次运行当作一个可记录的事实,而不是一个转瞬即逝的事件。一旦实验被记录,比较它们就变得微不足道,你不再与过去的自己争论你到底尝试了什么。以前需要意志力的纪律现在只需要三行代码。
7、tqdm
是的,一个进度条。这个列表上最简单的库,也是我差点因为觉得太明显而排除的库。我保留它正是因为这个原因。tqdm 教会了我,知道某件事需要多长时间不是一种奢侈品,而是一种信息。
from tqdm import tqdm
for batch in tqdm(loader, desc="Epoch 1"):
train_step(batch) # 现在你知道它是在第 3 步卡住了还是在第 30,000 步
在有 tqdm 之前,我会盯着一个冻结的单元格,想知道是等待还是终止它。有了它之后,我瞬间就能做出明智的决定。一个会报告自身的循环是一个你理解的循环,而理解自己的运行时,是擅长这件事的一个悄然巨大的部分。
8、结束语
回过头来看看这七个库,一个令我注意到时感到惊讶的模式出现了。几乎没有一个是通过增加能力让我变得更好的。它们是通过增加诚实让我变得更好的。Polars 让我的逻辑变得明确。Pandera 和 Pydantic 让我的假设变得可检查。DuckDB 让我使用最清晰的工具而不是习惯性的工具。Rich、MLflow 和 tqdm 让不可见的东西变得可见,无论那是错误、实验还是时间的流逝。
这才是真正的升级。成为更好的数据科学家与知道更多算法几乎没有关系。它与构建一个拒绝让我自欺欺人的工作流有关。强制执行这种拒绝的库才是值得安装的。
从一个开始。如果你的数据又大又慢,学习 Polars。如果你的 bug 隐藏在你的数据中,学习 Pandera。选择修复当前让你变慢的那个问题的工具,让它建立的习惯完成剩下的事情。
原文链接:7 Python Libraries That Made Me a Better Data Scientist
汇智网翻译整理,转载请标明出处