如何重新采样折线图的状态变化数据?

时间:2014-07-30 04:25:41

标签: pandas

我试图解析bugzilla数据以创建错误状态更改图表。我已经设置了模拟dataframe。我尝试使用:

df = df.set_index('bug_when')
df.resample('1D',how='count')
上面的

给出了每天的错误总数。我想我可以根据添加的内容设置新的数据框 df.loc [df ['添加'] =='新'] 并使用.resample,但是我不知道如何管理已删除的条目以及自前一天以来没有变化的条目。

我真的很感激,如果有人能告诉我我需要采取哪些步骤来处理我的数据帧,所以它看起来像这样。

1998-11-01 : { 'NEW' : [1] }
1998-11-02 : { 'NEW' : [1,2] }
1998-11-03 : { 'NEW' : [2], 'CLOSED': [1] }
1998-11-04 : { 'NEW' : [3], 'CLOSED': [1,2] }
1998-11-05 : { 'NEW' : [], 'CLOSED': [1,2,3] }

我可以在pandas中执行此操作,还是需要创建循环?

非常感谢

1 个答案:

答案 0 :(得分:1)

创建一个每个单元格都是dict对象的系列并不是很有用。你可以做一张桌子 它显示了每天每个错误的状态,这里是代码:

import pandas as pd
from pandas.tslib import Timestamp
from pandas import DataFrame

data = [
{u'bug_id': 1, u'bug_when': Timestamp('1998-11-01 21:56:09'), u'removed': '', u'added': 'NEW'},
{u'bug_id': 2, u'bug_when': Timestamp('1998-11-02 14:20:17'), u'removed': '', u'added': 'NEW'},
{u'bug_id': 1, u'bug_when': Timestamp('1998-11-03 22:02:25'), u'removed': u'NEW', u'added': u'CLOSED'},
{u'bug_id': 3, u'bug_when': Timestamp('1998-11-04 10:02:01'), u'removed': u'', u'added': u'NEW'},
{u'bug_id': 2, u'bug_when': Timestamp('1998-11-04 10:02:02'), u'removed': u'NEW', u'added': u'CLOSED'},
{u'bug_id': 3, u'bug_when': Timestamp('1998-11-05 15:03:21'), u'removed': u'NEW', u'added': u'CLOSED'},
{u'bug_id': 4, u'bug_when': Timestamp('1998-11-05 16:03:21'), u'removed': u'NEW', u'added': u'NEW'},
{u'bug_id': 4, u'bug_when': Timestamp('1998-11-05 17:03:21'), u'removed': u'NEW', u'added': u'CLOSED'}
]

df = DataFrame(data=data, columns=['bug_id','bug_when','removed','added'])
df.set_index("bug_when", inplace=True)

如果您只想要每天打开错误计数:

count = df.added.map({"NEW":1, "CLOSED":-1}).cumsum().resample("D", how="last")
print count

输出:

bug_when
1998-11-01    1
1998-11-02    2
1998-11-03    1
1998-11-04    1
1998-11-05    0
Freq: D, Name: added, dtype: int64

如果你想为每个bug找一张表:

def f(s):
    s = s.resample("D", fill_method="ffill")
    s[:-1] = 1
    s[-1] = 0
    return s

df.groupby("bug_id")["bug_id"].apply(f).unstack(0).ffill()

输出:

bug_id      1   2   3   4
bug_when                 
1998-11-01  1 NaN NaN NaN
1998-11-02  1   1 NaN NaN
1998-11-03  0   1 NaN NaN
1998-11-04  0   0   1 NaN
1998-11-05  0   0   0   0

1表示错误在日期打开,0表示错误在日期关闭,NaN表示错误在日期不存在。