为什么Pandas .loc只改变了一行?

2024-04-26 19:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

              Open     High      Low    Close       Volume         MA  Status  Portfolio
Date
1958-03-12    42.41    42.41    42.41    42.41    2688889.0    41.3016     1.0      100.0
1958-03-13    42.46    42.46    42.46    42.46    3144444.0    41.3442     1.0        NaN
1958-03-14    42.33    42.33    42.33    42.33    2388889.0    41.3734     1.0        NaN
1958-03-17    42.04    42.04    42.04    42.04    2366667.0    41.4006     1.0        NaN
1958-03-18    41.89    41.89    41.89    41.89    2300000.0    41.4184     1.0        NaN
1958-03-19    42.09    42.09    42.09    42.09    2677778.0    41.4404     1.0        NaN
1958-03-20    42.11    42.11    42.11    42.11    2533333.0    41.4676     1.0        NaN
1958-03-21    42.42    42.42    42.42    42.42    2700000.0    41.5086     1.0        NaN
1958-03-24    42.58    42.58    42.58    42.58    2866667.0    41.5504     1.0        NaN

如果“状态”等于1,我想将“投资组合”列计算为前一天的价值加上当天的回报。我有这样一句话:

spx_daily.loc['1958-03-13':].loc[spx_daily['Status'] == 1, 'Portfolio'] = ((spx_daily.Close / spx_daily.Close.shift(1))) * spx_daily.Portfolio.shift(1)

但是,当我运行代码时,输出是这样的:

                   Open     High      Low    Close       Volume         MA  Status   Portfolio
Date
1958-03-12    42.41    42.41    42.41    42.41    2688889.0    41.3016     1.0  100.000000
1958-03-13    42.46    42.46    42.46    42.46    3144444.0    41.3442     1.0  100.117897
1958-03-14    42.33    42.33    42.33    42.33    2388889.0    41.3734     1.0         NaN
1958-03-17    42.04    42.04    42.04    42.04    2366667.0    41.4006     1.0         NaN
1958-03-18    41.89    41.89    41.89    41.89    2300000.0    41.4184     1.0         NaN
1958-03-19    42.09    42.09    42.09    42.09    2677778.0    41.4404     1.0         NaN
1958-03-20    42.11    42.11    42.11    42.11    2533333.0    41.4676     1.0         NaN
1958-03-21    42.42    42.42    42.42    42.42    2700000.0    41.5086     1.0         NaN
1958-03-24    42.58    42.58    42.58    42.58    2866667.0    41.5504     1.0         NaN

只计算了第一行。这是因为操作“一次完成”并且剩余的行被检测为nan吗?你知道吗

我应该如何解决这个问题,同时避免对行进行迭代?你知道吗


Tags: 数据closedateshiftstatusopennanloc
1条回答
网友
1楼 · 发布于 2024-04-26 19:15:45

使用^{}+^{}

df['Portfolio']=df['Portfolio'].fillna( (df['Close']/df['Close'].shift()).mask(df.Status.ne(1),1) )
df['Portfolio']=df['Portfolio'].cumprod()
print(df)
             Open   High    Low  Close     Volume       MA  Status   Portfolio
Date                                                                          
1958-03-12  42.41  42.41  42.41  42.41  2688889.0  41.3016     1.0  100.000000
1958-03-13  42.46  42.46  42.46  42.46  3144444.0  41.3442     1.0  100.117897
1958-03-14  42.33  42.33  42.33  42.33  2388889.0  41.3734     1.0   99.811365
1958-03-17  42.04  42.04  42.04  42.04  2366667.0  41.4006     1.0   99.127564
1958-03-18  41.89  41.89  41.89  41.89  2300000.0  41.4184     1.0   98.773874
1958-03-19  42.09  42.09  42.09  42.09  2677778.0  41.4404     1.0   99.245461
1958-03-20  42.11  42.11  42.11  42.11  2533333.0  41.4676     1.0   99.292620
1958-03-21  42.42  42.42  42.42  42.42  2700000.0  41.5086     1.0  100.023579
1958-03-24  42.58  42.58  42.58  42.58  2866667.0  41.5504     1.0  100.400849

我每天都用df代替spx\u。 我只是想让你明白这个想法


检查状态==0的单行:

df.iloc[4,6]=0
print(df)
             Open   High    Low  Close     Volume       MA  Status  Portfolio
Date                                                                         
1958-03-12  42.41  42.41  42.41  42.41  2688889.0  41.3016     1.0      100.0
1958-03-13  42.46  42.46  42.46  42.46  3144444.0  41.3442     1.0        NaN
1958-03-14  42.33  42.33  42.33  42.33  2388889.0  41.3734     1.0        NaN
1958-03-17  42.04  42.04  42.04  42.04  2366667.0  41.4006     1.0        NaN
1958-03-18  41.89  41.89  41.89  41.89  2300000.0  41.4184     0.0        NaN
1958-03-19  42.09  42.09  42.09  42.09  2677778.0  41.4404     1.0        NaN
1958-03-20  42.11  42.11  42.11  42.11  2533333.0  41.4676     1.0        NaN
1958-03-21  42.42  42.42  42.42  42.42  2700000.0  41.5086     1.0        NaN
1958-03-24  42.58  42.58  42.58  42.58  2866667.0  41.5504     1.0        NaN

df['Portfolio']=df['Portfolio'].fillna( (df['Close']/df['Close'].shift()).mask(df.Status.ne(1),1) )
df['Portfolio']=df['Portfolio'].cumprod()
print(df)
                 Open   High    Low  Close     Volume       MA  Status   Portfolio
Date                                                                          
1958-03-12  42.41  42.41  42.41  42.41  2688889.0  41.3016     1.0  100.000000
1958-03-13  42.46  42.46  42.46  42.46  3144444.0  41.3442     1.0  100.117897
1958-03-14  42.33  42.33  42.33  42.33  2388889.0  41.3734     1.0   99.811365
1958-03-17  42.04  42.04  42.04  42.04  2366667.0  41.4006     1.0   99.127564
1958-03-18  41.89  41.89  41.89  41.89  2300000.0  41.4184     0.0   99.127564
1958-03-19  42.09  42.09  42.09  42.09  2677778.0  41.4404     1.0   99.600840
1958-03-20  42.11  42.11  42.11  42.11  2533333.0  41.4676     1.0   99.648167
1958-03-21  42.42  42.42  42.42  42.42  2700000.0  41.5086     1.0  100.381744
1958-03-24  42.58  42.58  42.58  42.58  2866667.0  41.5504     1.0  100.760365

相关问题 更多 >