MST

星途 面试题库

面试题:Python数据可视化下交互式图表的性能优化

在使用Bokeh或Plotly等库创建交互式数据可视化图表时,随着数据量的增大,交互性能可能会下降。现给定一个包含10万条交易记录的数据集,每个记录包含交易时间、交易金额等字段,要求创建一个可交互式的折线图展示交易金额随时间的变化趋势,并实现缩放、平移等交互功能。请详细说明你将采取哪些措施优化该交互式图表的性能,同时提供关键代码片段。
35.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

优化措施

  1. 数据采样:对于10万条数据,可以按照一定时间间隔进行采样,比如每100个数据点取一个,减少数据量同时保留趋势。
  2. 使用数据聚合:按时间段(如每天、每周)对交易金额进行聚合,减少数据点数量。
  3. 利用库的优化特性:Bokeh和Plotly都有优化大数据显示的特性,如Bokeh的DataRange1d用于自动适配数据范围,HoverTool优化悬停提示性能;Plotly可使用plotly.graph_objects的优化方法。
  4. 异步加载:如果可能,采用异步加载数据方式,避免一次性加载大量数据导致卡顿。

关键代码片段(以Bokeh为例)

from bokeh.plotting import figure, show
from bokeh.models import HoverTool
from bokeh.models.ranges import DataRange1d
import pandas as pd

# 假设数据在一个DataFrame中,df包含'transaction_time'和'transaction_amount'字段
df = pd.read_csv('transaction_data.csv')

# 数据采样,每100个点取一个
df_sampled = df.iloc[::100]

p = figure(x_axis_type='datetime', title='交易金额随时间变化',
           plot_width=800, plot_height=400,
           x_range=DataRange1d())

p.line(df_sampled['transaction_time'], df_sampled['transaction_amount'], line_width=2)

hover = HoverTool(tooltips=[('交易时间', '@transaction_time{%F %T}'), ('交易金额', '@transaction_amount')],
                  formatters={'@transaction_time': 'datetime'})
p.add_tools(hover)

show(p)

关键代码片段(以Plotly为例)

import plotly.graph_objects as go
import pandas as pd

df = pd.read_csv('transaction_data.csv')

# 数据聚合,按天聚合交易金额
df_aggregated = df.groupby(pd.Grouper(key='transaction_time', freq='D')).sum().reset_index()

fig = go.Figure(data=go.Scatter(
    x=df_aggregated['transaction_time'],
    y=df_aggregated['transaction_amount'],
    mode='lines',
    line=dict(width=2)
))

fig.update_layout(
    title='交易金额随时间变化',
    xaxis_title='交易时间',
    yaxis_title='交易金额'
)

fig.update_xaxes(type='date')
fig.show()