熊猫根据不同的时间窗口计算特征

时间:2016-07-10 13:28:53

标签: python-2.7 pandas

我有以下数据框:例如:

TXN_ID                 TXN_DATE      TXN_TYPE
8C083F30C0674A72    01/01/2013 00:00    A
B610D7D4E2D14513    01/01/2013 00:00    B
698C5DD423AC42D6    02/01/2013 00:00    C
37E2B21583F949CA    12/01/2013 00:00    A
9FE25A547F964E93    13/01/2013 00:00    B
F6C14D987D584E53    14/01/2013 00:00    A

对于每一行,我想添加3个功能 - 在同一天,过去3天内计算不同的TXN_TYPE&在过去一周。 所以数据框看起来像:

TXN_ID                TXN_DATE      TXN_TYPE Distinct_Type_1Day   Distinct_Type_3Day    Distinct_Type_7Day
8C083F30C0674A72    01/01/2013 00:00    A           2                  2                 2
B610D7D4E2D14513    01/01/2013 00:00    B           2                  2                 2
698C5DD423AC42D6    02/01/2013 00:00    C           1                  3                 3
37E2B21583F949CA    12/01/2013 00:00    A           1                  1                 1
9FE25A547F964E93    13/01/2013 00:00    B           1                  2                 2
F6C14D987D584E53    14/01/2013 00:00    A           1                  2                 2

什么是最好的&有效的方法吗?

1 个答案:

答案 0 :(得分:0)

这将完成工作,但我使用了我不喜欢的apply

def comp_dates(x):
    d = 'TXN_DATE'
    date = x[d]
    d1 = date - pd.offsets.Day(1)
    d3 = date - pd.offsets.Day(3)
    d7 = date - pd.offsets.Day(7)
    cond0 = df[d] <= date
    cond1 = df[d] > d1
    cond3 = df[d] > d3
    cond7 = df[d] > d7
    s = pd.Series([
            len(df[cond0 & cond1].TXN_TYPE.unique()),
            len(df[cond0 & cond3].TXN_TYPE.unique()),
            len(df[cond0 & cond7].TXN_TYPE.unique()),
        ], ['Distinct_Type_1Day', 'Distinct_Type_3Day', 'Distinct_Type_7Day'])
    return s

pd.concat([df, df.apply(comp_dates, axis=1)], axis=1)

enter image description here

设置

我使用此代码创建数据框

text = """TXN_ID                 TXN_DATE      TXN_TYPE
8C083F30C0674A72    01/01/2013 00:00    A
B610D7D4E2D14513    01/01/2013 00:00    B
698C5DD423AC42D6    01/02/2013 00:00    C
37E2B21583F949CA    01/12/2013 00:00    A
9FE25A547F964E93    01/13/2013 00:00    B
F6C14D987D584E53    01/14/2013 00:00    A"""

df = pd.read_csv(StringIO(text), delimiter='\s{2,}', parse_dates=[1], engine='python')