"大家好!最近在整理技术资料时发现,很多小伙伴都在问如何系统学习Python——从基础语法到爬虫开发,从数据分析到AI应用,不同阶段的学习路径和资源选择确实容易让人迷茫。
今天特意为大家准备了一份经过筛选的Python学习资料包,包含:
✅ 30本经典电子书(从入门到进阶)
✅ 100+实战项目源码
✅ 人工智能入门课程(限时免费)
✅ 编程思维训练手册
无论你是零基础小白还是想提升的开发者,这些资料都能帮你节省大量搜索时间。领取方式非常简单——文末准备了我的技术名片,扫码即可获取全部资源,还能加入Python学习交流群和同行一起成长!"
图表可视化
Pandas是Python中最流行的数据分析库之一,它提供了强大的数据处理和可视化功能。在数据分析过程中,可视化是一个非常重要的步骤,可以帮助我们直观地理解数据特征和发现数据中的规律。Pandas内置的可视化功能基于Matplotlib库,通过
.plot()
方法可以轻松创建各种类型的图表。
基本折线图
折线图是最基本的图表类型,用于展示数据随时间或有序类别的变化趋势。特别适合可视化连续数据、时间序列数据或显示数据的变化方向。
特点:
-
折线图适用于展示连续变化的数据趋势
-
Pandas的绘图功能是基于Matplotlib的封装,使用更简便
-
DataFrame的
.plot()
方法可以直接绘制各种图表 -
可以通过参数定制图表的各种属性,如大小、标题等
import pandas as pd # 导入pandas库,用于数据处理
import matplotlib.pyplot as plt # 导入matplotlib库,用于图形定制
# 创建一个数据帧,包含x和y两列数据
df = pd.DataFrame({'x': range(10), 'y': [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]})
# 绘制折线图
# x='x':指定x轴数据来源
# y='y':指定y轴数据来源
# figsize=(10, 6):设置图形大小,单位为英寸
# title='简单折线图示例':设置图表标题
df.plot(x='x', y='y', figsize=(6, 3), title='简单折线图示例')
plt.grid(True) # 添加网格线,提高可读性
plt.show() # 显示图表
多系列折线图
在实际应用中,经常需要在一张图中展示多个数据系列的变化趋势,以便进行比较分析。多系列折线图可以直观地比较不同数据集在同一坐标系下的表现。
特点:
-
多系列折线图适合比较多个相关数据集的趋势
-
Pandas可以自动为不同列数据分配不同颜色
-
DataFrame中的每一列可以自动成为一个数据系列
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 创建包含多个列的DataFrame
# pd.date_range:创建一个日期范围作为索引
# periods=12:生成12个日期点
dates = pd.date_range('20230101', periods=12) # 创建从2023年1月1日开始的12个连续日期
# 创建DataFrame,包含三个不同增长模式的数据系列
df = pd.DataFrame({
'线性增长': np.arange(12), # 创建线性增长数据:0,1,2,...,11
'平方增长': np.arange(12)**2, # 创建平方增长数据:0,1,4,9,...
'指数增长': 2**np.arange(12) # 创建指数增长数据:2^0,2^1,2^2,...
}, index=dates) # 使用日期作为索引
# 绘制多系列折线图
# df.plot()会自动将每一列数据绘制为单独的一条线
ax = df.plot(figsize=(12, 7), title='不同增长模式对比')
ax.set_xlabel('日期') # 设置x轴标签
ax.set_ylabel('数值') # 设置y轴标签
ax.legend(loc='best') # 自动选择最佳图例位置
plt.grid(True) # 添加网格线
plt.tight_layout() # 自动调整布局,确保所有元素都能适当显示
plt.show()
柱状图
柱状图用于比较不同类别的数据大小,特别适合展示分类数据。柱状图以矩形的高度(垂直柱状图)或长度(水平柱状图)来表示数据的数值,非常直观地显示各类别间的差异。
特点:
-
柱状图适合离散分类数据的比较,尤其是分类之间的大小对比
-
使用
kind='bar'
参数可以将DataFrame绘制为柱状图 -
可以同时绘制多组数据进行分组对比
-
通过
bar_label()
函数可以在柱子上显示具体数值 -
垂直柱状图用
kind='bar'
,水平柱状图用kind='barh'
import pandas as pd
import matplotlib.pyplot as plt
# 创建一个数据帧,包含城市销售额数据
df = pd.DataFrame({
'城市': ['北京', '上海', '广州', '深圳', '杭州'], # 分类数据(城市名称)
'2021年销售额': [1500, 1300, 900, 800, 600], # 2021年各城市销售数据
'2022年销售额': [1800, 1400, 950, 900, 700] # 2022年各城市销售数据
})
# 绘制柱状图
# kind='bar':指定图表类型为柱状图
# x='城市':使用'城市'列作为x轴分类标签
# y=['2021年销售额', '2022年销售额']:指定要绘制的数据列,会生成分组柱状图
# color:自定义柱子颜色
# alpha:设置透明度(0-1之间),值越小越透明
ax = df.plot(kind='bar', x='城市', y=['2021年销售额', '2022年销售额'],
color=['skyblue', 'lightgreen'], alpha=0.8, figsize=(8, 4))
# 设置标题和横纵坐标轴标签
ax.set_title('各城市销售额对比')
ax.set_xlabel('城市')
ax.set_ylabel('销售额(万元)')
# 为每个柱添加数值标签
# container是柱状图中的每组柱子集合
# bar_label函数将数值添加到柱子上方,fmt='%d'表示显示为整数格式
for container in ax.containers:
ax.bar_label(container, fmt='%d')
# 只在y轴方向添加网格线,使用虚线样式,透明度设为0.7
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout() # 自动调整布局,避免标签被裁剪
plt.show()
垂直柱状图:
水平柱状图:
堆叠柱状图
堆叠柱状图可以展示整体和部分的关系,适合展示组成数据。通过将不同部分堆叠在一起,可以同时显示总量和各部分的占比。
特点:
-
堆叠柱状图适合展示整体与部分的构成关系
-
添加
stacked=True
参数可以将分组柱状图转换为堆叠柱状图 -
堆叠柱状图的每个部分代表一个子类别,总高度代表总量
-
可以使用
label_type='center'
参数在柱子中间添加标签 -
适合展示销售构成、预算分配等比例数据
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据 - 季度销售数据
data = {
'季度': ['Q1', 'Q2', 'Q3', 'Q4'], # 季度分类
'产品A': [120, 140, 160, 180], # 产品A的季度销售数据
'产品B': [100, 110, 120, 140], # 产品B的季度销售数据
'产品C': [80, 90, 110, 120] # 产品C的季度销售数据
}
df = pd.DataFrame(data)
# 绘制堆叠柱状图
# kind='bar':指定图表类型为柱状图
# stacked=True:将柱状图设置为堆叠模式,使得每个柱子中各组数据堆叠显示
# colormap='viridis':使用viridis色彩映射方案为不同产品分配颜色
ax = df.plot(kind='bar', x='季度', y=['产品A', '产品B', '产品C'],
stacked=True, figsize=(8, 4), colormap='viridis')
ax.set_title('季度销售额分布(堆叠)')
ax.set_xlabel('季度')
ax.set_ylabel('销售额(万元)')
ax.legend(title='产品类别') # 添加图例,并设置图例标题
# 添加数据标签
# 在每个堆叠部分的中央显示数值
# label_type='center'指定标签位置在柱子中间而不是上方
for c in ax.containers:
# 使用列表推导式创建标签,只为非零值添加标签
labels = [f'{v:,.0f}' if v > 0 else '' for v in c.datavalues]
ax.bar_label(c, labels=labels, label_type='center')
plt.tight_layout()
plt.show()
散点图
散点图用于展示两个数值变量之间的关系,可以帮助发现变量间的相关性。
特点:
-
散点图适合展示两个变量之间的关系,用于发现相关性和模式
-
通过点的大小和颜色可以在散点图中展示额外的维度信息
-
使用
plot.scatter()
方法可以创建散点图,比基本的plot(kind='scatter')
提供更多控制选项 -
散点图的点可以根据分类变量进行颜色编码,帮助识别不同组的模式
-
factorize()
方法可以将分类数据转换为数值,用于颜色映射
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42) # 设置随机种子,确保结果可复现
n = 50
df = pd.DataFrame({
'x值': np.random.rand(n) * 10, # 创建随机x坐标值(0-10之间)
'y值': np.random.rand(n) * 10, # 创建随机y坐标值(0-10之间)
'大小': np.random.rand(n) * 100, # 创建随机大小值(0-100之间),用于控制点的大小
'分类': np.random.choice(['A', 'B', 'C', 'D'], n) # 随机分配类别标签
})
# 绘制散点图,大小根据'大小'列,颜色根据'分类'列
scatter = df.plot.scatter(x='x值', y='y值',
s=df['大小'], # s参数:控制点的大小
c=pd.factorize(df['分类'])[0], # c参数:控制点的颜色,factorize将分类转为数值
alpha=0.7, # 透明度设置,使重叠点可见
figsize=(10, 6), # 图表大小
colormap='viridis') # 使用viridis色彩映射
plt.title('散点图示例')
plt.grid(True, linestyle='--', alpha=0.7) # 添加网格线,使用虚线样式
# 添加颜色图例
from matplotlib.lines import Line2D
categories = df['分类'].unique() # 获取所有唯一的分类值
colors = plt.cm.viridis(np.linspace(0, 1, len(categories))) # 生成与分类数量匹配的颜色
# 创建自定义图例元素,每个元素是一个点和对应的分类标签
legend_elements = [Line2D([0], [0], marker='o', color='w',
markerfacecolor=colors[i], label=cat, markersize=8)
for i, cat in enumerate(categories)]
plt.legend(handles=legend_elements, title='分类') # 添加图例,并设置标题
plt.tight_layout() # 自动调整子图参数,确保适合图形区域
plt.show() # 显示图表
饼图
饼图用于展示各部分占整体的比例,特别适合展示构成比例数据。
特点:
-
饼图适合展示各部分占整体的比例关系,最适合类别较少的数据(通常不超过7个类别)
-
使用
plot.pie()
方法可以创建饼图,需要指定表示数值的列 -
autopct
参数用于在每个扇区显示百分比,提高可读性 -
explode
参数允许突出显示特定扇区,增强重要类别的视觉效果 -
shadow
参数可以为饼图添加阴影效果,增强立体感 -
饼图应避免使用太多类别,否则会影响可读性
-
各部分比例和为100%,非常直观地展示占比情况
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {
'类别': ['食品', '住房', '交通', '娱乐', '其他'], # 支出类别
'支出': [3500, 5000, 1500, 1000, 2000] # 各类别的支出金额
}
df = pd.DataFrame(data)
# 绘制饼图
plt.figure(figsize=(10, 6)) # 创建图形对象并设置大小
ax = df.plot.pie(y='支出', # 指定用于绘制饼图的数据列
labels=df['类别'], # 使用'类别'列作为扇区标签
autopct='%1.1f%%', # 在扇区内显示百分比,保留1位小数
startangle=90, # 起始角度为90度(从顶部开始)
explode=[0, 0.1, 0, 0, 0], # 突出显示第二个扇区(住房)
shadow=True, # 添加阴影效果
colormap='Pastel1') # 使用Pastel1色彩映射方案
ax.set_title('月度支出分布') # 设置图表标题
ax.set_ylabel('') # 清除y轴标签,饼图不需要
plt.tight_layout() # 自动调整布局,确保所有元素都能适当显示
plt.show() # 显示图表
直方图
直方图用于展示数值变量的分布情况。
特点:
-
直方图适合可视化连续数据的分布情况,如频率分布、密度分布等
-
直方图将数据范围分成若干个区间(bins),计算每个区间内数据点的数量
-
使用
plot.hist()
方法可以轻松创建直方图 -
bins
参数控制直方图的区间数量,影响分布的精细程度 -
直方图可以帮助识别数据的集中趋势、离散程度、偏斜度以及异常值
-
可以使用
subplots
创建并排的多个直方图,便于比较不同分布
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42) # 设置随机种子,确保结果可复现
df = pd.DataFrame({
'正态分布': np.random.normal(0, 1, 1000), # 创建均值为0,标准差为1的正态分布数据
'均匀分布': np.random.uniform(-3, 3, 1000) # 创建-3到3之间的均匀分布数据
})
# 绘制直方图
fig, axes = plt.subplots(1, 2, figsize=(10, 4)) # 创建1行2列的子图布局
# 第一个子图:正态分布直方图
df['正态分布'].plot.hist(ax=axes[0], # 在第一个子图上绘制
bins=30, # 设置柱子数量为30
alpha=0.7, # 设置透明度为0.7
color='skyblue', # 设置柱子颜色为天蓝色
edgecolor='black') # 设置柱子边缘颜色为黑色
axes[0].set_title('正态分布直方图') # 设置标题
axes[0].grid(True, linestyle='--', alpha=0.7) # 添加网格线
# 第二个子图:均匀分布直方图
df['均匀分布'].plot.hist(ax=axes[1], # 在第二个子图上绘制
bins=30, # 设置柱子数量为30
alpha=0.7, # 设置透明度为0.7
color='lightgreen', # 设置柱子颜色为浅绿色
edgecolor='black') # 设置柱子边缘颜色为黑色
axes[1].set_title('均匀分布直方图') # 设置标题
axes[1].grid(True, linestyle='--', alpha=0.7) # 添加网格线
plt.tight_layout() # 自动调整子图参数,确保适合图形区域
plt.show() # 显示图表
箱线图
箱线图用于展示数据的分布情况,包括中位数、四分位数和异常值。
特点:
-
箱线图能直观显示数据的分布特征,包括中位数、四分位数范围、异常值等
-
箱线图中的"箱"表示四分位区间(IQR),从第一四分位数(Q1)到第三四分位数(Q3)
-
箱内的线表示中位数,反映数据的中心位置
-
箱外的"须"表示的范围通常是Q1-1.5IQR到Q3+1.5IQR
-
超出"须"范围的点被视为异常值(outliers),以单独的点显示
-
箱线图特别适合比较多组数据的分布差异
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42) # 设置随机种子,确保结果可复现
df = pd.DataFrame({
'A组': np.random.normal(0, 1, 100), # 创建均值为0,标准差为1的正态分布数据
'B组': np.random.normal(1, 2, 100), # 创建均值为1,标准差为2的正态分布数据
'C组': np.random.normal(-1, 1.5, 100), # 创建均值为-1,标准差为1.5的正态分布数据
'D组': np.random.normal(0.5, 0.5, 100) # 创建均值为0.5,标准差为0.5的正态分布数据
})
# 绘制箱线图
plt.figure(figsize=(12, 8)) # 创建图形并设置大小
boxplot = df.plot.box(vert=True, # vert=True表示垂直方向的箱线图,False则为水平方向
grid=True) # 显示网格线
plt.title('各组数据分布箱线图') # 设置图表标题
plt.ylabel('数值') # 设置y轴标签(因为是垂直箱线图,数值在y轴上)
plt.tight_layout() # 自动调整子图参数,确保适合图形区域
plt.show() # 显示图表
热力图
热力图用于展示矩阵数据,如相关系数矩阵。
特点:
-
热力图通过颜色深浅直观地展示矩阵数据中数值的大小
-
在数据分析中,热力图常用于可视化相关系数矩阵,帮助识别变量间的相关性
-
Seaborn库的heatmap函数提供了强大的热力图绘制功能
-
通过colormap(cmap)参数可以自定义颜色映射方案
-
annot=True参数可以在每个单元格内显示具体数值
-
热力图特别适合展示大型矩阵数据,可以快速识别数据模式和关系
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns # 导入seaborn库,用于高级数据可视化
# 创建示例数据
np.random.seed(42) # 设置随机种子,确保结果可复现
df = pd.DataFrame(np.random.randn(10, 10)) # 创建10x10的随机数矩阵数据
# 计算相关系数
corr = df.corr() # 计算DataFrame各列之间的相关系数
# 绘制热力图
plt.figure(figsize=(8, 4)) # 创建图形并设置大小
sns.heatmap(corr, # 要展示的矩阵数据
annot=True, # 在每个单元格内显示具体数值
cmap='coolwarm', # 使用coolwarm颜色映射方案(蓝色表示负相关,红色表示正相关)
linewidths=0.5, # 设置单元格边框线宽度
vmin=-1, # 颜色映射的最小值
vmax=1) # 颜色映射的最大值
plt.title('相关系数热力图') # 设置图表标题
plt.tight_layout() # 自动调整子图参数,确保适合图形区域
plt.show() # 显示图表
面积图
面积图类似于折线图,但是在线的下方填充颜色,适合展示累计趋势。
特点:
-
面积图是折线图的变种,在折线与x轴之间填充颜色,强调数量变化的趋势
-
特别适合展示时间序列数据的累计变化或组成部分的比例变化
-
使用
plot.area()
方法可以创建面积图 -
stacked=True
参数可以创建堆叠面积图,展示各部分对总体的贡献 -
alpha
参数控制填充区域的透明度,当有重叠时特别有用 -
面积图对于展示多个相关数据系列随时间变化的组合关系非常有效
-
使用
cumsum()
方法可以生成累计求和数据,非常适合面积图展示
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建时间序列数据
index = pd.date_range('2023-01-01', periods=12, freq='M') # 创建从2023年1月1日开始的12个月日期索引
data = {
'产品A': np.random.randint(100, 200, 12).cumsum(), # 生成随机数并累计求和,模拟累计销售额
'产品B': np.random.randint(80, 150, 12).cumsum(), # 生成随机数并累计求和,模拟累计销售额
'产品C': np.random.randint(50, 100, 12).cumsum() # 生成随机数并累计求和,模拟累计销售额
}
df = pd.DataFrame(data, index=index) # 创建DataFrame,使用日期作为索引
# 绘制面积图
ax = df.plot.area(figsize=(8, 4), # 创建面积图,设置图形大小
alpha=0.4, # 设置填充区域的透明度
stacked=True) # 创建堆叠面积图,各系列叠加显示
ax.set_title('各产品销售额累计趋势') # 设置图表标题
ax.set_xlabel('日期') # 设置x轴标签
ax.set_ylabel('累计销售额') # 设置y轴标签
ax.legend(loc='upper left') # 设置图例位置在左上角
plt.grid(True) # 显示网格线
plt.tight_layout() # 自动调整子图参数,确保适合图形区域
plt.show() # 显示图表
多图布局
在实际应用中,经常需要在一个页面上展示多个图表,以便进行比较分析。
特点:
-
多图布局(subplots)允许在一个页面上展示多个相关图表,便于对比分析
-
使用
plt.subplots()
函数可以创建具有行列结构的子图网格 -
子图可以通过索引访问(
axes[i, j]
),用于绘制不同类型的图表 -
通过为每个子图指定不同的图表类型,可以从多个角度分析同一数据集
-
多图布局支持不同类型的可视化混合使用,如折线图、柱状图、箱线图等
-
使用
tight_layout()
函数可以自动调整子图间距,避免图表元素重叠 -
在数据分析报告中,多图布局能提供更全面、更系统的数据视图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42) # 设置随机种子,确保结果可复现
df = pd.DataFrame({
'A': np.random.randn(1000).cumsum(), # 创建随机游走数据,通过累积求和模拟时间序列
'B': np.random.randn(1000).cumsum(), # 创建随机游走数据,通过累积求和模拟时间序列
'C': np.random.randn(1000).cumsum(), # 创建随机游走数据,通过累积求和模拟时间序列
'D': np.random.randn(1000).cumsum() # 创建随机游走数据,通过累积求和模拟时间序列
})
# 创建2x2的子图布局
fig, axes = plt.subplots(2, 2, # 创建2行2列的子图网格
figsize=(10, 6)) # 设置整个图形的大小
# 绘制不同类型的图表
df.plot(ax=axes[0, 0], title='折线图') # 在左上角子图绘制折线图
# 当数据点过多时,柱状图会变得非常密集
# 对柱状图数据进行采样,每50个点取一个,减少数据密度
df_sampled = df.iloc[::50].copy() # 每50个点取样一次
df_sampled.plot.bar(ax=axes[0, 1], title='柱状图') # 在右上角子图绘制柱状图
df.plot.box(ax=axes[1, 0], title='箱线图') # 在左下角子图绘制箱线图
df.plot.scatter(x='A', y='B', # 在右下角子图绘制散点图,x轴使用A列,y轴使用B列
ax=axes[1, 1],
title='散点图')
plt.tight_layout()
plt.show()
表格可视化
在数据分析中,除了图表外,表格也是一种重要的可视化方式,特别适合展示精确的数值和文本数据。Pandas提供了多种方法来美化表格显示,使数据更加直观易读。
基本表格显示
使用to_html()
方法可以将DataFrame转换为HTML表格
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display, HTML
import webbrowser
import os
# 创建示例数据
np.random.seed(42)
df = pd.DataFrame({
'产品': ['A产品', 'B产品', 'C产品', 'D产品', 'E产品'],
'价格': np.random.randint(100, 1000, 5),
'销量': np.random.randint(500, 5000, 5),
'收入': np.random.randint(50000, 500000, 5),
'增长率': np.random.uniform(-0.2, 0.5, 5)
})
# 计算总收入
df['总收入'] = df['价格'] * df['销量']
# 显示基本表格(在Jupyter Notebook中使用)
display(df)
# 使用to_html方法将DataFrame转换为HTML表格
html_content = df.to_html(index=False)
# 将HTML保存为文件
with open('基本表格.html', 'w', encoding='utf-8') as f:
f.write(html_document)
# 在Jupyter Notebook中直接显示HTML表格
display(HTML(html_document))
样式化表格
通过Pandas的style
属性,我们可以对表格进行各种样式设置,如背景色、文字颜色、条件格式等。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display
# 创建示例数据
np.random.seed(42)
df = pd.DataFrame({
'产品': ['A产品', 'B产品', 'C产品', 'D产品', 'E产品'],
'价格': np.random.randint(100, 1000, 5),
'销量': np.random.randint(500, 5000, 5),
'收入': np.random.randint(50000, 500000, 5),
'增长率': np.random.uniform(-0.2, 0.5, 5)
})
# 创建样式化表格
styled_df = df.style.set_caption('产品销售数据分析表')
# 设置数值格式
styled_df = styled_df.format({
'价格': '¥{:.2f}',
'销量': '{:,.0f}',
'收入': '¥{:,.2f}',
'增长率': '{:.2%}'
})
# 添加条件格式
# 对增长率列应用颜色映射:正值为绿色,负值为红色
styled_df = styled_df.background_gradient(cmap='RdYlGn', subset=['增长率'])
# 高亮显示最大销量
styled_df = styled_df.highlight_max(subset=['销量'], color='lightblue')
# 为表格添加样式
styled_df = styled_df.set_properties(**{
'border': '1px solid gray',
'text-align': 'center',
'font-weight': 'bold',
'padding': '5px'
})
# 设置表头样式
styled_df = styled_df.set_table_styles([
{'selector': 'th', 'props': [('background-color', '#f2f2f2'),
('color', 'black'),
('font-weight', 'bold'),
('border', '1px solid black'),
('padding', '5px')]},
{'selector': 'caption', 'props': [('caption-side', 'top'),
('font-size', '16pt'),
('font-weight', 'bold')]}
])
# 添加条带行(隔行变色)
styled_df = styled_df.set_table_styles([
{'selector': 'tr:nth-child(even)', 'props': [('background-color', '#f9f9f9')]},
{'selector': 'tr:hover', 'props': [('background-color', '#e6f7ff')]}
], overwrite=False)
# 在Jupyter Notebook中显示样式化表格
# display(styled_df)
# 将样式化表格保存为HTML文件
styled_df.to_html('产品销售数据表.html')
)
热力图表格
热力图表格是一种将数值映射为颜色深浅的表格形式,特别适合展示相关性矩阵、温度变化等数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display
# 创建相关性矩阵示例数据
np.random.seed(42)
# 创建5个随机时间序列数据
data = np.random.randn(100, 5)
columns = ['股票A', '股票B', '股票C', '股票D', '股票E']
df = pd.DataFrame(data, columns=columns)
# 计算相关性矩阵
corr_matrix = df.corr()
# 创建热力图表格
heatmap_table = corr_matrix.style.background_gradient(cmap='coolwarm', axis=None)
# 设置数值格式(保留两位小数)
heatmap_table = heatmap_table.format("{:.2f}")
# 设置表格标题
heatmap_table = heatmap_table.set_caption('股票相关性矩阵热力图')
# 添加表格样式
heatmap_table = heatmap_table.set_table_styles([
{'selector': 'th', 'props': [('font-size', '12pt'),
('text-align', 'center'),
('font-weight', 'bold'),
('color', 'black'),
('background-color', '#f2f2f2')]},
{'selector': 'caption', 'props': [('caption-side', 'top'),
('font-size', '14pt'),
('font-weight', 'bold'),
('color', '#333333')]}
])
# 在Jupyter Notebook中显示热力图表格
# display(heatmap_table)
# 保存为HTML文件
heatmap_table.to_html('相关性热力图表格.html')
条形图表格
条形图表格将数值以条形图的形式展示在表格中,结合了表格的精确性和图表的直观性。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display
# 创建示例数据 - 各地区销售数据
regions = ['华东', '华南', '华北', '西南', '东北', '西北']
products = ['产品A', '产品B', '产品C']
# 创建随机销售数据
np.random.seed(42)
data = np.random.randint(1000, 10000, size=(len(regions), len(products)))
df = pd.DataFrame(data, index=regions, columns=products)
# 添加总计列
df['总计'] = df.sum(axis=1)
# 创建样式化表格
bar_table = df.style.set_caption('各地区产品销售数据')
# 为所有列应用数值格式
bar_table = bar_table.format("{:,.0f}")
# 为每列选择不同颜色并应用条形图
colors = {
'产品A': '#5fba7d', # 绿色
'产品B': '#5d9ed9', # 蓝色
'产品C': '#e4826f', # 红色
'总计': '#dfb867' # 黄色
}
# 获取全局最大值用于归一化
max_value = df.max().max()
# 为每列应用条形图
for col in df.columns:
bar_table = bar_table.bar(
subset=[col],
color=colors.get(col, '#dfb867'),
vmin=0,
vmax=max_value,
align='left'
)
# 设置表格样式
bar_table = bar_table.set_table_styles([
{'selector': 'th', 'props': [('background-color', '#f2f2f2'),
('text-align', 'center'),
('font-weight', 'bold'),
('border', '1px solid #ddd')]},
{'selector': 'td', 'props': [('text-align', 'right'),
('padding', '8px'),
('border', '1px solid #ddd')]},
{'selector': 'tr:nth-child(even)', 'props': [('background-color', '#f9f9f9')]},
{'selector': 'caption', 'props': [('caption-side', 'top'),
('font-size', '14pt'),
('font-weight', 'bold'),
('margin-bottom', '10px')]}
])
# 在Jupyter Notebook中显示条形图表格
display(bar_table)
# 保存为HTML文件
bar_table.to_html('条形图表格.html')
图标表格
在表格中嵌入图标可以增强数据的可视化效果,特别适合展示趋势、状态等信息。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display, HTML
# 创建示例数据 - 项目状态跟踪
projects = ['项目A', '项目B', '项目C', '项目D', '项目E']
status = ['完成', '进行中', '延期', '完成', '进行中']
progress = [100, 65, 30, 100, 80]
priority = ['高', '中', '高', '低', '中']
trend = ['上升', '持平', '下降', '上升', '上升']
# 创建DataFrame
df = pd.DataFrame({
'项目名称': projects,
'状态': status,
'完成度(%)': progress,
'优先级': priority,
'趋势': trend
})
# 创建样式化表格
icon_table = df.style.set_caption('项目状态跟踪表')
# 定义样式映射函数,返回样式字典而不是HTML字符串
def status_style(val):
"""为状态设置样式"""
color = ''
if val == '完成':
color = 'green'
elif val == '进行中':
color = 'blue'
elif val == '延期':
color = 'red'
return f'color: {color}' if color else ''
def priority_style(val):
"""为优先级设置样式"""
color = ''
if val == '高':
color = 'red'
elif val == '中':
color = 'orange'
elif val == '低':
color = 'green'
return f'color: {color}' if color else ''
def trend_style(val):
"""为趋势设置样式"""
color = ''
if val == '上升':
color = 'green'
elif val == '持平':
color = 'blue'
elif val == '下降':
color = 'red'
return f'color: {color}' if color else ''
def progress_style(val):
"""为进度条设置样式"""
# 根据进度设置颜色
if val < 40:
color = '#ff6b6b' # 红色
elif val < 70:
color = '#ffd166' # 黄色
else:
color = '#06d6a0' # 绿色
# 返回样式字符串
return f'background: linear-gradient(90deg, {color} {val}%, white {val}%); color: black; border-radius: 5px;'
# 定义值格式化函数
def status_format(val):
icons = {'完成': '✓', '进行中': '⟳', '延期': '⚠'}
icon = icons.get(val, '')
return f'{icon} {val}'
def priority_format(val):
icons = {'高': '⬆', '中': '➡', '低': '⬇'}
icon = icons.get(val, '')
return f'{icon} {val}'
def trend_format(val):
icons = {'上升': '↗', '持平': '→', '下降': '↘'}
icon = icons.get(val, '')
return f'{icon} {val}'
def progress_format(val):
return f'{val}%'
# 应用样式函数
icon_table = icon_table.applymap(status_style, subset=['状态'])
icon_table = icon_table.applymap(priority_style, subset=['优先级'])
icon_table = icon_table.applymap(trend_style, subset=['趋势'])
icon_table = icon_table.applymap(progress_style, subset=['完成度(%)'])
# 格式化显示值
icon_table = icon_table.format({
'状态': status_format,
'优先级': priority_format,
'趋势': trend_format,
'完成度(%)': progress_format
})
# 设置表格样式
icon_table = icon_table.set_table_styles([
{'selector': 'th', 'props': [('background-color', '#4a4e69'),
('color', 'white'),
('text-align', 'center'),
('font-weight', 'bold'),
('border', '1px solid #ddd'),
('padding', '10px')]},
{'selector': 'td', 'props': [('text-align', 'center'),
('padding', '10px'),
('border', '1px solid #ddd')]},
{'selector': 'tr:nth-child(even)', 'props': [('background-color', '#f8f9fa')]},
{'selector': 'tr:hover', 'props': [('background-color', '#e9ecef')]},
{'selector': 'caption', 'props': [('caption-side', 'top'),
('font-size', '16pt'),
('font-weight', 'bold'),
('color', '#212529'),
('margin-bottom', '10px')]}
])
# 在Jupyter Notebook中显示图标表格
display(icon_table)
# 保存为HTML文件
icon_table.to_html('图标表格.html')