合集:AI开发环境搭建
一、安装
Python是一种广泛使用的高级编程语言,特别适用于数据分析和机器学习领域。常用数据分析和传统机器学习开发包的安装方法如下:
conda create -n ml python=3.12
conda activate ml
conda install numpy pandas matplotlib seaborn statsmodels
conda install scipy
conda install openpyxl 3.1.5
openpyxl 是一个用于读写 Excel 2010 xlsx/xlsm/xltx/xltm 文件 的 Python 库。它是目前最流行的处理 Excel 文件的工具之一,尤其适合操作现代 Excel 格式(.xlsx
),但不支持旧版的 .xls
格式(需使用 xlrd
或 xlwt
等其他库)。
安装后的开发包版本信息:
conda list
# packages in environment at C:\AppData\Conda-Data\envs\ml:
#
# Name Version Build Channel
python 3.12.7 h14ffc60_0 anaconda
numpy 1.26.4 py312hfd52020_0 anaconda
scipy 1.13.1 py312hbb039d4_0 anaconda
pandas 2.2.2 py312h0158946_0 anaconda
scikit-learn 1.5.1 py312h0158946_0 anaconda
matplotlib 3.9.2 py312haa95532_0 anaconda
seaborn 0.13.2 py312haa95532_0 anaconda
statsmodels 0.14.2 py312h4b0e54e_0 anaconda
openpyxl 3.1.5
lightgbm 4.6.0 py312h5da7b33_0 anaconda
以下是Python中几个重要的数据分析和机器学习库的介绍:
二、NumPy
NumPy是一个强大的数值计算库,提供了高性能的多维数组对象ndarray以及对数组进行各种快速操作,包括数学、逻辑、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等。
NumPy的主要功能:
- 处理大量数据
- 进行各种复杂的数学运算
- 提供广播机制
- 与线性代数、傅里叶变换和随机数生成等功能结合。
为什么用NumPy?
- 性能优势:对大规模数据,NumPy 的向量化操作比 Python 循环快数十到数百倍。
- 代码简洁:避免显式循环,直接操作整个数组。
- 生态支持:是数据科学工具链(如 Pandas、TensorFlow)的基础。
样例
1. 创建数组
import numpy as np
# 从列表创建一维数组
a = np.array([1, 2, 3, 4])
print(a) # 输出: [1 2 3 4]
# 创建二维数组(矩阵)
b = np.array([[1, 2], [3, 4]])
print(b)
# 输出:
# [[1 2]
# [3 4]]
2. 快速生成数组
# 生成全零数组
zeros = np.zeros((2, 3))
# 输出:
# [[0. 0. 0.]
# [0. 0. 0.]]
# 生成等差数组
range_arr = np.arange(0, 10, 2) # 0到10,步长2
print(range_arr) # 输出: [0 2 4 6 8]
# 生成均匀分布的数组
linspace_arr = np.linspace(0, 1, 5) # 0到1,5个点
print(linspace_arr) # 输出: [0. 0.25 0.5 0.75 1. ]
3. 数组运算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 元素级加法
print(a + b) # 输出: [5 7 9]
# 标量乘法
print(a * 2) # 输出: [2 4 6]
# 矩阵乘法(点积)
c = np.dot(a, b)
print(c) # 输出: 32 (1 * 4 + 2 * 5 + 3 * 6)
4. 索引与切片
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取第二行第三列的元素
print(arr[1, 2]) # 输出: 6
# 切片:获取前两行,最后一列
print(arr[:2, -1]) # 输出: [3 6]
# 布尔索引
mask = arr > 5
print(arr[mask]) # 输出: [6 7 8 9]
5. 广播机制
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
# 广播规则:将 b 扩展为 [[10, 20], [10, 20]],再相加
print(a + b)
# 输出:
# [[11 22]
# [13 24]]
6. 数学函数
arr = np.array([1, 4, 9])
# 平方根
print(np.sqrt(arr)) # 输出: [1. 2. 3.]
# 三角函数
angles = np.array([0, np.pi/2, np.pi])
print(np.sin(angles)) # 输出: [0. 1. 0.]
# 聚合函数
print(arr.mean()) # 输出: 4.666...
NumPy 向量化操作 vs Python 数组操作
NumPy 向量化操作 vs Python 数组操作的核心区别与比较:
1. 执行效率
- NumPy 向量化操作: 基于底层 C 语言实现,使用连续内存存储,无需显式循环,利用 SIMD 指令加速,适合处理大规模数值数据。 示例:计算两个数组的和 import numpy as np
a = np.array([1e6个元素])
b = np.array([1e6个元素])
result = a + b # 向量化操作,快速完成 - Python 原生数组(List): 通过循环逐个元素处理,解释执行的效率低,内存不连续,适用于小数据或混合类型数据。 a = [1, 2, …, 1e6个元素]
b = [2, 3, …, 1e6个元素]
result = [x + y for x, y in zip(a, b)] # 循环耗时较长性能对比:NumPy 速度可比 Python List 快 10-100 倍。
2. 语法与代码简洁性
- NumPy: 直接支持数学运算符和向量化函数(如
np.sin
,**
等),代码简洁,更贴近数学表达式。 # 计算数组各元素的平方并求和
total = (np.array([1, 2, 3]) ** 2).sum() - Python 数组: 依赖循环或
map
函数,代码冗余复杂。 arr = [1, 2, 3]
total = sum([x**2 for x in arr])
3. 功能扩展性
- NumPy: 提供丰富的数学函数(如线性代数、统计、傅里叶变换等),支持多维数组操作(矩阵乘法、广播机制)。 # 矩阵乘法
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = A @ B # 或 np.dot(A, B) - Python 数组: 需手动实现复杂操作(如矩阵乘法),代码复杂且易出错。 def matrix_mult(a, b):
return [[sum(x * y for x, y in zip(row, col)) for col in zip(*b)] for row in a]
4. 内存管理
- NumPy: 数组元素类型固定(如
int32
,float64
),内存占用紧凑,批量操作减少内存分配次数。 arr = np.ones(1000000, dtype=np.float32) # 仅需约 4MB 内存 - Python 数组: 存儲对象指针,每个元素额外内存开销大(如整数占 28 字节),适合小规模数据。 lst = [1] * 1000000 # 占用约 28MB 内存
5. 适用场景
场景 | 推荐方法 |
---|---|
大规模数值计算(如科学计算) | NumPy 向量化操作 |
小数据或动态增减元素 | Python 列表或生成器 |
混合类型数据或灵活性需求 | Python 列表 |
复杂数学运算或多维数据处理 | NumPy |
总结
- 使用 NumPy:
- 处理大规模数值数据,需要高性能运算。
- 复杂数学操作(矩阵乘法、广播等)。
- 代码简洁优先,减少显式循环。
- 使用 Python 数组:
- 数据量小或元素类型不一致。
- 动态增删元素或对灵活性要求高。
性能验证: 对百万级数组求和,NumPy 耗时约 0.1ms,Python List 耗时约 100ms,差距显著。
三、SciPy
- 简介: SciPy是一个开源的Python库,用于进行科学和技术计算。它基于NumPy数组对象,并提供了大量的数学函数、算法和便捷工具,以支持信号处理、优化、统计分析、插值、积分等领域。
- 主要特点:
- 数学函数丰富:包括线性代数、积分、插值、优化等。
- 高效计算:利用底层优化和向量化操作,提供高性能的计算能力。
- 模块化设计:各个功能模块清晰分离,便于按需导入和使用。
- 广泛的应用领域:适用于物理、化学、生物、工程等多个科学领域。
- 主要模块:
- 线性代数(
scipy.linalg
):- 提供矩阵分解、特征值计算等功能。
- 积分与常微分方程求解(
scipy.integrate
):- 支持数值积分和常微分方程的求解。
- 优化(
scipy.optimize
):- 包含各种优化算法,用于寻找函数的最小值或最大值。
- 插值(
scipy.interpolate
):- 提供多种插值方法,用于估计未知数据点。
- 统计分析(
scipy.stats
):- 包含大量统计分布和相关函数。
- 信号处理(
scipy.signal
):- 支持信号的生成、过滤和分析。
- 图像处理(
scipy.ndimage
):- 提供多维数组操作的函数,适用于图像处理任务。
- 空间数据结构和算法(
scipy.spatial
):- 包括KD树、Delaunay三角剖分等空间数据结构。
- 线性代数(
- 应用场景:
- 科学计算与模拟
- 数据分析与挖掘
- 工程设计与优化
- 图像与信号处理
核心模块与样例
1. 数值积分(scipy.integrate
)
场景:计算函数在区间内的积分值。
from scipy.integrate import quad
import numpy as np
# 定义被积函数
def f(x):
return np.sin(x) * np.exp(-x)
# 计算积分(从0到无穷大)
result, error = quad(f, 0, np.inf)
print(f"积分结果: {result:.4f}, 误差估计: {error:.2e}")
# 输出: 积分结果: 0.5000, 误差估计: 1.10e-08
2. 优化问题(scipy.optimize
)
场景:寻找函数的最小值或方程的解。
from scipy.optimize import minimize
# 定义目标函数
def rosen(x):
return sum(100.0*(x[1:]-x[:-1]**2)**2 + (1-x[:-1])**2)
# 初始猜测点
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
# 执行最小化(Rosenbrock函数优化)
res = minimize(rosen, x0, method='nelder-mead')
print(f"最优解: {res.x}")
3. 信号处理(scipy.signal
)
场景:滤波或分析时序信号。
from scipy.signal import find_peaks
import matplotlib.pyplot as plt
# 生成含噪声的信号
t = np.linspace(0, 4*np.pi, 1000)
y = np.sin(t) + 0.3*np.random.randn(1000)
# 寻找波峰位置
peaks, _ = find_peaks(y, height=0.5)
plt.plot(t, y)
plt.plot(t[peaks], y[peaks], 'ro')
plt.show()
4. 统计检验(scipy.stats
)
场景:进行假设检验或概率分布分析。
from scipy.stats import ttest_ind
# 生成两组数据
group1 = np.random.normal(5.0, 1.0, 100)
group2 = np.random.normal(5.5, 1.0, 100)
# 独立样本t检验
t_stat, p_value = ttest_ind(group1, group2)
print(f"p值: {p_value:.4f}") # p值 < 0.05 表示差异显著
5. 稀疏矩阵(scipy.sparse
)
场景:高效处理大型稀疏矩阵。
from scipy.sparse import csr_matrix
# 创建稀疏矩阵(大部分元素为0)
data = np.array([1, 2, 3])
row_ind = np.array([0, 1, 2])
col_ind = np.array([1, 2, 0])
sparse_mat = csr_matrix((data, (row_ind, col_ind)), shape=(3, 3))
print(sparse_mat.toarray())
# 输出:
# [[0 1 0]
# [0 0 2]
# [3 0 0]]
四、Pandas
Pandas 是 Python 中用于数据操作和分析的核心库,基于 NumPy 构建,提供高效的表格数据结构(DataFrame
和 Series
),支持数据清洗、转换、统计、可视化等操作。广泛应用于数据科学、金融分析、机器学习等领域。
特点
核心数据结构
Series
:一维带标签数组(类似增强版 NumPy 数组)。DataFrame
:二维表格型数据结构(类似 Excel 或 SQL 表),由多个Series
组成。
数据操作
- 支持数据筛选、合并、分组聚合、时间序列处理。
- 高效处理缺失值、重复值。
输入/输出
- 支持 CSV、Excel、SQL、JSON 等格式读写。
样例
1. 创建 DataFrame
import pandas as pd
# 从字典创建 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
print(df)
# 输出:
# 姓名 年龄 城市
# 0 张三 25 北京
# 1 李四 30 上海
# 2 王五 28 广州
2. 数据读取与查看
# 从 CSV 文件读取数据(假设文件存在)
df = pd.read_csv('data.csv')
# 查看前3行
print(df.head(3))
# 查看数据统计信息(均值、标准差等)
print(df.describe())
# 查看列名和数据类型
print(df.info())
3. 数据筛选
# 选择单列(返回 Series)
ages = df['年龄']
# 按条件筛选行(年龄大于25岁)
filtered = df[df['年龄'] > 25]
# 多条件筛选(年龄 >25 且城市为北京)
filtered = df[(df['年龄'] > 25) & (df['城市'] == '北京')]
4. 数据分组与聚合
# 按城市分组,计算平均年龄
grouped = df.groupby('城市')['年龄'].mean()
print(grouped)
# 输出:
# 城市
# 北京 25.0
# 上海 30.0
# 广州 28.0
5. 处理缺失值
# 删除包含缺失值的行
df_clean = df.dropna()
# 填充缺失值(用均值填充年龄列)
df_filled = df.fillna({'年龄': df['年龄'].mean()})
6. 数据合并
# 创建第二个 DataFrame
df2 = pd.DataFrame({
'姓名': ['赵六'],
'年龄': [22],
'城市': ['深圳']
})
# 垂直合并(追加行)
combined = pd.concat([df, df2], ignore_index=True)
7. 时间序列处理
# 创建日期范围。生成从 2023-01-01 开始的5天连续日期
date_range = pd.date_range('2023-01-01', periods=5)
# 创建带时间索引的 DataFrame
df_time = pd.DataFrame({
'销量': [100, 150, 200, 180, 210]
}, index=date_range)
# 按周重采样计算平均销量
weekly_avg = df_time.resample('W').mean()
为什么用 Pandas?
- 表格数据处理高效:比原生 Python 字典或列表快得多。
- 兼容性强:与 NumPy、Matplotlib、Scikit-learn 无缝协作。
- 功能全面:覆盖数据清洗、分析、可视化的全流程。
典型应用场景
- 数据清洗(去重、缺失值处理)
- 数据聚合统计(如销售数据分组汇总)
- 时间序列分析(股票价格预测)
- 数据预处理(为机器学习准备特征)
五、Matplotlib
Matplotlib是一个用于绘制2D图形的Python库,提供了丰富的绘图功能,可以生成各种类型的图表,如折线图、散点图、柱状图等。
Matplotlib的主要功能包括:
- 绘制折线图、散点图、柱状图、饼图等
- 自定义图形样式
- 保存图形
- 多子图绘制。
在 Matplotlib 中,plot() 是用于绘制二维线图/折线图的核心函数,属于 matplotlib.pyplot 模块。它的主要作用是将数据点连接成线,或绘制带有自定义样式(颜色、标记、线型等)的图形。
样例
1. 基础折线图
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
# 绘制折线图
plt.plot(x, y,
color='blue', # 线条颜色
linestyle='--', # 线型(虚线)
marker='o', # 数据点标记(圆圈)
markersize=4, # 标记大小
label='sin(x)')
plt.title("正弦曲线") # 标题
plt.xlabel("X轴") # X轴标签
plt.ylabel("Y轴") # Y轴标签
plt.grid(True) # 显示网格
plt.legend() # 显示图例
plt.show()
2. 多子图绘制
# 创建 2行1列 的子图布局
fig, axes = plt.subplots(2, 1, figsize=(8, 6))
# 子图1:折线图
axes[0].plot(x, np.sin(x), 'r-', label='sin(x)')
axes[0].set_title("子图1: 正弦曲线")
# 子图2:散点图
axes[1].scatter(x, np.cos(x), c='green', label='cos(x)')
axes[1].set_title("子图2: 余弦散点")
axes[1].set_xlabel("X轴")
# 调整布局
plt.tight_layout()
plt.show()
3. 柱状图与水平线
labels = ['苹果', '香蕉', '橙子', '葡萄']
sales = [45, 30, 55, 25]
plt.bar(labels, sales,
color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'], # 自定义颜色
edgecolor='black') # 边框颜色
# 添加平均值线
avg = np.mean(sales)
plt.axhline(avg, color='red', linestyle='--', label='平均销量')
plt.text(3, avg+2, f'平均: {avg:.1f}', color='red') # 在坐标(3, avg+2)处添加文字
plt.title("水果销量")
plt.legend()
plt.show()
4. 直方图(分布分析)
data = np.random.randn(1000) # 生成1000个正态分布随机数
plt.hist(data,
bins=30, # 分箱数量
density=True, # 显示概率密度
alpha=0.6, # 透明度
color='purple')
plt.title("数据分布直方图")
plt.xlabel("数值区间")
plt.ylabel("概率密度")
plt.show()
5. 饼图(比例展示)
sizes = [30, 20, 25, 15, 10]
labels = ['A类', 'B类', 'C类', 'D类', '其他']
explode = (0.1, 0, 0, 0, 0) # 突出显示第一块
plt.pie(sizes,
labels=labels,
explode=explode,
autopct='%1.1f%%', # 显示百分比格式
shadow=True, # 添加阴影
startangle=90) # 起始角度(90度)
plt.title("类别占比")
plt.axis('equal') # 确保饼图为正圆形
plt.show()
6. 保存图像
plt.plot(x, y)
plt.savefig('sin_curve.png', dpi=300, bbox_inches='tight') # 保存为PNG,分辨率300dpi
plt.close() # 关闭当前图形,避免后续绘图叠加
常用参数速查
参数 | 作用 | 可选值示例 |
---|---|---|
color | 颜色 | 'red' , '#FF0000' , 'blue |
linestyle | 线型 | '-' (实线), '--' (虚线) |
marker | 数据点标记 | 'o' , '*' , 's' (方块) |
alpha | 透明度 | 0 (透明) ~ 1 (不透明) |
figsize | 图像尺寸 | (宽度, 高度) 英寸 |
总结
- 快速绘图:通过
plt.plot()
或plt.scatter()
直接生成图表。 - 精细调整:使用
plt.subplots()
创建复杂布局,通过ax
对象控制细节。 - 样式丰富:通过颜色、线型、标记等参数定制图表外观。
- 适用场景:数据分析报告、学术论文配图、实时数据监控等。
Seaborn
Seaborn是一个基于Matplotlib的高级数据可视化库,它让我们的图表看起来更加美观和专业。
Seaborn的主要功能:
- 绘制复杂的统计图表,如散点图、箱形图、热力图等
- 自定义图表样式
- 实际应用场景。
以下是 Seaborn 的常用功能示例,展示其简洁的统计可视化语法和美观的默认样式。Seaborn 基于 Matplotlib,适合快速探索数据分布、关系和结构。
1. 数据准备
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 加载内置数据集(示例:企鹅数据集)
penguins = sns.load_dataset("penguins")
2. 分布分析
直方图与核密度估计(KDE)
sns.histplot(data=penguins, x="body_mass_g", kde=True, hue="species", palette="viridis")
plt.title("企鹅体重分布")
plt.show()
kde=True
:叠加核密度曲线。hue
:按物种分组着色。palette
:指定颜色主题。
箱线图(Boxplot)
sns.boxplot(data=penguins, x="species", y="flipper_length_mm", palette="Set2")
plt.title("不同物种的鳍肢长度分布")
plt.show()
3. 关系分析
散点图(Scatter Plot)
sns.scatterplot(
data=penguins,
x="bill_length_mm",
y="bill_depth_mm",
hue="species", # 按物种着色
size="body_mass_g", # 按体重调整点大小
style="sex", # 按性别区分标记形状
palette="deep"
)
plt.title("喙长与喙深的关系")
plt.show()
回归拟合图
sns.regplot(
data=penguins.dropna(), # 删除缺失值
x="bill_length_mm",
y="body_mass_g",
scatter_kws={"alpha":0.5}, # 散点透明度
line_kws={"color":"red"} # 回归线颜色
)
plt.title("喙长与体重的回归关系")
plt.show()
4. 分类数据可视化
柱状图(带误差条)
sns.barplot(
data=penguins,
x="species",
y="body_mass_g",
hue="sex", # 按性别分组
ci="sd", # 误差条显示标准差(默认为95%置信区间)
palette="pastel"
)
plt.title("物种与性别的体重对比")
plt.show()
5. 热力图(Heatmap)
# 计算数值列之间的相关系数矩阵
corr = penguins.select_dtypes(include='number').corr()
sns.heatmap(
corr,
annot=True, # 显示数值
cmap="coolwarm", # 颜色映射
vmin=-1, vmax=1 # 颜色范围
)
plt.title("数值特征相关性热力图")
plt.show()
6. 多图分面(FacetGrid)
g = sns.FacetGrid(
data=penguins,
col="species", # 按物种分列
row="sex", # 按性别分行
height=3, # 子图高度
aspect=1.2 # 宽高比
)
g.map(sns.scatterplot, "bill_length_mm", "body_mass_g", alpha=0.7)
g.add_legend()
plt.show()
7. 分布组合图(Joint Plot)
sns.jointplot(
data=penguins,
x="bill_length_mm",
y="bill_depth_mm",
kind="hex", # 六边形分箱(可选 'reg', 'kde', 'scatter')
color="#4CB391"
)
plt.suptitle("喙长与喙深的联合分布", y=1.02)
plt.show()
8. 颜色主题与样式
# 设置全局样式
sns.set_theme(
style="darkgrid", # 主题(可选 'whitegrid', 'dark', 'white', 'ticks')
palette="husl", # 调色板
font_scale=1.2, # 字体缩放
rc={"figure.figsize": (8, 5)} # 默认图像尺寸
)
# 临时局部样式
with sns.axes_style("white"):
sns.scatterplot(...)
总结
- 优势:
- 默认样式美观,减少代码量。
- 内置统计功能(如误差条、回归线)。
- 与 Pandas DataFrame 无缝集成。
- 适用场景:探索性数据分析(EDA)、学术图表、数据报告。
选择建议:
- 需要快速绘制统计图表 → Seaborn。
- 需要高度定制化细节 → Matplotlib。
这些库共同构成了Python在数据分析和机器学习领域的基础,它们各自具有独特的功能和优势,但也存在一些局限性。在实际应用中,开发者需要根据具体需求选择合适的库或库的组合来完成任务。