PYTHON_DAY21_数据分析

数据分析三剑客

一、数据分析三剑客简介

在Python数据分析领域,有三个不可或缺的核心库,被称为"数据分析三剑客":

  • NumPy:数值计算基础库,提供高性能的多维数组对象
  • Pandas:数据处理和分析库,提供强大的数据结构和数据分析工具
  • Matplotlib:数据可视化库,提供丰富的绘图功能

二、NumPy 概述[¶](#二、NumPy 概述¶)

☆ 什么是 NumPy[¶](#☆ 什么是 NumPy¶)

NumPy(Numerical Python)是Python科学计算的基础包,它提供了:

  • 快速高效的多维数组对象 ndarray
  • 用于对数组执行元素级计算以及直接对数组执行数学运算的函数
  • 用于读写硬盘上基于数组的数据集的工具
  • 线性代数运算、傅里叶变换,以及随机数生成
  • 用于将C、C++、Fortran代码集成到Python的工具
☆ NumPy 的特点[¶](#☆ NumPy 的特点¶)
  • 高效的数组运算:比纯Python代码快10-100倍
  • 丰富的数学函数:支持大量的数学运算
  • 广播功能:不同形状的数组之间的数学运算
  • 底层语言实现:核心代码用C语言编写,执行效率高

三、Pandas 概述[¶](#三、Pandas 概述¶)

☆ 什么是 Pandas[¶](#☆ 什么是 Pandas¶)

Pandas是基于NumPy构建的库,为Python编程语言提供了快速、强大、灵活且易于使用的数据结构和数据分析工具。

☆ Pandas 的核心数据结构[¶](#☆ Pandas 的核心数据结构¶)
  • Series:一维带标签数组
  • DataFrame:二维表格型数据结构
☆ Pandas 的主要功能[¶](#☆ Pandas 的主要功能¶)
  • 数据清洗和准备
  • 数据整理和转换
  • 数据分析和建模
  • 数据可视化

四、Matplotlib 概述[¶](#四、Matplotlib 概述¶)

☆ 什么是 Matplotlib[¶](#☆ 什么是 Matplotlib¶)

Matplotlib是Python最著名的绘图库,它提供了一整套和MATLAB类似的绘图API,非常适合交互式绘图。

☆ Matplotlib 的特点[¶](#☆ Matplotlib 的特点¶)
  • 丰富的图表类型:线图、散点图、柱状图、饼图等
  • 高度可定制:可以控制图表的每一个细节
  • 多种输出格式:支持PNG、PDF、SVG等格式
  • 与IPython兼容:支持在IPython环境中交互式绘图

五、三者的关系

1 层次依赖关系[¶](#1 层次依赖关系¶)

NumPy、Pandas 和 Matplotlib 三者构成了 Python 数据分析的完整技术栈,它们之间存在着清晰的层次依赖关系:

NumPy 是基础层

  • 提供了高效的多维数组(ndarray)对象
  • 是 Pandas 和 Matplotlib 的底层依赖
  • 负责数值计算和数组操作

Pandas 是数据处理层

  • 基于 NumPy 构建,使用 NumPy 数组作为底层存储
  • 提供了更高级的数据结构(Series、DataFrame)
  • 专注于数据清洗、整理和分析

Matplotlib 是可视化层

  • 依赖于 NumPy 的数据结构
  • 能够直接处理 Pandas 的数据对象
  • 负责将数据转化为直观的图表

2 功能互补关系[¶](#2 功能互补关系¶)

三者各司其职,形成了完整的数据分析工作流:

NumPy - 数值计算引擎

  • 核心功能:数学运算、线性代数、随机数生成
  • 数据格式:ndarray 多维数组
  • 优势:计算效率高,内存占用少

Pandas - 数据处理工具

  • 核心功能:数据清洗、转换、聚合、分析
  • 数据格式:Series(一维)、DataFrame(二维)
  • 优势:数据操作便捷,支持缺失值处理

Matplotlib - 可视化平台

  • 核心功能:图表绘制、图形定制、结果展示
  • 输出形式:静态图片、交互式图表
  • 优势:图表类型丰富,定制化程度高

3 代码示例[¶](#3 代码示例¶)

复制代码
# 三者的典型工作流程
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 注意:新版本需要指定 matplotlib 使用 TkAgg 作为图形后端来渲染和显示图表
import matplotlib
matplotlib.use('TkAgg')


# NumPy:数据生成和处理
data = np.random.randn(100, 3)

# Pandas:数据整理和分析
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
summary = df.describe()

# Matplotlib:数据可视化
df.plot(kind='hist', alpha=0.5)
plt.show()

NumPy 安装和导入[¶](#NumPy 安装和导入¶)

☆ 安装 NumPy[¶](#☆ 安装 NumPy¶)
复制代码
# 使用 pip 安装
pip install numpy

# 使用 conda 安装
conda install numpy
☆ 导入 NumPy[¶](#☆ 导入 NumPy¶)
复制代码
import numpy as np  # 惯例缩写为 np

二、NumPy 核心数据结构:ndarray[¶](#二、NumPy 核心数据结构:ndarray¶)

☆ 创建数组[¶](#☆ 创建数组¶)
复制代码
import numpy as np

# 从列表创建数组
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1)

arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", arr2)

# 创建特殊数组
zeros_arr = np.zeros((3, 4))  # 全0数组
print("全0数组:\n", zeros_arr)

ones_arr = np.ones((2, 3))    # 全1数组
print("全1数组:\n", ones_arr)


# 创建序列数组
range_arr = np.arange(0, 10, 2)  # 0到10,步长为2
print("范围数组:", range_arr)

linspace_arr = np.linspace(0, 1, 5)  # 0到1,等分5份
print("等分数组:", linspace_arr)


# 创建随机数组
random_arr = np.random.rand(3, 3)  # 0-1均匀分布
print("随机数组:\n", random_arr)

normal_arr = np.random.randn(3, 3)  # 标准正态分布
print("正态分布数组:\n", normal_arr)
☆ 数组属性[¶](#☆ 数组属性¶)
复制代码
import numpy as np

# 创建示例数组
arr = np.array([[1, 2, 3], [4, 5, 6]])

print("数组:", arr)
print("数组维度:", arr.ndim)        # 维度数
print("数组形状:", arr.shape)       # 形状 (行数, 列数)
print("数组大小:", arr.size)        # 元素总数
print("数据类型:", arr.dtype)       # 数据类型

三、NumPy 数组操作[¶](#三、NumPy 数组操作¶)

☆ 数组索引和切片[¶](#☆ 数组索引和切片¶)
复制代码
import numpy as np

# 创建示例数组
arr = np.array([[1, 2, 3, 4], 
                [5, 6, 7, 8], 
                [9, 10, 11, 12]])

print("原始数组:\n", arr)

# 索引
print("第一个元素:", arr[0, 0])      # 第一行第一列
print("最后一行:", arr[-1])          # 最后一行
print("第二列:", arr[:, 1])          # 所有行的第二列

# 切片
print("前两行:\n", arr[:2])          # 前两行
print("前两行的前两列:\n", arr[:2, :2]) # 前两行前两列
print("每隔一个元素取一个:\n", arr[::2, ::2]) # 行和列都隔一个取一个

# 布尔索引
bool_idx = arr > 5
print("大于5的元素:\n", arr[bool_idx])
print("直接布尔索引:\n", arr[arr > 5])
☆ 数组形状操作[¶](#☆ 数组形状操作¶)
复制代码
import numpy as np

arr = np.arange(12)
print("原始一维数组:", arr)

# 重塑形状
arr_2d = arr.reshape(3, 4)
print("重塑为3x4数组:\n", arr_2d)

# 转置
arr_t = arr_2d.T
print("转置数组:\n", arr_t)

# 展平数组
arr_flat = arr_2d.flatten()
print("展平数组:", arr_flat)

# 调整大小
arr_resized = np.resize(arr, (3, 5))
print("调整大小:\n", arr_resized)

四、NumPy 数学运算[¶](#四、NumPy 数学运算¶)

☆ 基本运算[¶](#☆ 基本运算¶)
复制代码
import numpy as np

a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])

print("数组a:", a)
print("数组b:", b)

# 算术运算
print("加法:", a + b)
print("减法:", a - b)
print("乘法:", a * b)
print("除法:", a / b)
print("幂运算:", a ** 2)

# 比较运算
print("大于比较:", a > 2)
print("等于比较:", a == b)

# 矩阵乘法
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])
print("矩阵乘法:\n", np.dot(matrix_a, matrix_b))
☆ 统计运算[¶](#☆ 统计运算¶)
复制代码
import numpy as np

arr = np.array([[1, 2, 3], 
                [4, 5, 6], 
                [7, 8, 9]])

print("数组:\n", arr)
print("总和:", np.sum(arr))
print("每列总和:", np.sum(arr, axis=0))  # 沿列方向
print("每行总和:", np.sum(arr, axis=1))  # 沿行方向

print("平均值:", np.mean(arr))
print("标准差:", np.std(arr))
print("方差:", np.var(arr))

print("最小值:", np.min(arr))
print("最大值:", np.max(arr))
print("最小值索引:", np.argmin(arr))
print("最大值索引:", np.argmax(arr))

五、NumPy 广播机制[¶](#五、NumPy 广播机制¶)

复制代码
import numpy as np

# 广播示例
a = np.array([[1, 2, 3], 
              [4, 5, 6], 
              [7, 8, 9]])

b = np.array([10, 20, 30])

print("数组a:\n", a)
print("数组b:", b)
print("广播加法:\n", a + b)  # b被广播到a的每一行

# 另一个广播例子
c = np.array([[1], [2], [3]])
print("数组c:\n", c)
print("广播乘法:\n", a * c)  # c被广播到a的每一列

Pandas

一、Pandas 安装和导入[¶](#一、Pandas 安装和导入¶)

☆ 安装 Pandas[¶](#☆ 安装 Pandas¶)
复制代码
# 使用 pip 安装
pip install pandas

# 使用 conda 安装
conda install pandas
☆ 导入 Pandas[¶](#☆ 导入 Pandas¶)
复制代码
import pandas as pd  # 惯例缩写为 pd

二、Pandas 核心数据结构[¶](#二、Pandas 核心数据结构¶)

☆ Series:一维带标签数组[¶](#☆ Series:一维带标签数组¶)
复制代码
import pandas as pd
import numpy as np

# 从列表创建Series
s1 = pd.Series([1, 3, 5, np.nan, 6, 8])
print("从列表创建的Series:")
print(s1)

# 从字典创建Series
s2 = pd.Series({'a': 1, 'b': 2, 'c': 3})
print("\n从字典创建的Series:")
print(s2)

# 指定索引
s3 = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print("\n指定索引的Series:")
print(s3)

# Series操作
print("\nSeries操作:")
print("值:", s3.values)
print("索引:", s3.index)
☆ DataFrame:二维表格数据结构[¶](#☆ DataFrame:二维表格数据结构¶)
复制代码
import pandas as pd
import numpy as np

# 从字典创建DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 28],
    '城市': ['北京', '上海', '广州', '深圳'],
    '工资': [5000, 7000, 6000, 8000]
}

df = pd.DataFrame(data)
print("创建的DataFrame:")
print(df)

# 从列表创建DataFrame
data_list = [
    ['张三', 25, '北京', 5000],
    ['李四', 30, '上海', 7000],
    ['王五', 35, '广州', 6000],
    ['赵六', 28, '深圳', 8000]
]

df2 = pd.DataFrame(data_list, columns=['姓名', '年龄', '城市', '工资'])
print("\n从列表创建的DataFrame:")
print(df2)

# 查看DataFrame基本信息
print("\nDataFrame基本信息:")
print("形状:", df.shape)
print("列名:", df.columns)
print("索引:", df.index)
print("数据类型:\n", df.dtypes)

三、DataFrame 基本操作[¶](#三、DataFrame 基本操作¶)

☆ 数据查看和选择[¶](#☆ 数据查看和选择¶)
复制代码
import pandas as pd
import numpy as np

# 创建示例DataFrame
data_list = [
    ['张三', 25, '北京', 5000],
    ['李四', 30, '上海', 7000],
    ['王五', 35, '广州', 6000],
    ['赵六', 28, '深圳', 8000]
]

df = pd.DataFrame(data_list, columns=['姓名', '年龄', '城市', '工资'], index=["s1", "s2", "s3", "s4"])
print("\n从列表创建的DataFrame:")
print(df)

# 查看数据
print("\n前3行:")
print(df.head(3))

print("\n后2行:")
print(df.tail(2))

print("\n描述性统计:")
print(df.describe())


# 选择数据
print("\n选择单列:")
print(df['姓名'])

print("\n选择多列:")
print(df[['姓名', '年龄']])


print("\n使用loc选择(标签索引):")
print(df.loc['s1'])  # 选择一行
print(df.loc[['s1', 's3']])  # 选择多行
print(df.loc['s1':'s3'])  # 切片选择

print("\n使用iloc选择(位置索引):")
print(df.iloc[0])  # 第一行
print(df.iloc[[0, 2]])  # 选择多行
print(df.iloc[0:3])  # 切片选择
☆ 数据筛选和过滤[¶](#☆ 数据筛选和过滤¶)
复制代码
import pandas as pd
import numpy as np

# 创建示例数据
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 30, 35, 28, 32],
    '部门': ['技术部', '销售部', '技术部', '人事部', '销售部'],
    '工资': [5000, 7000, 6000, 5500, 7500]
})

print("原始数据:")
print(df)

# 条件筛选
print("\n年龄大于30的员工:")
print(df[df['年龄'] > 30])

print("\n技术部的员工:")
print(df[df['部门'] == '技术部'])

print("\n使用query方法筛选:")
print(df.query('年龄 > 28 and 工资 < 7000'))


# 排序
print("\n按工资降序排序:")
print(df.sort_values('工资', ascending=False))

print("\n按多列排序(部门升序,工资降序):")
print(df.sort_values(['部门', '工资'], ascending=[True, False]))

四、数据处理和清洗

☆ 处理缺失值[¶](#☆ 处理缺失值¶)

已知数据如下:

复制代码
A,B,C
1.0,5.0,9
2.0,,10
,,11
4.0,8.0,12
,,

缺失值处理代码如下:

复制代码
import pandas as pd
import numpy as np

# 读取包含缺失值的数据
df = pd.read_csv("清洗数据.csv", sep=",")

print("原始数据(包含缺失值):")
print(df)

# 检查缺失值
print("\n缺失值统计:")
print(df.isnull().sum())

print("\n非缺失值统计:")
print(df.notnull().sum())

# 删除缺失值
print("\n删除包含缺失值的行:")
print(df.dropna())

print("\n删除全部为缺失值的列:")
print(df.dropna(how='all'))

# 填充缺失值
print("\n用指定值填充缺失值:")
print(df.fillna(0))

print("\n用均值填充:")
print(df.fillna(df.mean()))
☆ 数据转换[¶](#☆ 数据转换¶)

已知数据:

复制代码
产品,销售额,地区
A,100,北京
B,200,上海
C,150,广州
A,300,北京
B,250,上海
C,180,广州

分组聚合代码如下:

复制代码
import pandas as pd

# 创建示例数据
df = pd.read_csv("分组聚合数据.csv", sep=",")
print("原始数据:")
print(df)

# 分组聚合
print("\n按产品分组计算总销售额:")
print(df.groupby('产品')['销售额'].sum())

print("\n按产品和地区分组计算统计量:")
print(df.groupby(['产品', '地区'])['销售额'].agg(['sum', 'mean']))



# 数据透视表
print("\n数据透视表:")
pivot_df = df.pivot_table(index='产品', values="销售额", aggfunc='sum')
print(pivot_df)

print("\n数据透视表:")
pivot_df = df.pivot_table(index=['产品', '地区'], values="销售额", aggfunc=['sum', 'mean'])
print(pivot_df)

Matplotlib

一、Matplotlib 安装和导入[¶](#一、Matplotlib 安装和导入¶)

☆ 安装 Matplotlib[¶](#☆ 安装 Matplotlib¶)
复制代码
# 使用 pip 安装
pip install matplotlib

# 使用 conda 安装
conda install matplotlib
☆ 导入 Matplotlib[¶](#☆ 导入 Matplotlib¶)
复制代码
import matplotlib.pyplot as plt  # 惯例缩写为 plt

二、基本绘图功能

折线图
复制代码
import numpy as np
import matplotlib.pyplot as plt
# 注意:新版本需要指定 matplotlib 使用 TkAgg 作为图形后端来渲染和显示图表
import matplotlib
matplotlib.use('TkAgg')
# 注意:中文显示需要额外设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 1, 5, 3])

# 绘制折线图
plt.figure(figsize=(8, 5))
plt.plot(x, y,color='blue')

# 添加标题和标签
plt.title("折线图示例")
plt.xlabel("X轴")
plt.ylabel("Y轴")

# 显示网格
plt.grid()

# 显示图表
plt.show()
☆ 散点图[¶](#☆ 散点图¶)
复制代码
import numpy as np
import matplotlib.pyplot as plt
# 注意:新版本需要指定 matplotlib 使用 TkAgg 作为图形后端来渲染和显示图表
import matplotlib
matplotlib.use('TkAgg')
# 注意:中文显示需要额外设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建数据
np.random.seed(42)  # 设置随机种子,保证结果可重复
x = np.random.randn(50)
y = x * 2 + np.random.randn(50) * 0.8  # 添加一些随机噪声

# 绘制散点图
plt.figure(figsize=(8, 5))
plt.scatter(x, y, color='red')

# 添加标题和标签
plt.title("散点图示例")
plt.xlabel("X值")
plt.ylabel("Y值")

# 显示网格
plt.grid()

# 显示图表
plt.show()
相关推荐
阿Y加油吧2 小时前
栈的经典应用:字符串解码 & 每日温度 深度解析
数据结构·python·算法
枫叶丹42 小时前
【HarmonyOS 6.0】ArkWeb 手势获焦模式详解:告别点击获焦,迎接长按触发
开发语言·华为·harmonyos
ID_180079054732 小时前
如何使用 Python 调用小红书笔记评论 API 时进行并发控制?
开发语言·笔记·python
lsx2024062 小时前
PHP Error处理指南
开发语言
沐雪轻挽萤2 小时前
4. C++17新特性-内联变量 (Inline Variables)
开发语言·c++
树下水月2 小时前
使用python 一键生成,PGSQL的数据字典
python
高山流水&上善2 小时前
基于Qwen3-0.6B的光纤基础测试问答系统设计与实现
python·django
Chase_______2 小时前
【JAVA基础指南(四)】快速掌握类和对象 基础篇
android·java·开发语言
每天吃饭的羊2 小时前
Node.js 创建可二次编辑的 HTML 文档并生成文件
开发语言·javascript·ecmascript