快到国庆节了,有很多小朋友都有一段时间比较长的假。这种整块的、不用打卡、不用开会的时间,一年也没几段。用来躺着刷手机,刷完了其实啥也没剩下;用来啃一门技术,十天足够把一套东西从"听说过"变成"能上手"。
当初的《Python 基础语法5分钟入门》https://mp.weixin.qq.com/s/9uB7Ct02HFQwo06VP0rpWg 里,数据类型、列表字典、索引切片、if/for、函数、模块、异常,这些看一遍就能懂,写点小脚本也够用了。
但如果你打算往数据分析、数据科学这个方向做点开发和探索,光会语法是不够的。语法只是"会写字",离"能写出有用的东西"还差三样:一套顺手的工具环境、一批核心的库、以及一点统计和数据的思维方式。
这篇文章就按这个思路来介绍一下。
每个库都要清楚:官网在哪、核心功能是什么、典型用在什么场景、优势和劣势各是什么。
一、先把环境弄对,别在系统 Python 上瞎装
这一步很多人跳过,然后被环境问题折磨三天,假期就废了。我先说这个。
第一件事,别往系统的 Python 里 pip install。 系统那个 Python 是给操作系统自己用的,如果装乱了,轻则某些系统工具报错,重则终端里一堆东西用不了。装东西一定要在虚拟环境里。
虚拟环境以前大家都用 conda,现在我个人更推荐 uv。它快,管理 Python 版本和依赖都很利索。
- Miniconda 官网:https://docs.conda.io/projects/miniconda/en/latest/
- uv 官网:https://docs.astral.sh/uv/
用 uv 建环境就这么几步:
# 装 uv(macOS/Linux)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 建一个项目目录,指定 Python 版本
uv init ds-holiday
cd ds-holiday
uv venv --python 3.12
# 装库
uv add numpy pandas matplotlib scipy scikit-learn
第二件事,装个能交互式跑代码的东西。 数据分析跟写网站不一样,你需要一边看数据长什么样、一边改代码。Jupyter 就是干这个的,官网在 https://jupyter.org 。现在更省事的做法是用 VS Code 装个 Jupyter 插件,或者直接上 JupyterLab。我个人习惯 VS Code 里开 .ipynb,改一行看一行结果。
第三件事,把镜像源配上。 国内直连 PyPI 经常慢得让人怀疑人生。中科大 USTC 的源很稳:
pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple
Windows 上从 USTC 镜像装 Miniconda3 的完整步骤,我之前单独写过一篇,《Windows 系统下从中科大 USTC 镜像安装 Miniconda3 完整指南》https://mp.weixin.qq.com/s/fR6k5iSrEbS1df-nBqLffg?token=916056284&lang=zh_CN
环境搞定,后面才顺畅。
二、数据科学的四件套
这四样是地基,不管后面做哪个方向都绕不开。我按学习顺序排:NumPy 打底,pandas 做表格,Matplotlib 画图,SciPy 补科学计算。
NumPy:一切的地基
官网:https://numpy.org
NumPy 就干一件事,提供一种叫 ndarray 的多维数组,然后让所有对数组的操作都在底层用 C 语言跑,快到飞起。它的核心思想叫向量化和广播:你不用写 for 循环,直接对整个数组做运算,代码短、速度快。
典型场景是所有跟数值沾边的活:矩阵运算、图像处理(图像本质就是三维数组)、信号处理、机器学习里所有张量操作。可以说 Python 数据科学这一整座楼,地基都是 NumPy。
优势很明确:快(底层 C 和 BLAS 库)、生态基础(pandas、SciPy、scikit-learn 全建在它上面)、广播机制让代码极简。
劣势也得说清楚:它没有列名,只有数字下标,做表格分析很别扭;默认把所有数据一次性读进内存,数据大了就爆内存;对缺失值、混合类型的支持也很差。所以你不能拿 NumPy 直接分析一张有表头、有字符串、有空值的业务表,那是 pandas 的活。
import numpy as np
a = np.arange(12).reshape(3, 4)
b = np.array([10, 20, 30, 40])
print(a * 2) # 整个数组乘 2,不用 for
print(a + b) # 广播:b 自动扩展成 3x4 再加
print(a.mean(axis=0)) # 按列求平均
pandas:表格处理的事实标准
官网:https://pandas.pydata.org
如果说 NumPy 是数组,pandas 就是"带行列名的表格"。它提供两个核心对象:Series(一列)和 DataFrame(一张表)。你在 Excel 里干的所有事,筛选、排序、透视、分组、合并、填充缺失值,pandas 都能干,而且能处理几十万行这个量级。
典型场景:数据清洗(这一步能占数据分析 70% 的时间)、特征工程、时间序列分析、结果汇总。它能直接读 CSV、Excel、JSON、SQL、Parquet,非常省事。
优势是生态和文档无敌。你遇到的几乎每个问题,网上都有现成的 pandas 答案;API 也符合直觉,df[df['age'] > 18] 这种写法一看就懂。
劣势主要有三个。第一,内存吃紧,它默认还是全量加载,数据超过内存就很尴尬。第二,它是单线程的,现在 CPU 核心那么多,它却只用一个,浪费。第三,历史包袱重,有些老 API 设计得别扭,你可能会经常看到 SettingWithCopyWarning 这种警告,本质是它想区分"视图"和"副本",但设计得不够干净。
import pandas as pd
df = pd.read_csv("sales.csv")
df = df.dropna(subset=["amount"])
summary = (
df[df["amount"] > 0]
.groupby("region")["amount"]
.agg(["count", "sum", "mean"])
.sort_values("sum", ascending=False)
)
print(summary)
Matplotlib:最经典的画图库
官网:https://matplotlib.org
Matplotlib 是 Python 里历史最久、最经典的画图库,几乎任何静态图它都能画,折线、柱状、散点、热力图、等高线、3D 图,要什么有什么。它的另一个身份是"底座":seaborn、pandas 的 .plot() 底层调的都是它。
典型场景:论文插图、报告里的图表、任何需要精确控制的地方。它的控制力可以细到"这个刻度标签旋转 45 度、字号 8、颜色 #333"。
优势是全能、可控、稳定,画出来的图能直接进期刊。
劣势是默认样式比较丑,得自己调;它有两套 API(pyplot 快速版和面向对象的 Figure/Axes 版),新手经常搞混;交互性差,图上不能缩放拖拽。所以日常探索数据我更爱用 seaborn,要精细排版才回来用 Matplotlib。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3, 4], [1, 4, 9, 16], marker="o")
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_title("demo")
plt.tight_layout()
plt.savefig("demo.png", dpi=150)
SciPy:科学计算的工具箱
官网:https://scipy.org
SciPy 是建立在 NumPy 之上的一整套科学计算算法库。它按功能分了很多子模块:scipy.optimize(优化、求根、曲线拟合)、scipy.integrate(积分、解微分方程)、scipy.interpolate(插值)、scipy.stats(统计分布和检验)、scipy.signal(信号处理、滤波)、scipy.sparse(稀疏矩阵)、scipy.linalg(线性代数)。
典型场景:给一组实验数据拟合一条曲线、做傅里叶变换、算 t 检验、解一个常微分方程。做科研和工程的基本都要用到。
优势是算法全、经过几十年打磨、可靠。劣势是它的 API 比较"科学",不像 pandas 那么友好,参数多、文档偏学术;而且它和 NumPy 边界有点模糊,新手经常不知道某个函数该去哪找。我的经验是:数值数组操作找 NumPy,需要"某个具体算法"的时候去 SciPy 翻。
import numpy as np
from scipy import stats
data = np.array([1.2, 1.5, 1.1, 1.8, 1.4])
print(stats.describe(data))
# 跟 1.0 比,看有没有显著差异
print(stats.ttest_1samp(data, 1.0))
三、统计和可视化:让数据说人话
四件套之后,如果方向偏"分析"而不是"工程",这两个库要补。
statsmodels,官网 https://www.statsmodels.org 。它跟 scikit-learn 不一样,scikit-learn 关心"预测得准不准",statsmodels 关心"这个变量到底有没有影响、影响多大、显不显著"。回归、方差分析、时间序列(ARIMA)、假设检验,它给的输出是一张完整的统计表,p 值、置信区间、R² 全都有。做经济学、社会科学、医学统计的人离不开它。劣势是速度慢、API 偏统计学思维,做大规模预测不合适。
seaborn,官网 https://seaborn.pydata.org 。它建在 Matplotlib 上,专治"统计图"。一行代码就能画出带回归线的散点图、分组箱线图、相关性热力图,默认配色还好看。做探索性分析(EDA)的时候,它是我的第一选择。劣势是自由度不如 Matplotlib,画很特殊的图会受限,而且它默认在背后偷偷调 Matplotlib,出问题的时候错误信息会有点绕。
Plotly,官网 https://plotly.com/python/ 。它的卖点是交互:图能缩放、悬停显示数值、点击筛选,还能直接嵌到网页里。做数据看板、要给非技术同事演示的时候特别好用。plotly.express 那套接口跟 seaborn 一样简洁。劣势是图比静态图重、导出成图片要额外装东西、离线环境配置稍微麻烦。
四、机器学习:scikit-learn 打底
官网:https://scikit-learn.org
scikit-learn 是传统机器学习(非深度学习)的标准库。它最值钱的地方不是算法多,而是接口统一:所有模型都是 fit() 训练、predict() 预测、transform() 转换。你学会一个,就等于学会了几十个。它还提供了 Pipeline(把预处理和模型串成一条流水线)、交叉验证、网格搜索、各种评估指标,做完整实验流程够用了。
典型场景:分类(这封邮件是不是垃圾邮件)、回归(明天销量多少)、聚类(这些用户能分成几类)、降维(把高维数据压到二维画图)。
优势是接口一致、文档有大量示例、算法覆盖全、依赖轻。劣势是它不做深度学习(神经网络部分很弱,真要做 CNN、Transformer 得换 PyTorch),也不擅长超大规模数据(数据太大要配 Dask 或换 Spark),而且它默认单机内存计算。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
print(accuracy_score(y_test, model.predict(X_test)))
如果你做的是表格数据(业务数据、实验数据这类),那真正在比赛和生产里占据主流的往往不是神经网络,而是梯度提升树:
- XGBoost:https://xgboost.readthedocs.io
- LightGBM:https://lightgbm.readthedocs.io
这俩在结构化数据上的精度和速度,通常比随机森林更好,Kaggle 上表格比赛的获奖方案里一半以上都有它们。优势是精度高、能处理缺失值、有特征重要性、训练快(LightGBM 尤其快)。劣势是参数多、调参要经验、可解释性不如线性模型,而且容易过拟合,得靠交叉验证和正则化压住。
再往上就是深度学习。PyTorch(https://pytorch.org )现在是学术界和工业界的主流,接口灵活、调试方便。但它需要 GPU,学习曲线也陡,如果你只是想做数据分析,我建议先别碰,把 scikit-learn 吃透了再说。真要做图像、文本、大模型相关,再单独安排时间。
五、数据变大的时候,该怎么办
前面那套在几十万行、几百 MB 的规模上很舒服。数据一旦涨到几 GB、几十 GB,pandas 就开始卡、开始爆内存。这时候有几条路。
Polars,官网 https://pola.rs 。它是用 Rust 写的 DataFrame 库,多线程、列式存储、还带查询优化,单机处理速度比 pandas 快很多(官方说能到几十倍,实际看场景)。API 跟 pandas 有相似之处,学起来不算难。劣势是生态还不如 pandas 成熟,很多第三方库只认 pandas,而且有些写法跟 pandas 不一样,迁移要改代码。
DuckDB,官网 https://duckdb.org 。它是个"能嵌进 Python 里的分析型 SQL 数据库",不用起服务器,pip install duckdb 就能用。你可以直接对 CSV、Parquet 文件跑 SQL,还能和 pandas DataFrame 互相转。数据大到内存装不下,它也能靠流式处理扛一扛。劣势是它是 SQL 思维,习惯 pandas 链式写法的人要适应;对非表格的复杂数据结构支持一般。
PyArrow,官网 https://arrow.apache.org/docs/python/ 。它是 Apache Arrow 的 Python 接口。Arrow 是一种列式内存格式,Parquet 文件、DuckDB、Polars、pandas 之间能"零拷贝"共享数据,靠的就是它。你平时不一定直接写 Arrow 代码,但了解它有助于理解为什么现在这套工具能跑那么快。
Dask,官网 https://www.dask.org 。它解决的是"数据比内存大"和"想用多核/多机"的问题。它的 DataFrame 接口跟 pandas 基本一样,把 pd.read_csv 换成 dd.read_csv,最后加个 .compute(),就能把计算自动切块、并行跑到多个核心甚至一个集群上。劣势是它的延迟计算模型(lazy)跟 pandas 的即时计算不一样,调试时不容易一眼看到中间结果;小数据上用它是杀鸡用牛刀。
我个人的建议:先别急着学 Dask 和 Polars。把 pandas 用熟,遇到真的扛不住的数据,再按需换。
六、数据从哪来:Kaggle 和 ModelScope
如果你手上没有数据,或者想拿真实数据练手,最省事的办法是去公开数据集平台直接下。国内用得多的是这两个。
Kaggle,官网 https://www.kaggle.com ,数据集板块在 https://www.kaggle.com/datasets 。它是全球最大的数据科学社区和竞赛平台,公开数据集有几十万个,房价、天气、医疗、金融、图像、文本各个方向都有。好处是数据质量相对可控,每个数据集都有说明,还能看下载量和投票数来判断靠不靠谱;它自带免费的在线 Notebook(有 GPU 额度),本地环境都不用配就能跑;社区里还有大量别人分享的代码(kernel),可以拿来学别人怎么做特征、怎么建模。劣势是国内访问不稳定,经常得借助网络工具;数据集以英文和国外场景为主;部分竞赛和数据集要接受规则或完成手机验证才能下载。
想在本地用,装个官方 CLI,配上 API token 就能拉:
pip install kaggle
# 把 kaggle.json 放到 ~/.kaggle/ 下
kaggle datasets download -d <owner/dataset-name>
ModelScope(魔搭),官网 https://www.modelscope.cn ,数据集板块在 https://www.modelscope.cn/datasets 。它是阿里推出的模型和数据社区,国内访问速度快,中文数据集比 Kaggle 多不少,很多是国内机构、高校发布的数据,做中文 NLP、中文问答这类任务很合适。它既能在网页上直接下,也能用 modelscope 这个库拉取,和 Python 脚本集成很方便:
pip install modelscope
from modelscope.msdatasets import MsDataset
ds = MsDataset.load("<数据集名>", subset_name="default", split="train")
优势是国内直连、下载快、中文数据友好、和自家的模型库打通。劣势是数据集的绝对数量和沉淀时间不如 Kaggle,检索和筛选体验也还有提升空间,部分数据集需要登录甚至申请授权才能用。
简单说:练手、找英文和通用数据,去 Kaggle;找中文数据、想下载快,去 ModelScope。两个都注册一下,不麻烦。
七、按方向再延伸
上面是通用底座。如果你有比较关注的具体领域,再挑对应的库:
- 地理空间数据:GeoPandas(https://geopandas.org ),把 GeoJSON、Shapefile 当 DataFrame 处理。我早些年做地球化学、空间分析,这类库很实用。
- 图/网络:NetworkX(https://networkx.org ),社交网络、关系分析。
- 图像:OpenCV(https://opencv.org )做工程级图像处理,scikit-image(https://scikit-image.org )偏科研算法。
- 文本:中文分词用 jieba,工业级 NLP 用 spaCy(https://spacy.io )。我在《Python NLP 利器:分词与词性标注库总结与实战》里详细写过,这里不重复。
- 符号计算:SymPy(https://www.sympy.org ),推导公式、解方程、求导积分,写教程和做理论验证很方便。
八、日程上怎么排
工具列了一堆,但假期有限,贪多效果可能最差,开心快乐最重要,核心原则是项目驱动,别只看教程。
前两天,装环境 + 啃 NumPy。把 ndarray、切片、广播、轴(axis)这几个概念搞清楚。
接下来,主攻 pandas。读文件、筛选、分组聚合、合并、处理缺失值、时间序列。这是投入产出比最高的一段,学完立刻能干实事。
用 pandas 的同时,就可以搭配 matplotlib + seaborn。学会画折线、散点、柱状、箱线、雷达图、热力图这五种就够覆盖大部分需求。
都弄完了,scikit-learn。走一遍完整流程:划分训练测试集、训练、预测、评估、交叉验证。再了解一下过拟合和正则化。
在这个过程中,找一份感兴趣的数据,争取做一个完整的、自己感兴趣的小项目。这一步最关键。比如:
- 从某个公开 API 抓数据(天气、股票、GitHub 仓库),清洗后做统计,画图,最后写个简单预测。
- 从 Kaggle(https://www.kaggle.com )或 UCI 数据集仓库(https://archive.ics.uci.edu )下一个数据集,从零做一遍分析。
- 用天池(https://tianchi.aliyun.com )上的入门赛题练手。
一个完整项目走下来,比看十个教程学到的都多。因为你一定会遇到教程里没讲的问题:编码不对、日期格式乱、缺失值一堆、某个库版本不兼容,这些才是真实世界的常态。
九、一点建议
别贪多。 有人一上来就想把 NumPy、pandas、PyTorch、Spark 全学了,结果十天过去每个都只看了个开头。四件套吃透,比什么都会一点强得多。
尽量别看视频。 看视频容易觉得都懂了,自己一写就卡壳,这是常态。数据科学这东西,代码一定得动起来。看一段,自己敲一遍,改改参数看看结果怎么变。
数学不是拦路虎,但迟早要补。 刚开始做数据分析,统计里会算个均值方差、会看 p 值,线性代数知道矩阵乘法怎么回事,就够用了。等你要深入建模、理解算法原理的时候,概率统计和线性代数就得认真学,遇到啥就学啥,反正现在查资料也方便。
环境问题会吃掉你一半时间。 这不是你的错,是这个生态的现状。装库失败、版本冲突、编码报错,遇到就慢慢查,别怀疑自己智商。装好一次环境、存一个能用的配置,以后能省很多事,而且尽量自己学会,不要只靠AI帮忙完成。
按这个路走下来,至少能从一个"会写 Python 语法的人"变成"能独立做一份数据分析的人"。
祝同学们假期过得充实。