第一章:NumPy——科学计算的基础
NumPy(Numerical Python)是Python生态系统中用于科学计算的核心库,它为Python提供了强大的多维数组对象和一系列高效的数学函数。这些功能使得数据处理、线性代数运算、傅里叶变换以及随机数生成等任务变得简单而高效。
核心特性:ndarray 多维数组
NumPy的核心是
ndarray对象,它是一个同构的、固定大小的多维容器,支持高效的元素级操作。与Python原生列表相比,
ndarray在存储和计算上更加紧凑且快速。
# 创建一个二维数组 import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.shape) # 输出: (2, 3) print(arr.dtype) # 输出: int64
上述代码创建了一个2×3的整数数组,并通过
shape和
dtype属性查看其维度和数据类型。
广播机制与向量化操作
NumPy支持广播机制,允许不同形状的数组进行算术运算,只要它们的维度兼容。这避免了显式的循环,提升了代码可读性和执行效率。
- 数组与标量的运算会应用到每个元素
- 形状相同的数组支持逐元素运算
- 不同形状数组在满足广播规则时也可运算
常用函数与性能优势
NumPy内置大量优化过的数学函数,如
np.sin、
np.exp、
np.sum等,均以C语言级别实现,显著提升运算速度。
| 函数 | 用途 |
|---|
| np.zeros() | 创建全零数组 |
| np.linspace() | 生成等差数列 |
| np.reshape() | 改变数组形状 |
第二章:Pandas——数据处理与分析的核心工具
2.1 Pandas数据结构详解:Series与DataFrame
核心数据结构概述
Pandas 提供两种主要数据结构:Series 和 DataFrame。Series 类似于一维数组,带有标签索引;DataFrame 则是二维表格结构,支持不同类型的列数据。
Series 的创建与特性
import pandas as pd s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd'])
该代码创建一个带自定义索引的 Series。其本质是值数组与索引数组的映射,支持基于标签的访问,如
s['b']返回 3。
DataFrame 的构建与操作
df = pd.DataFrame({ '姓名': ['张三', '李四'], '年龄': [25, 30] }, index=[1, 2])
此 DataFrame 包含两列数据,使用字典构造,每列可视为一个 Series。通过
df['年龄']可提取指定列。
| 结构 | 维度 | 索引支持 |
|---|
| Series | 1D | 行索引 |
| DataFrame | 2D | 行列双索引 |
2.2 数据清洗实战:处理缺失值与重复数据
在真实业务场景中,数据往往存在缺失或重复问题,直接影响分析结果的准确性。必须通过系统化方法进行清洗。
识别与处理缺失值
使用Pandas可快速检测缺失值分布:
import pandas as pd # 示例数据 df = pd.DataFrame({'A': [1, None, 3], 'B': [None, 2, 2]}) print(df.isnull().sum()) # 统计每列缺失数量
该代码输出各字段缺失计数。根据业务逻辑,可选择填充(如
df.fillna(0))或删除(
df.dropna())策略。
去除重复数据
重复记录可通过
drop_duplicates方法清除:
df_clean = df.drop_duplicates(subset=['A', 'B'], keep='first')
参数
subset指定比对字段,
keep控制保留首条或末条记录,有效确保数据唯一性。
2.3 数据筛选与索引高级操作
在处理大规模数据集时,高效的数据筛选与索引策略至关重要。通过合理构建索引,可显著提升查询性能。
复合索引的创建与使用
CREATE INDEX idx_user_status ON users (department, status, created_at);
该语句在 users 表上建立复合索引,优先按部门、状态和创建时间排序。查询中若包含这些字段的前缀匹配,即可命中索引,避免全表扫描。
条件筛选优化技巧
- 利用覆盖索引减少回表次数
- 避免在索引列上使用函数或表达式
- 优先使用等值比较,再结合范围查询
执行计划分析
| 字段 | 说明 |
|---|
| type | 连接类型,ALL表示全表扫描,ref表示非唯一索引扫描 |
| key | 实际使用的索引 |
| rows | 预估扫描行数 |
2.4 分组聚合与透视表应用
分组聚合基础操作
在数据分析中,分组聚合是提取关键统计信息的核心手段。通过
pandas.DataFrame.groupby()方法,可按指定列对数据进行分组,并应用聚合函数如
sum()、
mean()等。
import pandas as pd df = pd.DataFrame({ '部门': ['销售', '技术', '销售', '技术'], '薪资': [8000, 12000, 9000, 13000] }) result = df.groupby('部门').薪资.mean()
上述代码按“部门”列分组,计算每组薪资的平均值。其中,
groupby('部门')指定分组键,
薪资.mean()对目标列执行均值运算。
透视表构建多维分析
使用
pd.pivot_table()可快速生成多维度汇总表,支持多级索引与多重聚合。
2.5 实战案例:从CSV到数据分析报告
在本节中,我们将演示如何将一个原始的销售数据CSV文件转化为一份结构清晰的数据分析报告。整个流程涵盖数据加载、清洗、分析到可视化输出。
数据读取与初步探索
使用Python的pandas库加载CSV数据:
import pandas as pd # 读取CSV文件 df = pd.read_csv('sales_data.csv') print(df.head()) # 查看前5行数据
该代码片段通过
pd.read_csv加载数据,并用
head()快速预览结构,确认列名和缺失值情况。
关键指标计算
- 总销售额:sum(revenue)
- 月度增长率:(本月 - 上月) / 上月
- 热销产品Top 5
结果输出为报表
最终生成HTML格式报告,包含表格和图表:
| 指标 | 数值 |
|---|
| 总销售额 | ¥1,240,000 |
| 订单数 | 8,450 |
第三章:Matplotlib与数据可视化
3.1 基本图表绘制:折线图、柱状图与散点图
使用Matplotlib绘制基础图表
在数据可视化中,折线图、柱状图和散点图是最常用的图表类型。它们分别适用于展示趋势、对比和分布关系。Python中的Matplotlib库提供了简洁的接口来实现这些图表。
import matplotlib.pyplot as plt # 示例数据 x = [1, 2, 3, 4, 5] y_line = [2, 4, 6, 8, 10] y_bar = [3, 7, 5, 9, 2] y_scatter = [1, 5, 3, 8, 6] # 折线图 plt.plot(x, y_line, label='趋势') # 柱状图 plt.bar(x, y_bar, label='对比') # 散点图 plt.scatter(x, y_scatter, label='分布') plt.legend() plt.show()
上述代码中,
plt.plot()用于绘制连续趋势,
plt.bar()展示分类数据对比,
plt.scatter()揭示变量间潜在关系。参数
label用于图例标注,增强可读性。
图表选择建议
- 折线图适合时间序列或有序数据的趋势分析
- 柱状图适用于不同类别间的数值比较
- 散点图用于发现两个变量之间的相关性或聚类模式
3.2 多子图布局与图形定制化
在复杂数据可视化场景中,多子图布局能够将多个相关图表组织在同一画布中,提升信息对比与关联分析效率。通过网格划分或自定义位置,可灵活配置子图排列方式。
子图布局模式
常见的布局方式包括水平排列、垂直堆叠和网格分布。Matplotlib 提供 `plt.subplots()` 实现多子图管理:
fig, axes = plt.subplots(2, 3, figsize=(12, 8)) for i in range(2): for j in range(3): axes[i, j].plot([0, 1, 2], [i, j, i+j]) axes[i, j].set_title(f'Subplot ({i+1},{j+1})')
上述代码创建 2×3 网格结构,`axes` 为二维数组,每个元素对应一个子图对象,支持独立绘图操作。`figsize` 控制整体画布大小,避免图表拥挤。
图形定制化选项
- 通过
set_xlabel()和set_ylabel()自定义坐标轴标签 - 使用
tick_params()调整刻度线样式 - 结合
legend()优化图例位置与显示内容
3.3 实战:基于真实数据集的可视化分析
加载与预处理数据
使用 Pandas 加载 CSV 格式的真实销售数据集,并进行缺失值处理和时间字段解析。
import pandas as pd # 读取数据并解析日期列 df = pd.read_csv('sales_data.csv', parse_dates=['order_date']) # 填充数值型字段的缺失值 df['sales'] = df['sales'].fillna(df['sales'].mean())
代码中
parse_dates确保时间序列可被识别,
fillna使用均值策略保持数据分布稳定。
可视化趋势分析
利用 Matplotlib 绘制月度销售额变化趋势图,揭示季节性波动特征。
- 按月份聚合销售总额
- 绘制折线图观察增长趋势
- 标注峰值点用于业务归因分析
第四章:Requests与网络爬虫入门
4.1 HTTP请求基础与Requests库核心方法
HTTP(HyperText Transfer Protocol)是客户端与服务器之间通信的基础协议。在Python中,`requests`库以其简洁的API成为发送HTTP请求的事实标准。
常用HTTP方法与对应操作
- GET:获取资源,如网页内容或API数据
- POST:提交数据,常用于表单提交或创建资源
- PUT/PATCH:更新已有资源
- DELETE:删除指定资源
使用Requests发送GET请求
import requests response = requests.get("https://httpbin.org/get", params={"key": "value"}) print(response.status_code) # 输出状态码,如200 print(response.json()) # 解析JSON响应
上述代码通过params参数自动编码查询字符串,response.json()将响应体解析为Python字典,适用于处理RESTful API返回的数据。
POST请求提交表单数据
data = {"username": "admin", "password": "123456"} response = requests.post("https://httpbin.org/post", data=data)
此处data参数以表单形式(application/x-www-form-urlencoded)发送数据,常用于模拟登录场景。
4.2 解析HTML内容:结合BeautifulSoup实践
在网页抓取过程中,解析HTML结构是提取有效信息的关键步骤。BeautifulSoup 是 Python 中广泛使用的库,擅长将杂乱的 HTML 文本转化为可操作的对象树。
安装与基础用法
首先通过 pip 安装库:
pip install beautifulsoup4
该命令安装 BeautifulSoup4 主包,依赖解析器如 lxml 或 html.parser。
解析HTML文档
使用 BeautifulSoup 解析网页内容并定位元素:
from bs4 import BeautifulSoup import requests response = requests.get("https://example.com") soup = BeautifulSoup(response.text, 'html.parser') title = soup.find('h1').get_text()
find()方法返回首个匹配标签,
get_text()提取其中纯文本内容,避免HTML标签干扰。
常用选择方式对比
| 方法 | 用途 |
|---|
| find() | 获取第一个匹配节点 |
| find_all() | 获取所有匹配节点列表 |
| select() | 支持CSS选择器语法 |
4.3 模拟登录与会话维持技巧
在自动化测试或爬虫开发中,模拟登录是获取受权限保护资源的关键步骤。通常通过捕获浏览器登录时的请求参数,复用 Cookie 或 Token 实现身份保持。
常见认证机制
- 基于 Session + Cookie 的服务器端认证
- JWT(JSON Web Token)无状态认证
- OAuth 2.0 第三方授权登录
Python 示例:使用 requests 维持会话
import requests session = requests.Session() login_url = "https://example.com/login" payload = {"username": "test", "password": "123456"} # 发起登录请求,自动保存 Cookie response = session.post(login_url, data=payload) if response.status_code == 200: # 后续请求自动携带认证信息 profile = session.get("https://example.com/profile") print(profile.text)
上述代码利用
requests.Session()自动管理 Cookie,实现跨请求的会话保持。相比单次请求,Session 对象能持久化头部、Cookie 和连接,提升效率并模拟真实用户行为。
4.4 实战项目:天气数据抓取与存储
API 数据获取
使用 Python 的
requests库向 OpenWeatherMap 发起 GET 请求,获取指定城市的实时天气数据。需在请求头中携带有效 API 密钥。
import requests def fetch_weather(city, api_key): url = f"http://api.openweathermap.org/data/2.5/weather" params = {'q': city, 'appid': api_key, 'units': 'metric'} response = requests.get(url, params=params) return response.json()
参数说明:
city为城市名,
api_key是用户认证密钥,
units='metric'表示温度以摄氏度返回。
数据持久化存储
将获取的 JSON 数据写入本地 SQLite 数据库,确保结构化存储便于后续分析。
- 创建 weather_data 表,包含字段:city, temperature, humidity, timestamp
- 使用
sqlite3模块执行 INSERT 语句 - 每小时定时任务通过
schedule模块触发
第五章:Flask——轻量级Web应用开发
快速搭建一个RESTful API服务
使用Flask可以迅速构建一个轻量级的API服务。以下是一个实现用户查询接口的示例,支持JSON响应和路径参数:
from flask import Flask, jsonify, request app = Flask(__name__) # 模拟用户数据 users = { 1: {"name": "Alice", "email": "alice@example.com"}, 2: {"name": "Bob", "email": "bob@example.com"} } @app.route('/api/user/<int:user_id>', methods=['GET']) def get_user(user_id): user = users.get(user_id) if not user: return jsonify({"error": "User not found"}), 404 return jsonify(user) @app.route('/api/user', methods=['POST']) def create_user(): data = request.get_json() new_id = max(users.keys()) + 1 users[new_id] = {"name": data['name'], "email": data['email']} return jsonify({"id": new_id, **users[new_id]}), 201 if __name__ == '__main__': app.run(debug=True)
Flask扩展生态的实际应用
在生产环境中,通常会结合以下扩展提升开发效率与系统能力:
- Flask-SQLAlchemy:简化数据库操作,支持ORM模型定义
- Flask-WTF:处理表单验证与CSRF防护
- Flask-Login:管理用户会话与身份认证
- Flask-CORS:轻松启用跨域资源共享
部署前的关键配置项
| 配置项 | 开发环境值 | 生产环境建议值 |
|---|
| DEBUG | True | False |
| SECRET_KEY | "dev-key" | 随机生成的长字符串 |
| SQLALCHEMY_DATABASE_URI | sqlite:///app.db | postgresql://user:pass@localhost/prod_db |
第六章:Scikit-learn——机器学习入门利器
第七章:TensorFlow与PyTorch——深度学习双雄
第八章:OpenCV——计算机视觉实战工具
第九章:SQLAlchemy——Python中的数据库ORM
第十章:Logging——专业级日志管理方案
第十一章:Threading与Multiprocessing——并发编程实践
第十二章:总结与进阶学习路径