-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'])

没有帮助。

另一方面,如果我尝试绘制相同的数据框但 4 天而不是 6 天:

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 个或更多日期的情节。

如果您能帮助我,我将不胜感激。很明显,我做错了什么,但我是这些语言的初学者,我已经尝试了数百种解决方案,但均未成功。谢谢!

4

2 回答 2

1

如果您检查类型:

>>> type(df.groupby('Date').groups)
<class 'dict'>

因此,作为字典,在您访问项目或键时df.groupby('Date').groups不提供任何顺序保证;在你的例子中grouped.groups.keys()dates因此,avg当您将它们分开时,您将失去一致性和对应关系groupby

如果您想使用datetime对象和简单的 numpy 数组(与 pandas 系列相反),您可以执行以下操作,以使顺序一致:

>>> 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
于 2014-08-23T17:02:52.900 回答
0

avg系列将以正确顺序的时间戳作为索引,并且可以像这样直接传递给散景绘图函数。

line(avg.index, avg, line_color="grey", line_width=8, line_join="round")
asterisk(avg.index, avg, line_color="black", size=15)
于 2014-08-23T16:58:13.203 回答