You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python/Pandas的多属性数据管理优化方案问询

车辆时间序列数据的仪表盘实现方案

背景与初始数据结构

我正在开发一款从大型文件提取数据的工具,数据可按P1(时间)、**P2(车辆)**两个属性分类,层级结构如下:

-> P1[0] : 
 |-> P2[0] : data
 |-> P2[1] : data 
 ...
-> P1[1]:
 |-> P2[0] : data
 |-> P2[1] : data 
 ...

以时间和车辆为例,实际数据结构为:

-> at t = 0s : 
 |-> car_1 : pd.DataFrame({})
 |-> car_2 : pd.DataFrame({}) 
 ...
-> at t = 1s:
 |-> car_1 : pd.DataFrame({})
 |-> car_2 : pd.DataFrame({})
 ...

最初采用嵌套字典存储数据:

global_data = {0.0: {"car_1": pd.DataFrame({"data_1":[0,0,0,0],
                                            "data_1":[0,0,0,0] }),
                     "car_2": pd.DataFrame({"data_1":[0,0,0,0],
                                            "data_1":[0,0,0,0] })},
               1.0: {"car_1": pd.DataFrame({"data_1":[1,1,1,1],
                                            "data_1":[1,1,1,1] }),
                     "car_2": pd.DataFrame({"data_1":[1,1,1,1],
                                            "data_1":[1,1,1,1] })}}

目标是将这些数据展示在美观的交互式仪表盘中,需要更优的数据结构管理方案。

更新:采用MultiIndex DataFrame优化数据结构

经优化,采用MultiIndex DataFrame作为核心数据结构,实现代码如下:

cars = [f"car_{i}" for i in range(1, 3)]
ts = np.arange(1, 3)
Time = [0, 1]
data = np.random.randint(0, 5, (len(ts)*len(cars)*len(Time), 5))
df = pd.DataFrame(
    data,
    index=pd.MultiIndex.from_product([Time, cars, ts]).set_names(['Times', 'cars', 'Height']),
    columns=[f"Indicator_{i}" for i in range(1, 6)]
)

生成的DataFrame结构如下:

Indicator_1  Indicator_2  Indicator_3  Indicator_4  Indicator_5
Times cars  Height                                                                 
0     car_1 1                 4            0            3            3            3
            2                 1            3            2            4            0
      car_2 1                 0            4            2            1            0
            2                 1            1            0            1            4
1     car_1 1                 3            0            3            0            2
            2                 3            0            1            3            3
      car_2 1                 3            0            1            1            1
            2                 0            2            4            3            3

可通过df.query("Times == 0 and cars == 'car_1'")快速查询特定数据。现在需要实现带时间和车辆选择栏的交互式仪表盘。

交互式仪表盘实现方案

针对MultiIndex DataFrame的特性,推荐以下两种高效实现方案:

方案1:Streamlit(快速上手)

Streamlit对Pandas兼容性极佳,无需前端知识即可快速搭建交互式仪表盘,示例代码:

import streamlit as st
import pandas as pd
import numpy as np

# 生成示例MultiIndex DataFrame
cars = [f"car_{i}" for i in range(1, 3)]
ts = np.arange(1, 3)
Time = [0, 1]
data = np.random.randint(0, 5, (len(ts)*len(cars)*len(Time), 5))
df = pd.DataFrame(
    data,
    index=pd.MultiIndex.from_product([Time, cars, ts]).set_names(['Times', 'cars', 'Height']),
    columns=[f"Indicator_{i}" for i in range(1, 6)]
)

# 构建仪表盘界面
st.title('车辆时间序列数据仪表盘')
selected_time = st.selectbox('选择时间点', sorted(df.index.get_level_values('Times').unique()))
selected_car = st.selectbox('选择车辆', sorted(df.index.get_level_values('cars').unique()))

# 过滤数据
filtered_df = df.query(f"Times == {selected_time} and cars == '{selected_car}'")

# 展示数据与可视化
st.subheader(f'车辆{selected_car}在时间点{selected_time}的指标数据')
st.dataframe(filtered_df, use_container_width=True)

st.subheader('指标随高度变化趋势')
for col in filtered_df.columns:
    st.line_chart(filtered_df[col], use_container_width=True)

运行后在终端执行streamlit run your_script.py即可启动仪表盘,控件选择会实时联动数据展示。

方案2:Plotly Dash(高度定制)

如果需要复杂布局或高级交互逻辑,Plotly Dash是更好的选择,示例代码:

import dash
from dash import dcc, html, Input, Output, dash_table
import pandas as pd
import numpy as np
import plotly.express as px

# 生成示例数据(重置索引方便Dash处理)
cars = [f"car_{i}" for i in range(1, 3)]
ts = np.arange(1, 3)
Time = [0, 1]
data = np.random.randint(0, 5, (len(ts)*len(cars)*len(Time), 5))
df = pd.DataFrame(
    data,
    index=pd.MultiIndex.from_product([Time, cars, ts]).set_names(['Times', 'cars', 'Height']),
    columns=[f"Indicator_{i}" for i in range(1, 6)]
).reset_index()

# 初始化Dash应用
app = dash.Dash(__name__)

# 定义布局
app.layout = html.Div([
    html.H1('车辆时间序列数据仪表盘', style={'textAlign': 'center'}),
    html.Div([
        html.Div([
            html.Label('选择时间点'),
            dcc.Dropdown(
                id='time-select',
                options=[{'label': t, 'value': t} for t in df['Times'].unique()],
                value=df['Times'].unique()[0],
                clearable=False
            )
        ], style={'width': '45%', 'display': 'inline-block', 'margin': '0 2.5%'}),
        html.Div([
            html.Label('选择车辆'),
            dcc.Dropdown(
                id='car-select',
                options=[{'label': c, 'value': c} for c in df['cars'].unique()],
                value=df['cars'].unique()[0],
                clearable=False
            )
        ], style={'width': '45%', 'display': 'inline-block', 'margin': '0 2.5%'})
    ], style={'padding': '20px'}),
    dash_table.DataTable(
        id='filtered-table',
        columns=[{'name': col, 'id': col} for col in df.columns],
        page_size=10,
        style_table={'overflowX': 'auto'},
        style_cell={'textAlign': 'left'}
    ),
    dcc.Graph(id='indicator-chart', style={'padding': '20px'})
])

# 回调函数实现联动
@app.callback(
    [Output('filtered-table', 'data'),
     Output('indicator-chart', 'figure')],
    [Input('time-select', 'value'),
     Input('car-select', 'value')]
)
def update_dashboard(selected_time, selected_car):
    filtered_data = df[(df['Times'] == selected_time) & (df['cars'] == selected_car)]
    table_data = filtered_data.to_dict('records')
    # 生成趋势图
    fig = px.line(
        filtered_data,
        x='Height',
        y=[col for col in df.columns if 'Indicator' in col],
        title=f'{selected_car}在时间点{selected_time}的指标变化',
        markers=True
    )
    fig.update_layout(legend_title='指标类型')
    return table_data, fig

if __name__ == '__main__':
    app.run_server(debug=True)

运行后访问本地端口即可查看仪表盘,支持自定义布局样式和交互逻辑。

方案对比

  • Streamlit:代码简洁、开发速度快,适合快速验证原型,自动处理交互状态,对非前端开发者友好。
  • Plotly Dash:支持完全可控的布局和交互,适合复杂组件组合,可用于生产级定制化仪表盘。

内容的提问来源于stack exchange,提问作者WinterGrim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:23:11