簡體   English   中英

將嵌套字典轉換為 pandas dataframe 並繪圖

[英]Converting nested dictionary to pandas dataframe and plotting

我有一個監聽器,它通過以下方式不斷記錄收到的消息——

class Listener:

    recorded = defaultdict(lambda: defaultdict(list))

    def on_message_received(self, msg):
        self.recorded[msg.id]["timestamp"].append(msg.timestamp)
        self.recorded[msg.id]["data"].append(msg.data)

可以假設時間戳和數據都是浮點數。

對於單個 id,我可以使用 plot 數據 -

import altair as alt
import pandas as pd
import streamlit as st

listener = Listener()

plt, frame = st.empty(), st.empty()

def plot():
    c = listener.recorded.copy()
    df = pd.DataFrame.from_dict(c[100]) # using id: 100 as an example
    chart = alt.Chart(df).mark_line().encode(x="timestamp", y="data")
    frame.write(df)
    plt.altair_chart(chart)

它產生一個 dataframe 和 plot :

在此處輸入圖像描述

所以我的問題是,我將如何備份一個級別並從字典listener.recorded生成一個數據框/繪圖,以便每個唯一的 id 都正確地繪制一個圖例? 我自己似乎無法完全到達那里......

您可以使用 pd.concat 創建pd.concat ,重置索引,然后正常使用 Altair。 這是一個簡短的示例,其數據類似於您正在生成的字典:

import altair as alt
import pandas as pd
import numpy as np

rng = np.random.default_rng(1701)

data = {
  100: {'timestamp': pd.date_range('2021-01-01', periods=10, freq='D'),
        'data': np.random.randint(0, 100, 10)},
  200: {'timestamp': pd.date_range('2021-01-01', periods=10, freq='D'),
        'data': np.random.randint(0, 100, 10)},
  300: {'timestamp': pd.date_range('2021-01-01', periods=10, freq='D'),
        'data': np.random.randint(0, 100, 10)},
}

df = pd.concat({k: pd.DataFrame(d) for k, d in data.items()})
df = df.reset_index(0).rename({'level_0': 'id'}, axis=1)
alt.Chart(df).mark_line().encode(
    x='timestamp:T',
    y='data:Q',
    color='id:N',
)

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM