当前位置: 首页 > news >正文

数据科学家离不开的7个Python库

每一篇关于 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_csvcollect的模式就是关键。这个库在接触你的数据之前会规划整个管道,然后整体优化它。一旦你内化了延迟求值,你开始在任何地方都写出更深思熟虑的代码,即使回到普通的 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库 - 汇智网

http://www.cnnetsun.cn/news/2682247.html

相关文章:

  • 从地铁闸机到服务器:用Postman搞懂‘高并发’到底在测什么?(实战图书管理API)
  • Qwen3.6-27B-OBLITERATED社区贡献指南:如何参与项目开发
  • 告别Dev-C++ 5.11!用Qt打造的小熊猫C++,轻量IDE也能有VS Code的体验?
  • Arm CMN700 RAS固件优先错误注入实现详解
  • 别再问H5怎么调用摄像头了!一个Vue3组件搞定拍照上传(附完整代码和ngrok调试避坑)
  • 别再写原生SQL了!Mybatis-Plus的QueryWrapper和UpdateWrapper保姆级教程(附避坑指南)
  • 本地服务注册测试环境Nacos失败?别慌,排查这个9848端口映射就对了
  • 别再只用手机测速了!手把手教你用Aircrack-ng和Kali Linux监听WiFi,看看邻居家路由器都在忙啥
  • 在RK3588上把YOLOv8推理速度优化到17ms:我的C++部署踩坑与调优实录
  • 别再手动改文件名了!用Python脚本批量处理MEIC数据,5分钟搞定WRF-CHEM排放清单
  • 从Ajtai的突破到现代密码学:手把手理解SIS问题如何成为抗量子攻击的基石
  • WeChatMsg终极指南:三步永久保存微信聊天记录,打造你的数字记忆保险箱
  • STM32 HAL库驱动SHT30温湿度传感器,从硬件连接到数据读取的完整流程(附逻辑分析仪调试技巧)
  • 用逻辑分析仪和串口助手调试SHT30:一次搞定I2C时序、数据校验和通信故障
  • HY-Embodied-0.5-X与开源模型的对比分析:性能优势与适用场景
  • STM32 HAL库驱动SHT30温湿度传感器,从零开始手把手教你搞定I2C通信(附完整代码)
  • 鸿蒙开发-想在多线程间共享色彩配置?sendableColorSpaceManager怎么用
  • 如何快速配置Python票务助手:面向新手的完整指南
  • 告别繁琐脚本!用CANoe AutoSequence可视化插件5分钟搞定自动化测试(附VisualSequence保姆级教程)
  • 具身智能研究现状与未来前景(四):具身导航——从几何路径规划到语义目标驱动的自主移动
  • 别再只显示数字了!玩转高德地图MarkerCluster:用权重实现动态业务图标与聚合策略
  • 保姆级教程:用u-center配置u-blox ZED-F9P的RTK基站与移动站(附避坑指南)
  • 5分钟掌握OpCore Simplify:黑苹果OpenCore配置从入门到精通
  • Python之encryptech包语法、参数和实际应用案例
  • 炉石传说HsMod终极指南:55+功能增强与高级游戏体验优化方案
  • 终极美化指南:5分钟打造你的专属foobar2000音乐播放器界面
  • AI Agent Harness Engineering 幻觉问题根源:从模型、数据到Prompt的全方位解析
  • 安卓手机上跑得动的人体识别+关节定位演示APP(含CPU/GPU双加速)
  • Snowflake Arctic-Embed-L OpenMind长文本处理方案:突破512 token限制的终极技巧
  • french_emotion_camembert vs 传统方法:为什么82.95%准确率的它更适合法语NLP任务