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 用 for
和 if
代替向量化 pandas 操作,例如有条件地创建列(即, series) 通过与另一个系列的逻辑索引。
考虑先将 DAX_Logic 和 DAX_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']
当我执行下面的代码时,即使 "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 用 for
和 if
代替向量化 pandas 操作,例如有条件地创建列(即, series) 通过与另一个系列的逻辑索引。
考虑先将 DAX_Logic 和 DAX_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']