Pandas: "if" 块没有被执行

Pandas: "if" block does not get executed

当我执行下面的代码时,即使 "if" 条件满足,它也只执行 "else" 子句。 例如

 Date   05/01/2006
 Open   5521.86
 Low    5502.25 
 Close.shift(1) 5523.620117

满足"if"出块条件(即)

 DAX_Logic < 1 *(value is 0.99968132240039786)*

但是 "if" 块永远不会执行。请协助

DAX=pd.io.data.DataReader("^GDAXI","yahoo",start,end)
DAX_Logic= DAX['Open'].fillna(1) / DAX['Close'].shift(1).fillna(1)
DAX_Logic_1=  DAX['Low'].fillna(1) / DAX['Open'].fillna(1) 
if DAX_Logic.any() < 1:
    Daily_Return = 100*(DAX['Low']-DAX['Open'])
else:
    Daily_Return = (-100)*(DAX['Close']-DAX['Open'])  

我尝试使用下面的代码,下面的代码只执行 "If" 块,从不执行 "else" 块...有点混淆我在上面和下面的代码中做错了什么。(它们产生完全相反的结果)

DAX=pd.io.data.DataReader("^GDAXI","yahoo",start,end)
DAX_Logic= DAX['Open'].fillna(1) / DAX['Close'].shift(1).fillna(1)
DAX_Logic_1=  DAX['Low'].fillna(1) / DAX['Open'].fillna(1) 
for i in DAX_Logic.index[:]:
    if (DAX_Logic[i] < 1):
        Daily_Return = 100*(DAX['Low']-DAX['Open'])
    else:
        Daily_Return = (-100)*(DAX['Close']-DAX['Open'])  

目前,您是 运行 通用 python 用 forif 代替向量化 pandas 操作,例如有条件地创建列(即, series) 通过与另一个系列的逻辑索引。

考虑先将 DAX_LogicDAX_Logic_1 添加为 DAX 中的新列 数据框与其他行内联,允许您使用 loc 创建 Daily_Return 列:

DAX = pd.io.data.DataReader("^GDAXI","yahoo",start,end)
# NEW COLUMNS (NOT SEPARATE SERIES)
DAX['DAX_Logic'] = DAX['Open'].fillna(1) / DAX['Close'].shift(1).fillna(1)
DAX['DAX_Logic_1'] = DAX['Low'].fillna(1) / DAX['Open'].fillna(1)

# DAILY RETURN
DAX.loc[DAX['DAX_Logic'] > 1, 'Daily_Return'] = 100*(DAX['Low']-DAX['Open'])
DAX.loc[DAX['DAX_Logic'] <= 1, 'Daily_Return'] = (-100)*(DAX['Close']-DAX['Open'])

或者,使用 numpy 的 np.where() 进行矢量化 if/else 计算:

import numpy as np

DAX['Daily_Return'] = np.where(DAX['DAX_Logic'] > 1, 100*(DAX['Low']-DAX['Open']), (-100)*(DAX['Close']-DAX['Open']))

如果您希望 Daily_Return 在数据框列之外独立,只需分配它,因为 pandas 数据框中的每一列都是 pandas系列:

Daily_Return = DAX['Daily_Return']