我正在尝试执行以下操作: 我们假设以下df:
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个月前的同一天添加包含值的列 即。
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] +
但是我在创建新列时遇到了问题(由于可能会丢失日期,因此转换不起作用)
关于如何做到这一点的任何想法,或任何其他提高绩效的建议?
谢谢!
答案 0 :(得分:1)
您可以执行以下几个步骤:
使用apply
创建过去日期列,其中包含正确的日期(前一个x个月,而不是周末)。我们称他们为a
,b
和c
。例如:
from datetime import date
df = [{"date": date(2018, 1, 2), "value": 1}, {"date": date(2018, 2, 5), "value": 3}]
df = pd.DataFrame(df)
from functools import partial
def get_date(cur_date, n_month_back):
dt = cur_date - pd.DateOffset(months=n_month_back)
dt -= pd.DateOffset(days=max(0, dt.dayofweek - 4))
return dt
df["a"] = df["date"].apply(partial(get_date, n_month_back=1))
将date
列转换为索引列
a
,b
和c
outval