认识NumPy/Scipy/Pandas/Matplotlib这几个Python库
数据清洗(Data Cleaning) 是数据分析与机器学习流程中的关键步骤,指的是识别并纠正(或删除)数据集中的不准确、不完整、不一致或重复信息的过程。通俗来说,就是把 “脏数据” 变成 “干净数据”,为后续分析和建模打下基础。
NumPy、Scipy、Pandas 和 Matplotlib 是 Python 数据科学领域的几大核心库。接下来逐个认识下。
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 官网 NumPy
NumPy 源代码:https://github.com/numpy/numpy
以下是使用 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)}") # 验证两个结果是否几乎相等关键说明
随机数生成:
np.random.randn(100)生成 100 个标准正态分布的随机数(均值 0,标准差 1)。实际运行时结果会不同,若需固定结果可取消注释
np.random.seed(42)。平均值计算:
np.mean()是 NumPy 专门用于计算平均值的函数,高效且支持多维数组。手动验证通过
np.sum() / len()实现,结果应与np.mean()一致。精度验证:
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
参考:
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)
计算函数 \(f(x) = x^2\) 在区间 [0, 2] 的定积分,验证结果是否接近理论值 \(\frac{8}{3}\)。
quad函数返回积分结果和误差估计,适用于大多数常见函数。优化求解 (
scipy.optimize.minimize)
寻找函数 \(f(x) = (x-2)^2 + 10\sin(x)\) 的全局最小值。
使用 BFGS 算法(拟牛顿法)进行无约束优化,从初始点 \(x_0=0\) 开始迭代。
可视化结果
使用 Matplotlib 绘制函数曲线和找到的最小值点,直观展示优化效果。
扩展应用
SciPy 还可用于:
信号处理 (
scipy.signal):滤波、频谱分析等线性代数 (
scipy.linalg):矩阵分解、求解线性方程组统计分布 (
scipy.stats):概率分布、假设检验插值与拟合 (
scipy.interpolate):数据插值、曲线拟合如需特定领域的详细示例,请告诉我具体场景!
更多参考菜鸟教程即可。
pandas
参考:
Pandas 是 Python 中用于数据分析和处理的核心库,它提供了高效、灵活且直观的数据结构(如
DataFrame和Series),使数据清洗、分析、可视化和建模变得简单快捷。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'")核心功能解析
数据创建与查看
使用字典创建 DataFrame,包含字符串、数值和缺失值。
print(df)直接查看数据结构。数据清洗
fillna()用平均值填充缺失值,保持数据完整性。条件筛选
通过布尔索引
df[df['收入'] > 12000]快速筛选符合条件的行。分组聚合
groupby()按城市和性别分组,agg()对每个组应用多个统计函数。可视化
使用
plot(kind='bar')快速生成柱状图,直观展示数据分布。数据导出
to_csv()将处理后的数据保存为 CSV 文件,支持中文编码。扩展应用
Pandas 还可用于:
时间序列分析:处理日期数据,计算移动平均、趋势分析等。
数据合并与连接:多个 DataFrame 的合并、连接操作。
高级统计:相关性分析、假设检验等。
数据透视表:类似 Excel 的透视功能,快速汇总数据。
如需特定场景的详细示例(如读取真实数据集、时间序列分析等),请告诉我具体需求!
什么是数据清洗?
数据清洗(Data Cleaning) 是数据分析与机器学习流程中的关键步骤,指的是识别并纠正(或删除)数据集中的不准确、不完整、不一致或重复信息的过程。通俗来说,就是把 “脏数据” 变成 “干净数据”,为后续分析和建模打下基础。
为什么需要数据清洗?
数据质量决定分析结果
垃圾进,垃圾出(GIGO 原则):低质量数据会导致错误的模型和决策。
示例:缺失值可能导致统计偏差,错误的日期格式会影响时间序列分析。
现实数据普遍存在问题
人工输入错误(如年龄填成负数)。
系统错误(如传感器故障导致异常值)。
数据集成问题(多个数据源格式不一致)。
数据清洗的常见任务
处理缺失值(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:
dplyr、tidyr包。SQL:
WHERE、CASE 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)数据清洗的最佳实践
保留原始数据:始终创建副本进行操作,避免不可逆修改。
记录清洗过程:用脚本或笔记记录每一步操作,确保可追溯。
可视化辅助:用直方图、箱线图等发现数据分布问题。
分阶段验证:每完成一步清洗,验证数据质量是否提升。
业务知识结合:如 “0 元订单” 可能是测试数据,需结合业务逻辑处理。
总结
数据清洗是数据分析的 “地基”,虽然繁琐但至关重要。通过系统地处理缺失值、异常值和不一致性,能显著提升模型准确性和决策可靠性。熟练掌握 Pandas 等工具,并结合业务理解,是高效完成数据清洗的关键。
更多参考菜鸟教程即可。
Matplotlib
参考:
Matplotlib 是 Python 中最流行的数据可视化库,用于创建高质量的图表、图形和可视化界面。它提供了类似 MATLAB 的绘图语法,支持交互式显示和多种输出格式,广泛应用于数据科学、机器学习、学术研究和工程领域。
扩展资源
总结: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')核心功能解析
中文显示设置
plt.rcParams["font.family"]指定中文字体,确保标题和标签正常显示。多子图布局
plt.subplots(2, 2)创建 2×2 的子图网格,可同时展示 4 种图表。常见图表类型
折线图 (
plot()):展示连续数据的趋势。柱状图 (
bar()):比较不同类别数据的大小。饼图 (
pie()):显示各部分占总体的比例。误差线图 (
errorbar()):展示数据的不确定性(如标准差)。图表美化
添加标题 (
set_title())、坐标轴标签 (set_xlabel())、图例 (legend())。调整线条样式(如
'b-'表示蓝色实线)、标记点(如'o'表示圆点)。设置网格线 (
grid()) 和旋转标签 (tick_params())。扩展应用
Matplotlib 还可用于:
统计图表:直方图 (
hist())、箱线图 (boxplot())、散点图 (scatter())。3D 图形:绘制曲面图、3D 散点图等。
时间序列:财经数据可视化、季节性分析。
自定义样式:使用样式表 (
plt.style.use()) 或 seaborn 库增强美观度。如需特定类型图表的详细示例(如热力图、雷达图等),请告诉我具体需求!
更多参考菜鸟教程即可。
更多推荐


所有评论(0)