为多条消息绘制视图/单击流

时间:2016-12-19 16:47:27

标签: python pandas matplotlib plot

我有一些信息,其中包含有关多条消息的观看次数和点击次数的日期。我想用几小时来绘制视图和点击次数。

我已将数据强制转换为此类DataFrame:

sl = pd.DataFrame({'index':sendlog.index,
               'idMessage': sendlog['idMessage'], 
               'View': pd.to_datetime(sendlog['dtFirstView']).apply(lambda x: x.replace(minute=0, second=0)), 
               'Click': pd.to_datetime(sendlog['dtFirstClick']).apply(lambda x: x.replace(minute=0, second=0))},
               columns=('idMessage', 'View', 'Click')
)

sl.head(5)显示:

    idMessage   View            Click
0   728403  2016-12-12 05:00:00 NaT
1   728403  2016-12-12 02:00:00 NaT
2   727895  2016-12-12 15:00:00 NaT
3   727918  2016-11-30 09:00:00 2016-11-30 09:00:00
4   727895  2016-11-30 12:00:00 NaT

某些消息未被点击 - 有NaT个值。

我想看到每个小时都有直方图的情节,每个小时都有一些观看次数和点击次数。

Here's一个类似的问题,但它仅在一个维度上进行分组。

如果我将它们分组并计算每个组的大小,我就无法将它们绘制为,因为我得到了一个numpy.int64对象。

如何更好地策划这些事情?

1 个答案:

答案 0 :(得分:1)

这是一种做法

sl_ = sl.set_index('idMessage')
cliks = sl_.Click.dropna()
# I want the Timestamps in the index so I can use pd.TimeGrouper
cliks = pd.Series(cliks.index.values, cliks.values)
views = sl_.View.dropna()
# I want the Timestamps in the index so I can use pd.TimeGrouper
views = pd.Series(views.index.values, views.values)

view_count = views.groupby([pd.TimeGrouper('H'), views]).count().rename('View')
clik_count = cliks.groupby([pd.TimeGrouper('H'), cliks]).count().rename('Click')

pd.concat([view_count, clik_count], axis=1).query('View >= 1 and Click >= 1')

enter image description here