Python 将嵌套字典转换为数据帧并打印

Python 将嵌套字典转换为数据帧并打印,python,pandas,altair,streamlit,Python,Pandas,Altair,Streamlit,我有一个监听器,它经常以以下方式记录收到的消息-- 可以假设时间戳和数据都是浮点数 对于单个id,我可以用-- 生成以下数据帧和绘图: 所以我的问题是,我如何备份一个级别并从dictionarylistener.recorded生成一个数据帧/绘图,以便每个唯一的id都使用图例正确绘图?我似乎不能完全靠我自己做到这一点…您可以使用pd.concat创建数据帧,重置索引,然后像往常一样使用Altair。下面是一个简短的示例,其数据与您正在生成的词典相似: 将altair导入为alt 作为pd进口

我有一个监听器,它经常以以下方式记录收到的消息--

可以假设时间戳和数据都是浮点数

对于单个id,我可以用--

生成以下数据帧和绘图:


所以我的问题是,我如何备份一个级别并从dictionary
listener.recorded
生成一个数据帧/绘图,以便每个唯一的id都使用图例正确绘图?我似乎不能完全靠我自己做到这一点…

您可以使用pd.concat创建数据帧,重置索引,然后像往常一样使用Altair。下面是一个简短的示例,其数据与您正在生成的词典相似:

将altair导入为alt
作为pd进口熊猫
将numpy作为np导入
rng=np.random.default\u rng(1701)
数据={
100:{'timestamp':pd.date_范围('2021-01-01',句点=10,频率=D'),
'data':np.random.randint(0,100,10)},
200:{'timestamp':pd.date_范围('2021-01-01',句点=10,频率=D'),
'data':np.random.randint(0,100,10)},
300:{'timestamp':pd.date_范围('2021-01-01',句点=10,频率=D'),
'data':np.random.randint(0,100,10)},
}
df=pd.concat({k:pd.DataFrame(d)代表k,d在data.items()中)
df=df.reset_index(0)。重命名({'level_0':'id'},axis=1)
alt.Chart(df).标记线().编码(
x='timestamp:T',
y='data:Q',
color='id:N',
)

如果您可以使用索引访问
c
,那么我相信您可以在每次迭代过程中循环并附加到数据帧中。是类似的还是您正在寻找的?正是我所寻找的。非常感谢你!
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)
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)