我正在努力做到以下几点: 假设如下:
id, date, value
1, 2017-01-01, 0.245
1, 2017-01-02, 0.445
1, 2017-01-03, 0.235
...
1, 2017-02-01, 0.148
1, 2017-02-02, 0.985
1, 2017-02-03, 0.785
...
1, 2017-03-01, 0.258
1, 2017-03-02, 0.158
1, 2017-03-03, 0.157
...
1, 2017-04-01, 0.7758
1, 2017-04-02, 0.458
1, 2017-04-03, 0.357
...
我试图计算一个新的价值观(让它命名为'outval')的基础上,同一天的值x个月前乘以乘数。(如果前一天是周末,则使用上周五)
下面的代码似乎可以工作,但有点慢。你知道吗
weight_vector = [1,2,3]
ds['outval'] = np.nan
for row in ds.itertuples():
d_vals = [row.date - pd.DateOffset(months = i) for i in weight_vector]
d_vals = [x - pd.DateOffset(days = 2) if x.dayofweek == 6 else x for x in d_vals]
d_vals = [x - pd.DateOffset(days = 1) if x.dayofweek == 5 else x for x in d_vals]
df = ds.loc[ds['date'].isin(d_vals)]
if not df.empty and df.shape[0] == len(weight_vector):
ds['outval'].loc[row.Index] = (weight_vector * df['value']).sum()
一个想法是添加带有x个月前同一天的值的列 i、 e
id, date, value,value-1, value-2, value-3
1, 2017-01-01, 0.245, nan, nan, nan
1, 2017-01-02, 0.445, nan, nan, nan
1, 2017-01-03, 0.235, nan, nan, nan
...
1, 2017-02-01, 0.148, 0.245, nan, nan
1, 2017-02-02, 0.985, 0.445, nan, nan
1, 2017-02-03, 0.785, 0.235, nan, nan
...
1, 2017-03-01, 0.258, 0.148, 0.245, nan
1, 2017-03-02, 0.158, 0.985, 0.445, nan
1, 2017-03-03, 0.157, 0.785, 0.235, nan
...
1, 2017-04-01, 0.7758, 0.258, 0.148, 0.245
1, 2017-04-02, 0.458, 0.158, 0.985, 0.445
1, 2017-04-03, 0.357, 0.157, 0.785, 0.235
...
然后把这些列(或类似的东西)相加/相乘
ds['outval'] = ds['value-1'] * weight_vector[0] + ds['value-2'] * weight_vector[1] + ds['value-3'] * weight_vector[2] +
但是我在创建新列时遇到了问题(shift无法工作,因为可能会丢失日期)
关于如何做到这一点有什么想法,或者有没有其他提高绩效的建议?你知道吗
谢谢!你知道吗
您可以执行以下几个步骤:
使用
apply
创建包含正确日期的过去日期列(同一天x个月前,而不是周末)。我们把它们叫做a
、b
和c
。例如:将
date
列转换为索引列a
、b
和c
相关的值(fast)outval
相关问题 更多 >
编程相关推荐