安装和使用常用数据分析开发包

合集: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 格式(需使用 xlrdxlwt 等其他库)。

安装后的开发包版本信息:

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数组对象,并提供了大量的数学函数、算法和便捷工具,以支持信号处理、优化、统计分析、插值、积分等领域。
  • 主要特点
    • 数学函数丰富:包括线性代数、积分、插值、优化等。
    • 高效计算:利用底层优化和向量化操作,提供高性能的计算能力。
    • 模块化设计:各个功能模块清晰分离,便于按需导入和使用。
    • 广泛的应用领域:适用于物理、化学、生物、工程等多个科学领域。
  • 主要模块
    1. 线性代数scipy.linalg):
      • 提供矩阵分解、特征值计算等功能。
    2. 积分与常微分方程求解scipy.integrate):
      • 支持数值积分和常微分方程的求解。
    3. 优化scipy.optimize):
      • 包含各种优化算法,用于寻找函数的最小值或最大值。
    4. 插值scipy.interpolate):
      • 提供多种插值方法,用于估计未知数据点。
    5. 统计分析scipy.stats):
      • 包含大量统计分布和相关函数。
    6. 信号处理scipy.signal):
      • 支持信号的生成、过滤和分析。
    7. 图像处理scipy.ndimage):
      • 提供多维数组操作的函数,适用于图像处理任务。
    8. 空间数据结构和算法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 构建,提供高效的表格数据结构(DataFrameSeries),支持数据清洗、转换、统计、可视化等操作。广泛应用于数据科学、金融分析、机器学习等领域。

特点

核心数据结构

  • 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在数据分析和机器学习领域的基础,它们各自具有独特的功能和优势,但也存在一些局限性。在实际应用中,开发者需要根据具体需求选择合适的库或库的组合来完成任务。

参考资料

发表评论