Python 2.7 熊猫根据不同的时间窗口计算特征
例如,我有以下数据框:Python 2.7 熊猫根据不同的时间窗口计算特征,python-2.7,pandas,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/0
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_类型。
因此,数据帧看起来像:
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
这样做的最佳和有效方式是什么?这样可以完成工作,但我不喜欢使用
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)
测量1天、3天和7天的参考时间是多少?是否要对帧中每个记录的TXN_日期执行此操作?是的,对于每个记录,请查看TXN_日期,1day指同一日期的所有交易,从过去3天开始的3天,等等。在00:00'dd/mm/YYYY 00:00'谢谢,每天只有一个时间戳。我得到一个TypeError:TypeError:(+:'Day'和'str'的不支持的操作数类型,u'发生在索引0上”)@Menkes我更新了我的帖子,以显示我是如何生成测试数据帧的。问题是因为日期列是字符串。您需要将其设置为日期列。我告诉pd.read\u csv第1列应该被解析为日期。您还可以执行
df.TXN_DATE=pd.to_datetime(df.TXN_DATE)
@Menkes同样,这是一个很好的例子,可以证明您自己提供的代码产生您正在使用的数据的有用性。当您复制和粘贴文本时,数据类型会混淆。非常感谢它的工作!假设我现在有另一个列,叫做STOCK_ID,我想计算每个特定STOCK_ID的日期窗口的不同类型,所以只有当在1天的时间窗口中每个特定STOCK_ID有两种交易类型时,不同的值才会是2,我是否需要添加另一个条件,即它等于STOCK_ID?
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')