『Plotly实战指南』--Plotly与Pandas的深度融合

在数据分析的世界中,数据处理可视化是密不可分的两个环节。

Pandas作为Python数据处理的核心工具,以其强大的数据清洗、转换和分析能力,成为数据科学家和分析师的必备利器;

Plotly则是交互式可视化的佼佼者,能够将复杂的数据以直观、动态的方式呈现出来。

当我们将PandasPlotly深度融合时,就能无缝衔接数据清洗、分析与可视化的全流程,大幅提升数据分析的效率和效果。

1. 从Pandas数据结构到Plotly图表

1.1. Series 与 DataFrame 数据创建图表

Plotly提供了强大的plotly.express模块,能够直接读取Pandas的数据结构,如SeriesDataFrame,并快速生成各种交互式图表。

例如,使用px.line(df)可以将一个时间序列的DataFrame转换为折线图,而px.bar(series)则可以将一个Series转换为条形图。

python 复制代码
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)取出来,可以直接绘制条形图。

python 复制代码
series = df["sales"]
fig = px.bar(series)
fig.show()

1.2. 索引与绘图的关联

Pandas索引(如时间戳、分类标签)在绘图中也扮演着重要角色。

我们可以直接将Pandas索引作为图表的坐标轴,从而简化数据处理过程。

比如,如果一个DataFrame的索引是时间戳,那么它默认就成为X轴

python 复制代码
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)或动态筛选图表。

python 复制代码
# 创建多级索引
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索引转换为普通列,然后把普通列regiondate一起转换为多级索引。

2. 数据预处理与可视化的交响曲

2.1. 数据清洗与验证可视化

在实际的数据分析中,数据往往存在缺失值异常值

Pandas提供了丰富的数据清洗工具,而Plotly可以将清洗前后的数据可视化出来,让我们更好的把握数据的变化。

首先,生成包含客户年龄(含缺失值异常值)、销售额(对数正态分布)和区域的模拟数据集。

python 复制代码
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%的年龄缺失值,并设置年龄范围异常(生成年龄的部分中有异常的年龄)。

然后,绘制原始数据的分布图:

python 复制代码
# 原始数据分布
raw_hist = px.histogram(
    df,
    x='Customer_Age',
    title='原始数据分布(含缺失值与异常值)',
    labels={'Customer_Age': '客户年龄'},
    nbins=20
)
raw_hist.show()

接下来,开始清洗数据:

  1. dropna():删除年龄缺失的行
  2. query():过滤年龄异常值(保留18-65岁)
python 复制代码
# 清洗数据
clean_df = (
    df
    .dropna(subset=['Customer_Age'])  # 删除缺失值
    .query('18 <= Customer_Age <= 65')  # 过滤异常值
)

清洗之后再次绘制分布图:

python 复制代码
# 清洗后分布
clean_hist = px.histogram(
    clean_df,
    x='Customer_Age',
    title='清洗后数据分布',
    labels={'Customer_Age': '客户年龄'},
    nbins=20,
    color_discrete_sequence=['#2ca02c']
)
clean_hist.show()

通过这种方式,我们可以直观地看到数据清洗的效果,从而更好地评估数据的质量。

2.2. 数据聚合与高级可视化

Pandasgroupby()pivot_table()是数据聚合的强大工具。

我们可以利用Pandas进行数据重塑,然后用Plotly来绘制重塑之后数据的高级可视化,甚至是通过自定义动画控制按钮增强交互体验。

下面的示例中,我们先生成一些销售示例数据:

python 复制代码
# 模拟数据
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"])

然后,生成透视数据并绘制热力图。

python 复制代码
# 生成透视数据
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()

最后,按照月份聚合数据,并生成动态分层柱状图,看各个区域随着时间变化销售额是如何变化的。

python 复制代码
# 动态分层柱状图
# 生成聚合数据
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. 总结

PlotlyPandas的深度融合为数据分析提供了一个强大的工具链。

从脏数据到洞察力,Pandas 负责数据的清洗和预处理,而 Plotly 则负责将处理后的数据以直观、动态的方式呈现出来。

这种协同工作模式不仅提升了数据分析的效率,还帮助我们更好地理解数据背后的含义。

在实际应用中,数据处理与可视化的不可分割性至关重要。

高质量的图表依赖于高质量的数据,而 PlotlyPandas 的结合正是实现这一目标的最佳选择。

相关推荐
wang_yb3 天前
『Plotly实战指南』--在科学数据可视化中的应用(下)
plotly·databook
wang_yb4 天前
『Plotly实战指南』--在科学数据可视化中的应用(上)
plotly·databook
wang_yb5 天前
从“朴素”到“半朴素”:贝叶斯分类器的进阶之路
ai·databook
wang_yb6 天前
极大似然估计:频率学派与贝叶斯学派的碰撞与融合
ai·databook
wang_yb7 天前
『Plotly实战指南』--在金融数据可视化中的应用(下)
plotly·databook
wang_yb8 天前
『Plotly实战指南』--在金融数据可视化中的应用(上)
plotly·databook
wang_yb10 天前
『Plotly实战指南』--交互功能进阶篇
plotly·databook
wang_yb11 天前
『Plotly实战指南』--交互功能基础篇
plotly·databook
wang_yb13 天前
解锁UV工具新玩法:让Python脚本运行更高效的实用技巧
python·databook