私は次のpandas DataFrame:
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=1
からmax=35
。各Group
には、このような時系列があります。
個々の時系列A〜Zを1〜35のx軸に対してプロットしたいと思います。y軸は、それぞれのblocks
になります。
Andrews Curves plot のようなものを使用することを考えていました。これは、各シリーズを互いにプロットします。各「色相」は異なるグループに設定されます。 (他のアイデアは大歓迎です。)
私の問題:複数のシリーズをプロットするために、このデータフレームをどのようにフォーマットしますか?列はGroupA
、GroupB
などである必要がありますか?
どのようにしてデータフレームを次の形式にしますか?
time GroupA blocksA GroupsB blocksB GroupsC blocksC....
これは、示されているAndrewsプロットの正しい形式ですか?
編集
私が試した場合:
df.groupby('Group').plot(legend=False)
x軸は完全に正しくありません。すべての時系列は、0から35まで、すべて1つのシリーズでプロットする必要があります。
これをどうやって解決しますか?
このバリアントを見てください。 1つ目はAndrewsの曲線で、2つ目は1行Month
でグループ化された複数行プロットです。データフレームdata
には、3つの列Temperature
、Day
、およびMonth
が含まれます。
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()
アンドリュースの曲線をプロットすると、データは1つの関数に回収されます。これは、関数が互いに近いことで表されるAndrewsの曲線が、対応するデータポイントも互いに近いことを示唆していることを意味します。
ピボットテーブルとしてデータを再構成できます。
df.pivot_table(index='time',columns='Group',values='blocks',aggfunc='sum').plot()