我在包含多个ID的时间序列数据集的已排序数据集df_pre_decay
上执行以下操作,并且我希望以不同的速率衰减每个ID的tactic
变量(来自tactic_decay_dict
)。你知道吗
为衰减的策略变量“xyz
”创建的变量将与第一个mnth中的策略变量具有相同的值,而对于所有其他mnth,它将是((前一个mnth中衰减的策略变量“xyz
”的值)乘以速率)和((当前mnth中策略变量“tractic”的值)乘以(1速率)的加法)你知道吗
time_col = 'mnth'
tactic =['overall_details','speaker_total','overall_samples_eu','copay_redemption_count','voucher_redemption_count','dtc']
tactic_decay_dict = dict.fromkeys(tactic,(60,70))
uniq = len(df_pre_decay[time_col].unique())
## Loops for variables and decay rate
for a in tactic_decay_dict:
for b in tactic_decay_dict[a]:
xyz = a+'_s'+str(b)
## Loops for iterating over each row in the dataset
for i in range(len(df_pre_decay)):
df_pre_decay[xyz] = np.where((i%uniq)!=0,
(df_pre_decay[xyz].iloc[i-1])*b/100+
(df_pre_decay[a].iloc[i])*(100-b)/100,
df_pre_decay[a].iloc[i])
我想优化这段代码,因为在我的数据集中500多万行需要30多分钟。你知道吗
编辑:请查找数据集的样本
ID mnth overall_details speaker_total overall_samples_eu copay_redemption_count voucher_redemption_count dtc
1 201701 3 1 10 9 3 6
1 201702 6 1 0 7 7 10
1 201703 10 8 7 8 9 10
1 201704 3 9 3 0 1 1
1 201705 9 0 8 9 6 4
1 201706 8 3 2 10 8 9
1 201707 3 10 3 0 5 6
1 201708 2 10 3 9 6 2
1 201709 1 3 7 10 8 0
1 201710 3 8 2 8 0 10
1 201711 6 7 4 8 5 6
1 201712 3 8 2 9 4 10
2 201701 7 4 7 4 10 2
2 201702 10 0 2 2 10 5
2 201703 10 6 4 10 5 3
2 201704 4 3 6 4 0 8
2 201705 7 8 9 10 6 10
2 201706 8 0 2 7 1 8
2 201707 10 2 8 1 9 4
2 201708 10 6 7 0 3 5
2 201709 10 10 3 8 9 0
2 201710 2 0 3 5 5 8
2 201711 1 8 0 7 3 4
2 201712 8 5 1 0 7 9
3 201701 2 2 7 7 1 2
3 201702 2 8 10 9 6 9
3 201703 10 5 8 5 9 4
3 201704 6 1 2 4 6 2
3 201705 6 9 4 4 3 0
3 201706 5 1 6 4 1 7
3 201707 0 7 6 9 5 6
3 201708 10 3 2 0 4 5
3 201709 5 8 6 4 10 4
3 201710 8 3 10 6 7 0
3 201711 7 5 6 3 1 10
3 201712 3 9 8 4 10 0
我认为您的代码不会按预期工作,因为您在循环的每一轮中都有效地将整个列
df_pre_decay[xyz]
设置为一个值。您需要或者循环遍历数据帧的每一行(for i in range(len(df_pre_decay))
),或者将列视为向量(正如np.where
和其他numpy函数所做的那样),但是您将两者混为一谈。矢量化方法通常要快得多。你知道吗对于非矢量化版本,将列
xyz
设置为与列a
相同,然后循环遍历行,在需要时设置累积值。你知道吗或者另一个版本-不确定哪一个会更快:
要进行矢量化,可以使用^{} 将列拆分为块,并对每个块应用累积衰减函数。你知道吗
另一种方法是在不同的id之间插入具有空值的空行。然后可以对整个列应用单个累积函数:
相关问题 更多 >
编程相关推荐