在pandas中按照分组绘制多个时间序列

2024-10-01 11:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在valgdata数据帧上创建了一个groupby,如下所示:

grouped_valgdata = valgdata.groupby(['news_site','dato_uden_tid']).mean()

现在我明白了:

^{pr2}$

现在我想为每个新闻站点制作一个时间序列,其中dato zuden u tid在X轴上,情感在Y轴上。在

实现这一目标的最佳和最简单的方法是什么?在

谢谢你!在


Tags: 数据站点时间site序列mean新闻news
2条回答

下面是一个使用Pandas和Matplotlib的解决方案,它具有更细粒度的控制。在

首先,我在下面提供了一个函数,它生成一个随机的数据帧用于测试。重要的是,它创建了三个列来概括更抽象的问题:

  • my_timestamp是包含时间戳的datetime
  • my_series是要应用groupby的字符串标签
  • my_value是在my_timestamp时间为my_series记录的数值

用你拥有的数据帧替换任何列名称。在

def generate_random_data(N=100):
    '''
    Returns a dataframe with N rows of random data.
    '''
    list_of_lists = []
    labels = ['foo', 'bar', 'baz']
    epoch = 1515617110
    for _ in range(N):
        key = random.choice(labels)
        value = 0
        if key == 'foo':
            value = random.randint(1, 10)
        elif key == 'bar':
            value = random.randint(50, 60)
        else:
            value = random.randint(80, 90)
        epoch += random.randint(5000, 30000)
        row = [key, epoch, value]
        list_of_lists.append(row)
    df = pd.DataFrame(list_of_lists, columns=['my_series', 'epoch', 'my_value'])
    df['my_timestamp'] = pd.to_datetime(df['epoch'], unit='s')
    df = df[['my_timestamp', 'my_series', 'my_value']]
    #df.set_index('ts', inplace=True)
    return df

以下是生成的一些示例数据:

enter image description here

现在,下面的代码将运行groupby并绘制一个很好的时间序列图。在

^{pr2}$

下面是一个调用示例:

df = generate_random_data()

plot_gb_time_series(df, 'my_timestamp', 'my_series', 'my_value',
                    figsize=(10, 5), title="Random data")

下面是生成的时间序列图:

enter image description here

(我有点好笑,因为这个问题让我做了同样的事情。)

你可以做些像

valgdata\
    .groupby([valgdata.dato_uden_tid.name, valgdata.news_site.name])\
    .mean()\
    .unstack()

哪个会呢

  • 反转groupby

  • 将新站点取消堆叠为列

要绘制,只需执行前面的代码片段,然后紧跟.plot()

^{pr2}$

相关问题 更多 >