我有以下pd df时间序列,其中有收盘价,用于确定何时平仓(1)或平仓(-1),头寸大小以及总计(大小*平仓)的过滤器):
Date Close Filter O_Size O_Tot
1/5/2018 15.85 1 74 1172.9
1/8/2018 16.50 0
...
2/14/2018 16.49 0
2/15/2018 16.03 -1
...
当Filter的值为-1时,我想创建一个新列C_Tot = Close * O_Size,当它不是NaN时采用先前的size值。
Date Close Filter O_Size O_Tot C_Tot
1/5/2018 15.85 1 74 1172.9
1/8/2018 16.50 0
...
2/14/2018 16.49 0
2/15/2018 16.03 -1 1186.22
...
我想知道我是否可以不进行循环操作。
欢呼
答案 0 :(得分:0)
我使用您在此提供的有限数据创建了此文件。使用此文件之前,请将所有空单元格都放入nan。
import pandas as pd
import numpy as np
v=[["1/5/2018",15.85 , 1, 74 , 1172.9],
["1/8/2018",16.50 ,0 ,np.nan,np.nan],
["2/14/2018" , 16.49, 0 ,np.nan,np.nan] ,
["2/15/2018", 16.03, -1 ,np.nan,np.nan]]
df=pd.DataFrame(v,columns=["Date","Close","Filter","O_Size","O_Tot"])
tmp = df[df.Filter==-1]
def func(x):
spl = df.iloc[:x.name,:]
val = spl.iloc[spl["O_Size"].last_valid_index()].O_Size*x.Close
return val
tmp["C_Tot"] = tmp.apply(func,axis=1)
res = pd.concat([df,tmp["C_Tot"]],axis=1)
输出
Date Close Filter O_Size O_Tot C_Tot
0 1/5/2018 15.85 1 74.0 1172.9 NaN
1 1/8/2018 16.50 0 NaN NaN NaN
2 2/14/2018 16.49 0 NaN NaN NaN
3 2/15/2018 16.03 -1 NaN NaN 1186.22