Pandas基于不同时间窗口计算特征。

3
我有一个数据框,例如:

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天和过去1周内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、从哪个参考时间开始测量1、3和7天? 2、您是否想在框架中为每个记录的TXN_DATE执行此操作? - paisanco
对于每个记录,请查看TXN_DATE,1天表示来自同一日期的所有交易,3天表示过去3天的所有交易等。每天只有一个时间戳在00:00 'dd/mm/YYYY 00:00'。 - Menkes
1个回答

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

谢谢。我遇到了一个 TypeError 错误:TypeError: ("unsupported operand type(s) for +: 'Day' and 'str'", u'occurred at index 0')。 - Menkes
@Menkes 我更新了我的帖子,展示了如何生成测试数据框。问题是因为你的日期列是一个字符串。你需要将它变成一个日期列。我通过告诉 pd.read_csv 列1应该被解析为日期来实现这一点。你也可以使用 df.TXN_DATE = pd.to_datetime(df.TXN_DATE) - piRSquared
@Menkes,此外,这是一个很好的例子,可以展示提供自己的代码以生成您正在使用的数据的有用性。当您复制和粘贴文本时,数据类型会混淆。 - piRSquared
非常感谢,它有效了!假设现在我有另一列名为STOCK_ID - 我想要计算特定stock_id的日期窗口内不同类型的数量 - 因此,仅当在1天的时间窗口内特定的stock_id有2种交易类型时,不同的值将为2 - 我只需添加另一个条件,即它等于STOCK_ID吗? - Menkes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接