NumPy、Scipy、Pandas 和 Matplotlib 是 Python 数据科学领域的几大核心库。接下来逐个认识下。

NumPy

参考:

NumPy 教程 | 菜鸟教程

NumPy(Numerical Python)是 Python 科学计算的基础库,专为高效处理多维数组和矩阵运算设计,其核心数据结构ndarray(多维数组)支持向量化操作、广播机制和高性能数学函数,是数据科学、机器学习、科学计算等领域的底层支柱。

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。

NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:

  • 一个强大的N维数组对象 ndarray

  • 广播功能函数

  • 整合 C/C++/Fortran 代码的工具

  • 线性代数、傅里叶变换、随机数生成等功能

相关链接

以下是使用 NumPy 生成 100 个随机数并计算其平均值的完整可运行示例,包含详细注释和结果验证:

import numpy as np

# 设置随机种子(可选,确保结果可复现)
np.random.seed(42)

# 生成100个服从标准正态分布的随机数(均值0,标准差1)
random_numbers = np.random.randn(100)

# 计算平均值
mean_value = np.mean(random_numbers)

# 验证计算结果(手动计算)
manual_mean = np.sum(random_numbers) / len(random_numbers)

# 输出结果(保留4位小数)
print(f"生成的随机数(前10个):{random_numbers[:10].round(4)}")
print(f"NumPy计算的平均值:{mean_value.round(4)}")
print(f"手动计算的平均值:{manual_mean.round(4)}")
print(f"验证结果:{np.allclose(mean_value, manual_mean)}")  # 验证两个结果是否几乎相等

关键说明

随机数生成:

  1. np.random.randn(100) 生成 100 个标准正态分布的随机数(均值 0,标准差 1)。

  2. 实际运行时结果会不同,若需固定结果可取消注释 np.random.seed(42)

平均值计算:

  1. np.mean() 是 NumPy 专门用于计算平均值的函数,高效且支持多维数组。

  2. 手动验证通过 np.sum() / len() 实现,结果应与 np.mean() 一致。

精度验证:

  1. np.allclose() 用于比较两个数组是否在容差范围内相等,避免浮点数精度误差导致的误判。

扩展应用

若需生成其他分布的随机数,可替换相应函数:

  • 均匀分布(0-1):np.random.rand(100)

  • 均匀分布(指定范围):np.random.uniform(low=1, high=10, size=100)

  • 整数随机数:np.random.randint(low=1, high=100, size=100)(不含上限)

如需计算其他统计量(如中位数、标准差),可使用:

  • np.median(random_numbers)

  • np.std(random_numbers)

更多参考菜鸟教程即可。

SciPy

参考:

SciPy 教程 | 菜鸟教程

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

SciPy 是一个开源的 Python 算法库和数学工具包。

SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

Numpy通常用于提供基础的高效率运算。

NumPy 和 SciPy 是 Python 中两个密切相关但功能不同的科学计算库,它们共同构成了科学计算的核心生态系统。以下是它们的区别与联系:

特性 NumPy SciPy
定位 基础数值计算库 科学计算工具集
核心功能 多维数组(ndarray)和基础运算 优化、积分、信号处理、统计等高级算法
依赖关系 独立库,SciPy 依赖 NumPy 构建在 NumPy 之上
代码风格 面向数组操作 面向问题领域(如scipy.optimize)

以下是一个使用 SciPy 进行数值积分和优化的完整可运行示例,展示了 SciPy 的核心功能:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import quad
from scipy.optimize import minimize

# 1. 数值积分示例:计算函数 f(x) = x² 在 [0, 2] 区间的积分
def f(x):
    return x**2

result, error = quad(f, 0, 2)
print(f"积分结果:{result}")  # 理论值为 8/3 ≈ 2.6667
print(f"估计误差:{error}")

# 2. 优化示例:寻找函数 f(x) = (x-2)² + 10·sin(x) 的全局最小值
def objective(x):
    return (x-2)**2 + 10 * np.sin(x)

# 初始猜测值
x0 = 0

# 使用 BFGS 算法进行优化
res = minimize(objective, x0, method='BFGS')
print("\n优化结果:")
print(f"最小值点:{res.x[0]:.4f}")  # 约为 0.739
print(f"函数最小值:{res.fun:.4f}")
print(f"迭代次数:{res.nit}")
print(f"是否成功:{res.success}")

# 3. 可视化函数和优化结果
x = np.linspace(-5, 10, 500)
y = objective(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y, label='f(x) = (x-2)² + 10·sin(x)')
plt.scatter(res.x, res.fun, color='red', marker='*', s=200, label='最小值点')
plt.title('函数优化与积分示例')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.grid(True)
plt.show()

代码说明

数值积分 (scipy.integrate.quad)

  1. 计算函数 \(f(x) = x^2\) 在区间 [0, 2] 的定积分,验证结果是否接近理论值 \(\frac{8}{3}\)。

  2. quad 函数返回积分结果和误差估计,适用于大多数常见函数。

优化求解 (scipy.optimize.minimize)

  1. 寻找函数 \(f(x) = (x-2)^2 + 10\sin(x)\) 的全局最小值。

  2. 使用 BFGS 算法(拟牛顿法)进行无约束优化,从初始点 \(x_0=0\) 开始迭代。

可视化结果

  1. 使用 Matplotlib 绘制函数曲线和找到的最小值点,直观展示优化效果。

扩展应用

SciPy 还可用于:

  • 信号处理 (scipy.signal):滤波、频谱分析等

  • 线性代数 (scipy.linalg):矩阵分解、求解线性方程组

  • 统计分布 (scipy.stats):概率分布、假设检验

  • 插值与拟合 (scipy.interpolate):数据插值、曲线拟合

如需特定领域的详细示例,请告诉我具体场景!

更多参考菜鸟教程即可。

pandas

参考:

Pandas 教程 | 菜鸟教程

Pandas 是 Python 中用于数据分析和处理的核心库,它提供了高效、灵活且直观的数据结构(如DataFrameSeries),使数据清洗、分析、可视化和建模变得简单快捷。

Pandas 的核心价值

  • 生产力提升:用简洁的代码完成复杂的数据处理任务。

  • 数据灵活性:处理异构数据(如混合文本、数值、日期)。

  • 生态兼容性:无缝集成 NumPy、Matplotlib、Scikit-learn 等库。

无论是数据科学家、分析师还是工程师,Pandas 都是 Python 数据分析工作流中不可或缺的工具。

Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。

Pandas 应用

Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。

Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。

Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。

Pandas 功能

Pandas 是数据分析的利器,它不仅提供了高效、灵活的数据结构,还能帮助你以极低的成本完成复杂的数据操作和分析任务。

Pandas 提供了丰富的功能,包括:

  • 数据清洗:处理缺失数据、重复数据等。

  • 数据转换:改变数据的形状、结构或格式。

  • 数据分析:进行统计分析、聚合、分组等。

  • 数据可视化:通过整合 Matplotlib 和 Seaborn 等库,可以进行数据可视化。

数据结构

Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据)。

  • Series 是一种类似于一维数组的对象,它由一组数据(各种 Numpy 数据类型)以及一组与之相关的数据标签(即索引)组成。

  • DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

Pandas 是 Python 数据科学领域中不可或缺的工具之一,它的灵活性和强大的功能使得数据处理和分析变得更加简单和高效。

以下是一个使用 Pandas 进行数据处理和分析的完整可运行示例,包含数据导入、清洗、统计和可视化等核心操作:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 1. 创建示例数据
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
    '年龄': [25, 32, np.nan, 41, 28, 36],
    '性别': ['男', '男', '女', '男', '女', '男'],
    '城市': ['北京', '上海', '广州', '北京', '上海', '广州'],
    '收入': [10000, 15000, 12000, 18000, 9000, 13000]
}

df = pd.DataFrame(data)
print("原始数据:")
print(df)

# 2. 数据清洗:处理缺失值
df['年龄'] = df['年龄'].fillna(df['年龄'].mean())  # 用平均值填充缺失值
print("\n处理缺失值后:")
print(df)

# 3. 数据筛选:查询收入高于12000的员工
high_income = df[df['收入'] > 12000]
print("\n高收入员工:")
print(high_income)

# 4. 分组统计:按城市和性别分组,计算平均年龄和收入
grouped = df.groupby(['城市', '性别']).agg({
    '年龄': 'mean',
    '收入': 'mean'
}).reset_index()
print("\n分组统计结果:")
print(grouped)

# 5. 数据可视化:绘制不同城市的平均收入柱状图
city_income = df.groupby('城市')['收入'].mean().sort_values()
plt.figure(figsize=(10, 6))
city_income.plot(kind='bar', color='skyblue')
plt.title('不同城市的平均收入')
plt.xlabel('城市')
plt.ylabel('平均收入')
plt.xticks(rotation=0)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

# 6. 保存数据到CSV
df.to_csv('员工数据.csv', index=False, encoding='utf-8-sig')
print("\n数据已保存至 '员工数据.csv'")

核心功能解析

数据创建与查看

  1. 使用字典创建 DataFrame,包含字符串、数值和缺失值。

  2. print(df) 直接查看数据结构。

数据清洗

  1. fillna() 用平均值填充缺失值,保持数据完整性。

条件筛选

  1. 通过布尔索引 df[df['收入'] > 12000] 快速筛选符合条件的行。

分组聚合

  1. groupby() 按城市和性别分组,agg() 对每个组应用多个统计函数。

可视化

  1. 使用 plot(kind='bar') 快速生成柱状图,直观展示数据分布。

数据导出

  1. to_csv() 将处理后的数据保存为 CSV 文件,支持中文编码。

扩展应用

Pandas 还可用于:

  • 时间序列分析:处理日期数据,计算移动平均、趋势分析等。

  • 数据合并与连接:多个 DataFrame 的合并、连接操作。

  • 高级统计:相关性分析、假设检验等。

  • 数据透视表:类似 Excel 的透视功能,快速汇总数据。

如需特定场景的详细示例(如读取真实数据集、时间序列分析等),请告诉我具体需求!

什么是数据清洗?

数据清洗(Data Cleaning) 是数据分析与机器学习流程中的关键步骤,指的是识别并纠正(或删除)数据集中的不准确、不完整、不一致或重复信息的过程。通俗来说,就是把 “脏数据” 变成 “干净数据”,为后续分析和建模打下基础。

为什么需要数据清洗?

数据质量决定分析结果

  1. 垃圾进,垃圾出(GIGO 原则):低质量数据会导致错误的模型和决策。

  2. 示例:缺失值可能导致统计偏差,错误的日期格式会影响时间序列分析。

现实数据普遍存在问题

  1. 人工输入错误(如年龄填成负数)。

  2. 系统错误(如传感器故障导致异常值)。

  3. 数据集成问题(多个数据源格式不一致)。

数据清洗的常见任务

处理缺失值(Missing Values)

  • 识别:通过 isnull().sum()(Pandas)查看缺失情况。

  • 处理方法:

    • 删除:缺失比例过高且不重要的行 / 列。

    • 填充:用均值、中位数、众数或模型预测值填充。

    • 插值:时间序列数据可用线性插值(interpolate())。

处理异常值(Outliers)

  • 识别:箱线图、Z-score、IQR(四分位距)法。

  • 处理方法:

    • 修正:如年龄 “200 岁” 可能是输入错误,修正为合理值。

    • 删除:明显错误的数据点(如身高 “3 米”)。

    • 替换:用阈值(如 3σ 原则)替换极端值。

处理重复数据

  • 识别:duplicated()(Pandas)标记重复行。

  • 处理:删除完全重复的记录,或合并相似记录(如用户多账号合并)。

格式标准化

  • 数据类型转换:如字符串转为日期(pd.to_datetime())。

  • 单位统一:如重量单位从 “千克” 和 “克” 统一为标准单位。

  • 大小写 / 符号统一:如 “USA”“U.S.A”“美国” 统一为 “美国”。

解决数据不一致

  • 跨表一致性:如订单表和用户表的用户 ID 不匹配。

  • 逻辑一致性:如 “出生日期” 晚于 “注册日期”。

处理错误数据

  • 范围检查:如年龄为负数、价格为零。

  • 有效性检查:如邮箱格式、身份证号长度。

数据清洗工具

  • Python:Pandas(主力工具)、NumPy、Scikit-learn(处理缺失值)。

  • R:dplyrtidyr 包。

  • SQL:WHERECASE WHEN 等语句过滤修正数据。

  • 可视化工具:Excel、Tableau(识别异常值)。

数据清洗流程示例(Python)

以下是用 Pandas 清洗数据的简化流程:

import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv('dirty_data.csv')

# 1. 查看基本信息和缺失值
print('数据基本信息:')
df.info()

# 2. 统计每列缺失值数量
missing_values = df.isnull().sum()
print('\n缺失值统计:\n', missing_values)

# 3. 处理缺失值(填充或删除)
df['年龄'] = df['年龄'].fillna(df['年龄'].mean())  # 均值填充
df = df.dropna(subset=['性别'])  # 删除性别缺失的行

# 4. 处理异常值(示例:年龄超过100的设为NaN)
df.loc[df['年龄'] > 100, '年龄'] = np.nan

# 5. 去重
df = df.drop_duplicates()

# 6. 格式转换(示例:将日期字符串转为日期类型)
df['注册日期'] = pd.to_datetime(df['注册日期'])

# 7. 保存清洗后的数据
df.to_csv('clean_data.csv', index=False)

数据清洗的最佳实践

  1. 保留原始数据:始终创建副本进行操作,避免不可逆修改。

  2. 记录清洗过程:用脚本或笔记记录每一步操作,确保可追溯。

  3. 可视化辅助:用直方图、箱线图等发现数据分布问题。

  4. 分阶段验证:每完成一步清洗,验证数据质量是否提升。

  5. 业务知识结合:如 “0 元订单” 可能是测试数据,需结合业务逻辑处理。

总结

数据清洗是数据分析的 “地基”,虽然繁琐但至关重要。通过系统地处理缺失值、异常值和不一致性,能显著提升模型准确性和决策可靠性。熟练掌握 Pandas 等工具,并结合业务理解,是高效完成数据清洗的关键。

更多参考菜鸟教程即可。 

Matplotlib

参考:

Matplotlib 教程 | 菜鸟教程

Matplotlib 是 Python 中最流行的数据可视化库,用于创建高质量的图表、图形和可视化界面。它提供了类似 MATLAB 的绘图语法,支持交互式显示和多种输出格式,广泛应用于数据科学、机器学习、学术研究和工程领域。

扩展资源

  1. 官方文档:Matplotlib Documentation

  2. 样式库:Matplotlib Style Gallery

  3. 实战教程:Python Data Visualization Cookbook

总结:Matplotlib 的核心价值

  • 灵活性:支持从简单图表到复杂学术出版物的各种需求。

  • 生态兼容性:无缝集成 Pandas、NumPy 等数据处理库。

  • 社区资源丰富:提供数千个示例和预定义样式,快速实现专业级可视化。

无论是数据探索、学术论文还是产品报告,Matplotlib 都是 Python 数据可视化的首选工具。

以下是一个使用 Matplotlib 绘制多种常见图表的完整可运行示例,包含详细注释和中文显示设置:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题

# 生成示例数据
x = np.linspace(0, 10, 100)  # 0到10之间的100个均匀分布的点
y1 = np.sin(x)
y2 = np.cos(x)
categories = ["苹果", "香蕉", "橙子", "草莓", "葡萄"]
values = [35, 25, 20, 10, 10]
data = {
    '年份': [2018, 2019, 2020, 2021, 2022],
    '收入': [120, 150, 130, 180, 200],
    '支出': [90, 100, 140, 150, 160]
}
df = pd.DataFrame(data)

# 创建画布和子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 1. 折线图
axes[0, 0].plot(x, y1, 'b-', label='正弦')
axes[0, 0].plot(x, y2, 'r--', label='余弦')
axes[0, 0].set_title('正弦与余弦曲线')
axes[0, 0].set_xlabel('X轴')
axes[0, 0].set_ylabel('Y轴')
axes[0, 0].legend()
axes[0, 0].grid(True)

# 2. 柱状图
axes[0, 1].bar(categories, values, color='skyblue')
axes[0, 1].set_title('水果销量分布')
axes[0, 1].set_xlabel('水果种类')
axes[0, 1].set_ylabel('销量(kg)')
axes[0, 1].tick_params(axis='x', rotation=45)  # 旋转x轴标签

# 3. 饼图
axes[1, 0].pie(values, labels=categories, autopct='%1.1f%%', startangle=90)
axes[1, 0].set_title('水果销量占比')
axes[1, 0].axis('equal')  # 使饼图为正圆形

# 4. 折线图(带数据点和误差线)
axes[1, 1].errorbar(
    df['年份'], df['收入'], yerr=10, fmt='o-', color='green', label='收入'
)
axes[1, 1].errorbar(
    df['年份'], df['支出'], yerr=5, fmt='s--', color='orange', label='支出'
)
axes[1, 1].set_title('年度收支变化')
axes[1, 1].set_xlabel('年份')
axes[1, 1].set_ylabel('金额(万元)')
axes[1, 1].legend()
axes[1, 1].grid(linestyle='--', alpha=0.7)

# 调整布局
plt.tight_layout()

# 显示图形
plt.show()

# 保存图形(可选)
# plt.savefig('matplotlib_demo.png', dpi=300, bbox_inches='tight')

核心功能解析

中文显示设置

  1. plt.rcParams["font.family"] 指定中文字体,确保标题和标签正常显示。

多子图布局

  1. plt.subplots(2, 2) 创建 2×2 的子图网格,可同时展示 4 种图表。

常见图表类型

  1. 折线图 (plot()):展示连续数据的趋势。

  2. 柱状图 (bar()):比较不同类别数据的大小。

  3. 饼图 (pie()):显示各部分占总体的比例。

  4. 误差线图 (errorbar()):展示数据的不确定性(如标准差)。

图表美化

  1. 添加标题 (set_title())、坐标轴标签 (set_xlabel())、图例 (legend())。

  2. 调整线条样式(如'b-'表示蓝色实线)、标记点(如'o'表示圆点)。

  3. 设置网格线 (grid()) 和旋转标签 (tick_params())。

扩展应用

Matplotlib 还可用于:

  • 统计图表:直方图 (hist())、箱线图 (boxplot())、散点图 (scatter())。

  • 3D 图形:绘制曲面图、3D 散点图等。

  • 时间序列:财经数据可视化、季节性分析。

  • 自定义样式:使用样式表 (plt.style.use()) 或 seaborn 库增强美观度。

如需特定类型图表的详细示例(如热力图、雷达图等),请告诉我具体需求!

更多参考菜鸟教程即可。

更多推荐