『Plotly实战指南』--Plotly与Pandas的深度融合
在数据分析的世界中,数据处理与可视化是密不可分的两个环节。
Pandas
作为Python
数据处理的核心工具,以其强大的数据清洗、转换和分析能力,成为数据科学家和分析师的必备利器;
而Plotly
则是交互式可视化的佼佼者,能够将复杂的数据以直观、动态的方式呈现出来。
当我们将Pandas
与Plotly
深度融合时,就能无缝衔接数据清洗、分析与可视化的全流程,大幅提升数据分析的效率和效果。
1. 从Pandas数据结构到Plotly图表
1.1. Series 与 DataFrame 数据创建图表
Plotly
提供了强大的plotly.express
模块,能够直接读取Pandas
的数据结构,如Series
和DataFrame
,并快速生成各种交互式图表。
例如,使用px.line(df)
可以将一个时间序列的DataFrame
转换为折线图,而px.bar(series)
则可以将一个Series
转换为条形图。
import pandas as pd
import numpy as np
import plotly.express as px
# 创建一个示例 DataFrame
data = {
"date": pd.date_range(start="2024-01-01", periods=100),
"sales": np.random.randint(100, 500, size=100),
}
df = pd.DataFrame(data)
# 使用 Plotly Express 创建折线图
fig = px.line(df, x="date", y="sales", title="时间序列销售数据")
fig.show()
在这个例子中,x='date'
和y='sales'
将DataFrame
的列名映射到了图表的坐标轴上。
将数据中的某个列(Series
)取出来,可以直接绘制条形图。
series = df["sales"]
fig = px.bar(series)
fig.show()
1.2. 索引与绘图的关联
Pandas
的索引(如时间戳、分类标签)在绘图中也扮演着重要角色。
我们可以直接将Pandas
索引作为图表的坐标轴,从而简化数据处理过程。
比如,如果一个DataFrame
的索引是时间戳,那么它默认就成为X轴。
data = {
"date": pd.date_range(start="2024-01-01", periods=100),
"sales": np.random.randint(100, 500, size=100),
}
df = pd.DataFrame(data)
# 将日期设置为索引
df.set_index('date', inplace=True)
# 绘制图表,不需要指定X轴
fig = px.line(df, y='sales', title='以索引为时间轴的销售数据')
fig.show()
对于多级索引(MultiIndex
)数据,Plotly
也提供了强大的支持。
我们可以利用多级索引来生成分面图(Facet Plot
)或动态筛选图表。
# 创建多级索引
df = df.reset_index()
df["region"] = ["North", "South"] * 50
df.set_index(["region", "date"], inplace=True)
# 绘制分面图
fig = px.line(
df.reset_index(),
x="date",
y="sales",
facet_col="region",
title="按地区分面的销售数据",
)
fig.show()
在处理多级索引时,需要注意索引重置与列名转换的问题。
上面的示例中,我们先将date
索引转换为普通列,然后把普通列region
和date
一起转换为多级索引。
2. 数据预处理与可视化的交响曲
2.1. 数据清洗与验证可视化
在实际的数据分析中,数据往往存在缺失值和异常值。
Pandas
提供了丰富的数据清洗工具,而Plotly
可以将清洗前后的数据可视化出来,让我们更好的把握数据的变化。
首先,生成包含客户年龄(含缺失值和异常值)、销售额(对数正态分布)和区域的模拟数据集。
import pandas as pd
import numpy as np
import plotly.express as px
# 模拟含噪声数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=100)
# Customer_Age 年龄包含异常值(生成平均40,标准差30的数据)
df = pd.DataFrame({
'Date': dates,
'Customer_Age': np.random.normal(40, 30, 100),
})
# 人为添加缺失值
df.loc[np.random.choice(100, 15), 'Customer_Age'] = np.nan
故意添加15%
的年龄缺失值,并设置年龄范围异常(生成年龄的部分中有异常的年龄)。
然后,绘制原始数据的分布图:
# 原始数据分布
raw_hist = px.histogram(
df,
x='Customer_Age',
title='原始数据分布(含缺失值与异常值)',
labels={'Customer_Age': '客户年龄'},
nbins=20
)
raw_hist.show()
接下来,开始清洗数据:
dropna()
:删除年龄缺失的行query()
:过滤年龄异常值(保留18-65岁)
# 清洗数据
clean_df = (
df
.dropna(subset=['Customer_Age']) # 删除缺失值
.query('18 <= Customer_Age <= 65') # 过滤异常值
)
清洗之后再次绘制分布图:
# 清洗后分布
clean_hist = px.histogram(
clean_df,
x='Customer_Age',
title='清洗后数据分布',
labels={'Customer_Age': '客户年龄'},
nbins=20,
color_discrete_sequence=['#2ca02c']
)
clean_hist.show()
通过这种方式,我们可以直观地看到数据清洗的效果,从而更好地评估数据的质量。
2.2. 数据聚合与高级可视化
Pandas
的groupby()
和pivot_table()
是数据聚合的强大工具。
我们可以利用Pandas
进行数据重塑,然后用Plotly
来绘制重塑之后数据的高级可视化,甚至是通过自定义动画控制按钮增强交互体验。
下面的示例中,我们先生成一些销售示例数据:
# 模拟数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=100)
df = pd.DataFrame({
'Date': dates,
'Sales': np.random.lognormal(3, 0.5, 100),
'Region': np.random.choice(['北部', '南部', '东部', '西部'], 100)
})
# 对销售额进行对数转换(解决右偏分布)
df["Sales"] = np.log(df["Sales"])
然后,生成透视数据并绘制热力图。
# 生成透视数据
pivot_df = df.pivot_table(
index=pd.Grouper(key='Date', freq='W'), # 按周聚合
columns='Region',
values='Sales',
aggfunc='mean'
).ffill() # 前向填充缺失值
# 热力图
heatmap = px.imshow(
pivot_df.T, # 转置使时间为X轴
x=pivot_df.index.strftime('%Y-%m-%d'),
y=pivot_df.columns,
labels={'x': '日期', 'y': '区域'},
color_continuous_scale='RdBu_r',
title='区域周均销售额热力图'
)
heatmap.update_layout(height=500)
heatmap.show()
最后,按照月份聚合数据,并生成动态分层柱状图,看各个区域随着时间变化销售额是如何变化的。
# 动态分层柱状图
# 生成聚合数据
agg_df = (
df
.assign(Year_Month=lambda x: x['Date'].dt.to_period('M'))
.groupby(['Year_Month', 'Region'], as_index=False)
['Sales'].mean()
.assign(Year_Month=lambda x: x['Year_Month'].dt.to_timestamp())
)
# 创建动画图表
animated_bar = px.bar(
agg_df,
x='Region',
y='Sales',
animation_frame=agg_df['Year_Month'].dt.strftime('%Y-%m'),
range_y=[agg_df['Sales'].min()*0.9, agg_df['Sales'].max()*1.1],
labels={'Sales': '平均销售额(对数)'},
title='区域销售趋势动态演示',
color='Region',
color_discrete_sequence=px.colors.qualitative.Pastel
)
# 优化动画设置
animated_bar.update_layout(
xaxis={'categoryorder': 'total descending'},
hovermode='x unified',
updatemenus=[{
"buttons": [
{
"args": [None, {"frame": {"duration": 500, "redraw": True},
"fromcurrent": True,
"transition": {"duration": 300}}],
"label": "播放",
"method": "animate"
},
{
"args": [[None], {"frame": {"duration": 0, "redraw": True},
"mode": "immediate",
"transition": {"duration": 0}}],
"label": "暂停",
"method": "animate"
}
],
"direction": "left",
"pad": {"r": 10, "t": 87},
"showactive": False,
"type": "buttons",
"x": 0.1,
"xanchor": "right",
"y": 0,
"yanchor": "top"
}]
)
animated_bar.show()
3. 总结
Plotly
与Pandas
的深度融合为数据分析提供了一个强大的工具链。
从脏数据到洞察力,Pandas
负责数据的清洗和预处理,而 Plotly
则负责将处理后的数据以直观、动态的方式呈现出来。
这种协同工作模式不仅提升了数据分析的效率,还帮助我们更好地理解数据背后的含义。
在实际应用中,数据处理与可视化的不可分割性至关重要。
高质量的图表依赖于高质量的数据,而 Plotly
与 Pandas
的结合正是实现这一目标的最佳选择。
『Plotly实战指南』--Plotly与Pandas的深度融合的更多相关文章
- 『Numpy学习指南』Matplotlib绘图
数据生成: import numpy as np import matplotlib.pyplot as plt func = np.poly1d(np.array([,,,])) func1 = f ...
- 『Numpy学习指南』排序&索引&抽取函数介绍
排序: numpy.lexsort(): numpy.lexsort()是个排字典序函数,因为很有意思,感觉也蛮有用的,所以单独列出来讲一下: 强调一点,本函数只接受一个参数! import nump ...
- 【阿里云产品公测】以开发者角度看ACE服务『ACE应用构建指南』
作者:阿里云用户mr_wid ,z)NKt# @I6A9do 如果感觉该评测对您有所帮助, 欢迎投票给本文: UO<claV RsfTUb)< 投票标题: 28.[阿里云 ...
- 2017-2018-2 20155303『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155303『网络对抗技术』 Exp6:信息收集与漏洞扫描 --------CONTENTS-------- 一.原理与实践说明 1.实践内容 2.基础问题 二.实践过程记 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Final:Web渗透获取WebShell权限
2017-2018-2 『网络对抗技术』Final:Web渗透获取WebShell权限 --------CONTENTS-------- 一.Webshell原理 1.什么是WebShell 2.We ...
- 2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践
2017-2018-2 20155303 『网络对抗技术』Exp3:免杀原理与实践 --------CONTENTS-------- 1. 免杀原理与实践说明 实验说明 基础问题回答 2. 使用msf ...
- 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图
之前写过三篇文章,收获了极其不错的阅读量与转发量: 你真的会用 VS Code 的 Ctrl.Shift和Alt吗?高效易用的快捷键:多光标.跳转引用等轻松搞定 VS Code 中的 Vim 操作 | ...
- 大数据存储:MongoDB实战指南——常见问题解答
锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...
- js实现『加载更多』功能实例
DEMO : 滚动加载示例 关于如何实现『加载更多』功能,网上有插件可用,例如比较著名的使用iscroll.js实现的上拉加载更多.下拉刷新功能. 但实际用起来却是很麻烦.由于是第三方插件,要按照对方 ...
随机推荐
- [MQ] Kafka
概述: Kafka 安装指南 安装 on Windows Step1 安装 JDK JDK 安装后: 在"系统变量"中,找到 JAVA_HOME,如果没有则新建,将其值设置为 JD ...
- Flink学习(八) Flink SQL & Table 编程和案例
Flink Table & SQL 概述背景我们在前面的课时中讲过 Flink 的分层模型,Flink 自身提供了不同级别的抽象来支持我们开发流式或者批量处理程序,下图描述了 Flink 支持 ...
- 【由技及道】在wsl容器中进行远程java开发【人工智障AI2077的开发日志003】
指令接收:「需要万能开发环境」 系统警报:检测到主人即将陷入"环境配置地狱" 启动救赎协议:构建量子化开发容器 终极目标:让"在我机器上能跑"成为历史文物 需求 ...
- try except 案例
def to_split(df): # 删除不符合加班统计的记录 try: df.dropna(subset=['姓名'], inplace=True) hang_index = df[df['加班信 ...
- crontab Do you want to retry the same edit? (y/n)
crontab: installing new crontab "/tmp/crontab.tEoCzO":2: bad day-of-month errors in cronta ...
- 权限获得第一步-NTLM暴力破解
题目: 你猜这是什么东西,记得破解后把其中的密码给我.答案为非常规形式. Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683 ...
- 【Linux】shell 脚本 (.sh) 编写及执行
shell脚本 shell脚本就是一些命令的集合 #!/bin/bash echo "文件开头代表:该文件使用的是bash语法" 一.运行.sh文件 方法一:当前文件执行.sh 文 ...
- picoctf general skills-easy 部分题目详解(1)
实验介绍: ctf竞赛(Capture The Flag)是网络安全技术人员代替真实攻击,比拼技术的竞赛. 又名夺旗赛,是以拿到flag为目标的比赛. picoctf上的题目比较适合新手练习. 但是注 ...
- VS Code Runner 插件配置
VS Code Runner 插件配置 Code Runner插件是一个小而美的插件,可以很方便的运行一些简单的代码文件. 本篇博文记录一些相关的环境配置. 设置C++编译标准 这里可以设置默认的C+ ...
- 多态的成员访问特点和好处--java进阶day02
1.多态的成员访问特点 1.成员变量访问特点 分为两个阶段,编译阶段,系统会看父类中是否存在该成员变量,如果存在,运行阶段就会使用父类的成员变量,否则报错 当我们在父类中删去num时,编译直接报错 2 ...