我正在尝试将我的代码从R重写为Python。我很难重写一些涉及group_by
,arrange
和mutate
的代码。我在Python中尝试过transform
和apply
,但没有成功。
在R中,我的代码如下所示:
S1 = S1 %>% group_by(ID) %>% arrange(Date) %>% mutate(New_Factor = ifelse(r_type == 5, (1+(Price/Last_Price)), Old_Factor/lag(Old_Factor)))
但是,我很难用Python重写此代码。到目前为止,这是我想出的:
s1['New_Factor'] = s1.groupby(['ID'],group_keys=False).apply(lambda g: (1+(Price/Last_Price)) if g.type == 5 else (Old_Factor/lag_value))
其中lag_value
定义为:
lag_value = s1['Old_Factor'].shift(1)
我得到的错误是:
The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
我还想知道.tranform()
是否是解决此问题的更好方法?请让我知道-我的代码转换可能会做很多。
答案 0 :(得分:0)
这是你想要的吗?
>>> from datar.all import f, tibble, group_by, arrange, mutate, if_else, lag
>>>
>>> S1 = tibble(
... ID=[1,1,2,2],
... Date=["1/1/2021", "1/1/1997", "3/3/2020", "12/1/2020"],
... Price=[3.23, 1.23, 5.33, 9.88],
... Last_Price=[1.22,2.21,3.21,2.11],
... Old_Factor=[3,4,5,6],
... r_type=[5,5,6,6]
... )
>>>
>>> S1 >> group_by(f.ID) >> arrange(f.Date) >> mutate(
... New_Factor=if_else(
... f.r_type==5,
... 1+f.Price/f.Last_Price,
... f.Old_Factor/lag(f.Old_Factor)
... )
... )
ID Date Price Last_Price Old_Factor r_type New_Factor
<int64> <object> <float64> <float64> <int64> <int64> <float64>
0 1 1/1/1997 1.23 2.21 4 5 1.556561
1 1 1/1/2021 3.23 1.22 3 5 3.647541
2 2 12/1/2020 9.88 2.11 6 6 NaN
3 2 3/3/2020 5.33 3.21 5 6 0.833333
[Groups: ID (n=2)]
我是 datar
包的作者。如果您有任何问题,请随时提交问题。