Pandas:将多个时间序列DataFrame绘制到单个图中

18

我有以下的pandas数据框:

     time      Group      blocks
0     1        A           4
1     2        A           7
2     3        A           12
3     4        A           17
4     5        A           21 
5     6        A           26
6     7        A           33
7     8        A           39
8     9        A           48
9     10       A           59
    ....        ....          ....
36     35      A           231
37     1       B           1
38     2       B           1.5
39     3       B           3
40     4       B           5
41     5       B           6
    ....        ....          ....
911    35      Z           349

这是一个包含多个时间序列的数据帧,范围从min=1max=35。每个Group都有类似下面这样的时间序列。

我想绘制每个单独的时间序列A到Z,对应x轴从1到35。y轴将是每个时间点的blocks

我考虑使用像Andrews曲线图这样的东西,它会将每个系列相互绘制。每个“hue”将设置为不同的组。(欢迎其他想法)

enter image description here

我的问题:如何格式化此数据帧以绘制多个时间序列?应该将列命名为GroupAGroupB等吗?

如何将数据帧格式化为以下格式:

time GroupA blocksA GroupsB blocksB GroupsC blocksC....

这是否是正确的 Andrews 图格式?

编辑

如果我尝试:

df.groupby('Group').plot(legend=False)

x轴完全不正确。所有时间序列应以0到35绘制,全部在一个序列中。

输入图像描述

我该如何解决?


要在数据框上调用 andrews_curves 函数,您需要标记要分组的值。尝试使用 andrews_curves(df, 'Group') 按列 Group 进行分组。 - Serenity
@Serenity 这个有点乱。X轴不是从1到35,而且我也不确定Y轴是什么。你怎么改变它? - ShanZhengYang
Andrews曲线的取值范围在[-pi; +pi]之间。请阅读此链接:http://fedc.wiwi.hu-berlin.de/xplore/tutorials/mvahtmlnode9.html - Serenity
@Serenity 是否可以更改X轴范围? - ShanZhengYang
ax=plt.gca(); ax_set_xlim(1,35) - Serenity
显示剩余2条评论
2个回答

13
你可以将数据重新组织成透视表:

你可以将数据重新组织成透视表:

df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()

12

看一下这些变体。第一个是安德鲁斯曲线,第二个是一个多行图,它们都按一列月份进行分组。数据框data包含三列温度日期月份

import pandas as pd
import statsmodels.api as sm
import matplotlib.pylab as plt
from pandas.tools.plotting import andrews_curves

data = sm.datasets.get_rdataset('airquality').data
fig, (ax1, ax2) = plt.subplots(nrows = 2, ncols = 1)
data = data[data.columns.tolist()[3:]] # use only Temp, Month, Day

# Andrews' curves
andrews_curves(data, 'Month', ax=ax1)

# multiline plot with group by
for key, grp in data.groupby(['Month']): 
    ax2.plot(grp['Day'], grp['Temp'], label = "Temp in {0:02d}".format(key))
plt.legend(loc='best')    
plt.show()

当你绘制安德鲁斯曲线时,你的数据会被恢复到一个函数中。这意味着,表示为相互靠近的函数的安德鲁斯曲线表明相应的数据点也将彼此接近。

enter image description here


1
请参阅上面的编辑;我遇到了“groupby”绘图方面的问题。 - ShanZhengYang
我使用这段代码来处理我的数据,但出现了下面的错误。有人可以帮我解决吗? TypeError: 对于输入类型不支持 ufunc 'true_divide',并且根据强制转换规则“safe”无法将输入安全地强制转换为任何支持的类型。 - Ramon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接