1日あたり4つの異なるスコアを持つパンダデータフレームがあります。
import pandas as pd
df = pd.DataFrame( {u'Date' : ['2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18', '2014-08-19', '2014-08-20',
'2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18', '2014-08-19', '2014-08-20',
'2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18', '2014-08-19', '2014-08-20',
'2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18', '2014-08-19', '2014-08-20'],
u'Score': [-0.13, -0.25, 0.1, -0.3, -0.1, 0.1,
-0.1, 0.1, -0.05, 0.2, -0.13, -0.25,
0.2, 0.5, 0.4, -0.2, -0.25, 0.1,
-0.3, 0.1, 0.25, 0.05, -0.05, 0.2]})
df.Date = pd.to_datetime(df.Date,format='%Y-%m-%d')
スコアの日平均をプロットしたいと思います。私が試しているのは:
from numpy import *
from bokeh.plotting import *
output_file('question.html')
figure(x_axis_type="datetime", plot_width=800, plot_height=500)
grouped = df.groupby("Date")
score = grouped["Score"]
avg = score.mean()
print dates
dates = asarray(grouped.groups.keys())
hold(True)
line(dates, avg, line_color="grey", line_width=8, line_join="round")
asterisk(dates, avg, line_color="black", size=15)
hold(False)
ただし、このコードは無秩序な日付配列につながります。
print dates
['2014-08-15T02:00:00.000000000+0200' '2014-08-16T02:00:00.000000000+0200'
'2014-08-18T02:00:00.000000000+0200' '2014-08-19T02:00:00.000000000+0200'
'2014-08-17T02:00:00.000000000+0200' '2014-08-20T02:00:00.000000000+0200']
したがって、私が取得したプロットの線(このリンクの画像を参照)は間違っています。
日付による並べ替え:
df = df.sort(['Date'])
役に立ちません。
一方、同じデータフレームを6日ではなく4日でプロットしようとすると、次のようになります。
df = pd.DataFrame( {u'Date' : ['2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18',
'2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18',
'2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18',
'2014-08-15', '2014-08-16', '2014-08-17', '2014-08-18'],
u'Score': [-0.13, -0.25, 0.1, -0.3,
-0.1, 0.1, -0.05, 0.2,
0.2, 0.5, 0.4, -0.2,
-0.3, 0.1, 0.25, 0.05]})
次に、日付配列が整然としていて、プロットが正しいです。理由はわかりませんが、とにかく6つ以上の日付のプロットが欲しいです。
助けていただければ幸いです。私が何か間違ったことをしていることは明らかですが、私はこれらの言語の初心者であり、すでに何百もの解決策を試しましたが、失敗しました。ありがとうございました!
タイプを確認すると、次のようになります。
>>> type(df.groupby('Date').groups)
<class 'dict'>
したがって、辞書として、アイテムまたはキーにアクセスするときの順序は保証されdf.groupby('Date').groups
ません。あなたの例では; したがって、それらを別々に引き出すと、との間の一貫性と対応が失われます。grouped.groups.keys()
dates
avg
groupby
使用したい場合はdatetime
、オブジェクトとシンプルなnumpyのアレイ(パンダシリーズとは反対に)、あなたは一貫受注を持つために、以下のように行うことができます。
>>> ts = df.groupby('Date')['Score'].mean()
>>> avg, dates = ts.values, ts.index.map(pd.Timestamp.date)
だからあなたは持っているでしょう:
>>> avg
array([-0.0825, 0.1125, 0.175 , -0.0625, -0.1325, 0.0375])
>>> dates
array([datetime.date(2014, 8, 15), datetime.date(2014, 8, 16), datetime.date(2014, 8, 17), datetime.date(2014, 8, 18),
datetime.date(2014, 8, 19), datetime.date(2014, 8, 20)], dtype=object)
にgroupby
はデフォルトのパラメータsort=True
があるため、出力はすでにインデックスでソートされていることに注意してください。
>>> df.groupby('Date')['Score'].mean()
Date
2014-08-15 -0.082
2014-08-16 0.112
2014-08-17 0.175
2014-08-18 -0.062
2014-08-19 -0.133
2014-08-20 0.038
Name: Score, dtype: float64
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加