
简介《Python数据科学手册》PDF与配套源代码资源包主要面向Python初学者、数据科学爱好者以及希望系统提升数据分析能力的工程师可作为案头常备的参考书。整份资源围绕Python数据科学生态展开覆盖数据预处理、科学计算、可视化和基础建模等常见任务内容由浅入深适合按章节渐进学习。压缩包大小约47.11MB内部提供完整PDF电子书与可直接运行的示例源代码PDF便于随时翻阅和重点批注源代码则适合在本机环境中动手复现。目前已有742人学习/下载受到不少学习者认可。借助这套资料读者可以对照源码逐一演练书中的案例在实际操作中理解NumPy、Pandas、Matplotlib等常用库的用法掌握从数据导入、清洗、分析到可视化的完整流程既能补齐理论短板也能增强实际编码能力是数据科学入门与进阶过程中性价比很高的学习资料。1. 为什么一本 2016 年的手册至今还是入门 Python 数据科学的最短路径《Python 数据科学手册》最反直觉的一点是它越老越适合当第一本数据科学读物。新教程年年出可数据科学在 Python 这边的核心工具链——NumPy、Pandas、Matplotlib、Scikit-learn——十年来 API 小改底层思想和调用套路几乎没变。手册按“数组→表格→画图→建模”讲完整条链恰好覆盖从业者最常用的八成场景加载结构化数据、清洗、可视化、训练评估模型。它不适合零基础的人你得先会 Python 基本语法适合两类人——写了一阵脚本报表、爬虫、量化数据处理但面对数据不知从何下手的人以及准备往机器学习走、想把基础补瓷实的人。2. 先拆骨架NumPy、Pandas、Matplotlib、Scikit-learn 四块基石怎么串成主线拿到手册先别急着翻代码。它的目录本身就是一份数据科学地图IPython 运行环境 → NumPy数组计算→ Pandas结构化数据表格→ Matplotlib可视化→ Scikit-learn机器学习。最容易走偏的读法是跳过 NumPy 直接看 Pandas——但 Pandas 底层存数据用的就是 NumPy 数组索引、分组、合并最后都回到“对数组做运算”这件事上。把四块基石之间的衔接看清楚再往下读你会明显感觉到第二遍比第一遍顺。2.1 NumPy 不是“数组教程”视图、广播和掩码才是手册的考点手册的 NumPy 章节标题看着像入门实际考点集中在三件事视图与拷贝、广播规则、掩码索引。这三件事直接决定你后面用 Pandas 会不会翻车。视图与拷贝是第一个坑。NumPy 做切片时默认返回视图而不是拷贝你改子数组原数组跟着变数据量大时这是好事省内存但在你没意识到时就是事故。import numpy as np arr np.arange(12).reshape(3, 4) sub arr[:, :2] # 取前两列返回的是视图 sub[0, 0] 99 print(arr) # arr[0, 0] 也跟着变成 99 print(sub.base is arr) # True证明 sub 不是独立副本代码逻辑arr[:, :2]在第 0 维取全部行第 1 维取前两列返回的是原数组上一段内存的“窗口”。判断一个数组是不是视图看它的.base是否指向某个父数组。真要独立副本调用.copy()例如arr[:, :2].copy()。切片带步长也一样是视图arr[::2]并不会给你额外的拷贝。参数上要注意的是切片三个位置依次代表起始、结束、步长写反了容易拿到空数组却不报错。广播规则是第二个考点。两个形状不一样的数组做运算NumPy 从尾部维度开始逐位对齐维度为 1 或缺失就自动扩张。scores np.random.randint(40, 100, size(5, 3)) # 5 个学生 3 科成绩 mean scores.mean(axis0) # 每科均值形状 (3,) centered scores - mean # 广播每行都减掉同一份 mean print(centered.shape) # (5, 3)axis0表示沿第 0 维行方向聚合得到形状 (3,) 的均值数组(5,3)减(3,)能成立靠的就是广播把(3,)扩张成(5,3)。如果形状对不上报错信息通常是 “operands could not be broadcast together with shapes”。看到这句话先停下查两个数组的 shape不要瞎换运算顺序那只会让报错变成静默的脏数据。掩码索引是第三个考点也是日常筛选数据最常用的手段。arr np.array([12, 5, 8, 21, 3]) mask (arr 10) (arr % 2 0) # 大于 10 且为偶数 print(arr[mask]) # array([12])(arr 10)和(arr % 2 0)各生成一个布尔数组做逐位与最后把布尔数组当作位置索引传回去就实现了条件筛选。两个细节容易错逻辑与必须写而不是and多个条件的每个比较式都要加括号否则运算符优先级会造成 bug。手册里“先比较、再布尔索引”的模式出现频率极高我建议在进入 Pandas 前把这三件事亲手敲一遍否则后面会反复回来查。2.2 Pandas 占全书近三分之一索引、分组、合并三件事必须过手手册的 Pandas 章节最厚这个篇幅分配是有道理的实际工作里你面对的数据绝大多数是结构化数据而 Pandas 就是处理表格的主力。这一章 API 很多但高频操作集中在三件事上。索引是第一件事。.loc按标签取值.iloc按整数位置取值Pandas 所有操作都建立在索引正确拆分的基础上。很多人喜欢在循环里一行行改 DataFrame这就是背离索引思路的典型写法手册教的是整列整块地选靠布尔索引和标签索引完成同样的筛选。import pandas as pd df pd.read_csv(sales.csv) # 一列日期、一列金额的明细 print(df.info()) # 看列类型、非空数量、内存占用 may df.loc[df[date].str.startswith(2024-05), amount]df.loc[行条件, 列名]是先按布尔条件筛行再取 amount 列df[date].str.startswith是对字符串列做向量化匹配。读文件用的read_csv是 Pandas 入场动作数据列类型、缺失值数量都要靠df.info()先摸清楚。loc里行是条件、列是名称这两个位置写反是新手高频错误报错往往不是立刻出现而是等到后面计算时才炸。.iloc则用整数位置取值df.iloc[0, 1]表示第一行第二列它和.loc的区别一定要亲手试一次。分组是第二件事。groupby的语义是 split-apply-combine先拆组、再对每组应用聚合函数、最后拼回结果。daily df.groupby(date)[amount].agg([sum, count])groupby(date)按日期拆组[amount]选定要聚合的列.agg([sum, count])一次性算总额和笔数。注意聚合后date会变成索引如果要把它恢复成普通列再加.reset_index()。很多人漏这一步后面merge时就找不齐对齐键白白多花半天排错。合并是第三件事。pd.merge的语义和数据库 join 一致on指定连接键how指定连接方式。merged pd.merge(daily.reset_index(), df, ondate, howleft)howleft表示以左边表为基准右边没有的日期会补 NaNondate是连接键。先groupby再merge是把明细表和汇总表拼在一起的标准动作日常数据处理大概率绕不开。合并后顺手检查一下行数len(merged)和左边表行数对不上时先怀疑连接键有没有重复值。2.3 Matplotlib 与 Scikit-learn用画图反哺模型调参的最小闭环Matplotlib 在手册里的定位不是“画出漂亮图”而是“快速看清数据形态”。你面对一个数据集最先该做的是画分布、看离群点、观察类别是否失衡这些判断直接影响后面选什么模型。手册用的核心范式是 Figure/Axes 对象模型——plt.subplots()返回画布和坐标轴之后所有操作都在ax上做。画图本身不是难点难点在于把它和建模串起来先画再决定下一步。比如分类问题里用散点图看两个类别在特征空间里是否线性可分这个图看完你就知道用线性模型还是核模型而不是在一开始就堆参数。Scikit-learn 放在手册最后它的价值在于把机器学习化简成一套统一 APIestimator.fit(X, y)训练predict(X)预测transform(X)做预处理。几十个模型都是同一套接口这对新手极度友好学一个就等于会了全部。手册里反复强调的两个习惯是训练前必须切分train_test_split用测试集分数说话预处理标准化、缩放要放进训练流程不能在训练前用全量数据去算均值方差——这是数据泄漏的标准来源。下面的表可以当作读完手册后回查的最小索引手册模块核心对象至少要能独立完成新手常见误用NumPyndarray切片、广播、布尔掩码筛选用 for 循环替代向量化PandasDataFrameloc/iloc、groupby、merge丢掉索引、一行行改单元格MatplotlibFigure/Axes子图布局、坐标轴标签、保存图片只调默认样式不读图Scikit-learnestimator 对象train_test_split、Pipeline、GridSearchCV全量数据训练、忽视数据泄漏这四块的衔接顺序就是手册的主线数据用 NumPy 表示用 Pandas 整理成结构化数据用 Matplotlib 确认分布最后交给 Scikit-learn 建模。很多人卡在“手册读完但做不了项目”问题多半不是不会 API而是没有把这条链走通——下一章就先把环境准备好然后完整走一遍。3. 把配套环境跑起来从安装 Python 到打开第一个 Notebook 的全流程读手册最怕的是“代码照抄但环境对不上”。手册出版得比较早代码用的是当时的库版本所以环境准备阶段的目标不是装最新版而是装一套能把手册例子稳定跑下来的组合。我一般固定成Python 3.10 或 3.11numpy 1.26.xpandas 2.xmatplotlib 3.8.xscikit-learn 1.4。这个组合对新旧代码兼容性都还算友好下面的步骤都按它来。3.1 虚拟环境与四个核心库安装装 numpy、pandas 就这几条命令第一步是把 Python 装好然后立刻养成用虚拟环境的习惯。不要看到网上的 python 安装教程里“下一步下一步”就全部装到全局——全局环境装包一时爽两个项目依赖打架时就会开始还债。python -m venv ds-env source ds-env/bin/activate # Windows 下用 ds-env\Scripts\activate python -m pip install --upgrade pip pip install numpy pandas matplotlib scikit-learn jupyter逻辑说明python -m venv ds-env创建一个独立的 Python 环境避免污染系统全局source ds-env/bin/activate把当前 shell 切换到该环境之后的 pip 安装都进这个环境里。最后一条pip install把手册的四个核心库加 Jupyter Notebook 一次装齐这就是最常见的“python 安装 numpy 库的方法”。如果下载慢把 pip 源换成国内镜像清华、阿里都行会快很多命令格式是pip install -i 镜像地址 包名。版本说明numpy 我建议锁 1.26.x因为 2.x 之后某些旧 API 有破坏性变更手册里个别例子在 2.x 下会出兼容性警告pandas 2.x 已经足够稳定手册 2016 年的写法在 2.x 下大部分能直接跑scikit-learn 1.4 以上都能跟手册走。装完后用下面的命令确认版本python -c import numpy, pandas, matplotlib, sklearn; print(numpy.__version__, pandas.__version__, matplotlib.__version__, sklearn.__version__)这一步能看到四个库的版本号。以后排查问题把这段输出发出来就能快速判断是不是版本问题。如果 import 阶段就报错优先去查环境是否激活、pip 装到了哪个解释器上——报ModuleNotFoundError九成是这个问题而不是包没装成功。在 VSCode 里则是用“选择解释器”功能把当前窗口指向ds-env的 python而不是系统自带的那个。3.2 下载手册配套 Notebook找到 PythonDataScienceHandbook 并跑通第一个示例手册作者把全书所有示例代码做成了配套 Jupyter Notebook公开放在 GitHub 上仓库名是 PythonDataScienceHandbook。这是这本书真正的宝藏——你不需要从零敲代码直接在 Notebook 里改、跑、看输出就行。git clone https://github.com/jakevdp/PythonDataScienceHandbook.git cd PythonDataScienceHandbook/notebooks jupyter notebook逻辑说明git clone把仓库拉到本地进入 notebooks 目录后启动 Jupyter。如果机器上不方便用 git也可以直接在仓库页面下载 ZIP 包再解压效果一样。启动后浏览器会打开 Notebook 列表先打开02.00-Introduction-to-NumPy.ipynb菜单里选 Kernel → Restart Run All观察有没有红色报错。第一个示例跑通后你的环境就基本合格了。注意一个细节Notebook 里很多 cell 开头有%matplotlib inline这种魔法命令它让图片直接显示在页面里是 Jupyter 环境专有的写法不能写进.py脚本。如果你见到%开头的行报错先确认自己是不是把 Notebook 的代码复制到了纯 Python 脚本里跑。3.3 conda 还是 venvpip两种方案与适用场景环境方案上手册没有强制要求但从业习惯不同选择也不同。维度venv pipconda / miniconda上手成本低Python 自带需另装 conda 工具包来源PyPIconda 源 PyPI 均可处理编译依赖弱部分包要编译器强能避免不少编译问题适合场景纯 Python 数据科学量化回测、混合 C/C 依赖、多语言环境我一般判断标准很朴素如果你只学手册加日常数据分析venv pip 足够命令简单也好排查如果你后面还要做量化交易策略这类要装回测框架、或者频繁需要带编译依赖的库conda 能省掉不少装包的血泪时间。两者不冲突conda 环境里也能用 pip 补装 PyPI 独有包。对刚起步的人我的建议是先用 venvpip 把环境跑起来等遇到具体装包困难了再上 conda不要在学习阶段被环境问题消耗掉精力。无论选哪种项目根目录放一个requirements.txt是好习惯pip freeze requirements.txt导出现状换机器时pip install -r requirements.txt一条命令恢复。这个准备过程做完手册里所有代码就都能在你机器上独立运行了。接下来把主线走一遍——从结构化数据加载到模型评估这一段我会给出一份可以直接抄的完整代码。4. 抄一份能直接跑的作业从结构化数据到分类模型的全流程闭环手册读一半的时候你最需要的是一个“把书里四块内容串起来”的完整例子而不是零散的 API 片段。这里用手写数字数据集演示一遍加载 → 清洗 → 画图 → 建模 → 评估。代码全部可以直接复制运行这个数据集自带在 scikit-learn 里练习最省事。4.1 用 Pandas 把数据接住加载、查看与清洗的固定动作拿到任何数据先别急着建模。我的固定动作是加载 → 看形状 → 看列类型和缺失值 → 再决定下一步。手册里强调的“先理解数据结构”落成代码就是下面几行。import numpy as np import pandas as pd from sklearn.datasets import load_digits digits load_digits() # 手写数字1797 个样本8x8 灰度图 X digits.data # 特征矩阵形状 (1797, 64) y digits.target # 标签0-9 的数字 df pd.DataFrame(X) df[label] y print(df.shape) # (1797, 65) print(df.isna().sum().sum()) # 0数据没有缺失值 print(df[label].value_counts().sort_index())load_digits()返回一个 Bunch 对象.data是特征矩阵.target是标签。每个样本是一张 8×8 手写数字图展平后变成 64 维向量——这就是典型的图像转结构化数据的过程。df.isna().sum().sum()先按列统计缺失值再求和一次看清全表有没有空值。value_counts()看标签分布防止类别严重失衡。真实项目里这三步要反复做尤其是来自业务系统的报表缺失值和类型错乱几乎是常态遇到数值列变成字符串这种问题pd.to_numeric(df[col], errorscoerce)是常用的补救手段。4.2 用 Matplotlib 先画再算样本长什么样直接影响模型选择数据接住之后画图是成本最低的建模前验证。这里画一张样例预览图确认数据本身是合理的。import matplotlib.pyplot as plt fig, axes plt.subplots(2, 5, figsize(10, 4)) for i, ax in enumerate(axes.flat): ax.imshow(digits.images[i], cmapgray) ax.set_title(flabel{y[i]}) ax.axis(off) plt.tight_layout() plt.savefig(digits_preview.png, dpi150)plt.subplots(2, 5)生成 2 行 5 列共 10 个子图axes.flat把二维坐标轴数组展平方便遍历。imshow用灰度显示图像cmapgray指定颜色映射axis(off)去掉坐标轴刻度。figsize控制画布宽高单位是英寸savefig把图落盘dpi150控制清晰度做汇报 PPT 时 150 够用。画图的目的不是好看而是确认每张图确实对应一个数字、像素分布没有异常、方向没有颠倒。这一步如果发现数据错位后面模型再调也白搭图本身不出现在最终报告里也没关系它是给你自己看的过程产物。4.3 管道 网格搜索Scikit-learn 里最值得抄的固定套路建模阶段手册里最有价值的习惯是“把预处理和模型绑成一个管道”然后统一调参。from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.pipeline import make_pipeline from sklearn.metrics import classification_report X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy) pipe make_pipeline(StandardScaler(), SVC(kernelrbf)) param_grid { svc__C: [1, 5, 10], svc__gamma: [0.001, 0.01, 0.1], } grid GridSearchCV(pipe, param_grid, cv5, scoringaccuracy, n_jobs-1) grid.fit(X_train, y_train) print(best:, grid.best_params_) print(train:, grid.score(X_train, y_train)) print(test :, grid.score(X_test, y_test)) print(classification_report(y_test, grid.predict(X_test)))分几段说明参数。train_test_split必须最先做test_size0.2表示留 20% 当测试集stratifyy让切分后的类别比例跟原数据一致避免某个数字在测试集里消失random_state42固定随机种子保证每次跑结果一致方便复现。make_pipeline(StandardScaler(), SVC(kernelrbf))把标准化和模型绑在一起。SVM 对特征尺度敏感所以必须先标准化再训练。管道的好处是交叉验证时每一折都各自做标准化不会用全量数据算均值方差造成数据泄漏。GridSearchCV在参数网格上做 5 折交叉验证svc__C里的svc__前缀表示参数属于管道里的 SVC 这一环。C控制误分类惩罚越大越容易过拟合gamma控制 RBF 核的影响半径越小决策边界越平滑。n_jobs-1使用所有 CPU 核加速搜索。最后用测试集上的准确率和classification_report评估classification_report同时给 precision、recall、F1 和支持数比单独看准确率更能发现问题。跑完这个例子你已经把手册的四块内容连贯走了一遍。提示标准化必须写在管道里而不是在 train_test_split 之前单独对全量数据做。用全量数据算出的均值和方差会提前“看见”测试集导致评估分数虚高这在真实项目里属于会返工的错误。如果测试集分数比训练集低很多说明过拟合如果两者都低说明模型容量不够或特征没处理好。这个诊断思路是手册教的最重要的一个习惯——不要只盯着准确率数字要看两个分数之间的差距。5. 学这本手册的 5 个常见问题与排查记录现象、原因、解决手册的坑基本都集中在“老代码 新环境”的错位上。下面 5 条是我见过频率最高的每条按现象、原因、解决三步给出方便你直接对照排查。5.1 sklearn 导入就报错cross_validation 模块去哪了现象照着手册旧版代码敲from sklearn.cross_validation import train_test_split直接ImportError: cannot import name cross_validation from sklearn。原因手册出版时 sklearn 还在 0.18 前后交叉验证相关工具在sklearn.cross_validation里sklearn 0.20 起这个模块整体迁移到sklearn.model_selection旧路径被删除。网上不少二手代码、读书笔记还在用旧路径照抄就会踩坑。解决统一改成from sklearn.model_selection import train_test_split。排查顺序是先pip show scikit-learn查版本再决定改代码还是改版本。顺带提醒网上抄代码时看到cross_validation一律先替换成model_selection能少走很多弯路。5.2 Pandas 老方法消失as_matrix 与 append 的替代写法现象手册里df.as_matrix()或df.append(...)报AttributeError。原因as_matrix()在 pandas 1.0 被移除官方建议用.values或.to_numpy()append()在 pandas 2.0 被移除用pd.concat()替代。手册写于这两个变更之前配套 Notebook 更新过但影印版、二手整理版还留着旧写法。解决拿数组用df.to_numpy()df.values也能用但新版更推荐前者拼接行用pd.concat([df1, df2], ignore_indexTrue)。ignore_indexTrue会重排索引避免拼接后索引重复导致后续loc取值错乱。5.3 Matplotlib 中文乱码标题方块字的第一修复顺序现象ax.set_title(训练集分布)后图形标题显示成一排方块。原因Matplotlib 默认字体不含中文字形Linux 服务器上尤其常见。这不是编码问题是字体缺失。解决在 Notebook 第一个 cell 里设置字体回退列表。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Microsoft YaHei, SimHei, PingFang SC, Noto Sans CJK SC] plt.rcParams[axes.unicode_minus] False # 负号显示为正常减号rcParams[font.sans-serif]是字体回退链系统按顺序取第一个安装了的字体axes.unicode_minus修负号变方块的经典问题。如果加了之后还是方块说明系统里确实没有列表中的字体需要先安装中文字体再重载。每次都写这两行太啰嗦可以存成一个plt_zh.py在 Notebook 里%run plt_zh.py即可。5.4 Notebook 里有代码但看不到图魔法命令与后端设置现象plt.plot(...)执行完没有任何报错也不显示图片。原因Jupyter 里画图依赖内核与显示后端的配合。旧版 Jupyter 需要%matplotlib inline才能把图内嵌到 cell 输出里新版 JupyterLab 有时需要%matplotlib widget或切换内核。解决在 Notebook 开头加%matplotlib inline然后重启 Kernel 再跑一次。注意它是 IPython 魔法命令不是 Python 语法写进.py会报错脚本里要用import matplotlib; matplotlib.use(Agg)做后端设置。如果加了 inline 还不行检查 Jupyter 版本必要时pip install --upgrade jupyter配套更新 ipykernel。5.5 全局环境装包导致版本冲突环境配置的还债时刻现象手册跑得好好的某天装了个新库再跑原来的 Notebook 报 numpy 或 pandas 版本冲突重装一个之后另一个项目又崩了。原因所有包都在同一个全局环境里pip 升级某个依赖会顺带升级其他包互相之间没有隔离。这是新手最常见的“环境地狱”本质是缺了环境配置这一步。解决从第一天就用虚拟环境。每个项目一个 venv 或 conda 环境项目文件里放requirements.txt换机器执行pip install -r requirements.txt就能恢复。已经在全局环境里翻车的也别急着删把项目需要的版本组合写进 venv测通了再迁移过去。这条说的是环境卫生不像前几条那样一两行就能修但它决定了手册代码能不能长期稳定复现。6. 读完手册后怎么验证真学会了三个闭卷自查实验与下一步手册看完了代码也跑通了但“看过”和“会做”之间差着一层。我验证自己的方式就三条你也可以照着做。6.1 三个闭卷自查实验一是闭卷重写。把手册第二章到第五章的每个示例不看答案重新敲一遍。敲不出来的地方做记号第二天再补。二是换数据。把手册自带的示例数据换成你实际业务里的数据——爬虫攒的、系统导出的表格都行结构越乱越好。比如手动拉一张报表模拟平时的工作流去重、补缺失、按日期重排。三是性能对比。写一个 for 循环版本和一个向量化版本用%timeit量差距。跑一次真实数据比读十遍“要向量化”都管用。6.2 从手册走向真实项目自查通过后下一步建议直接做一个小而完整的项目而不是继续囤教程。常见的起点有三个用 pandas 整理公司系统导出的结构化数据并生成日报用 Matplotlib 把量化策略的净值曲线画出来配合 pandas 做数据预处理拿一份公开数据集跑一遍特征处理、模型调参、结果评估的完整流程。这三个方向都能把手册的“四块基石”用上做完任何一个你就拥有了独立解决数据类问题的信心。最后说句私人的经验我当年学这本手册最大的教训是急着往后翻跳过 NumPy 视图那节结果在 Pandas 里改坏了原始数据排查了一整天。现在带新人我要求先把视图、广播、索引这三个概念过了再往后走。这版学习路径希望帮到你。本文还有配套的精品资源点击获取