熊猫:“if”块没有被执行

时间:2017-01-29 11:02:48

标签: python pandas dataframe yahoo-finance

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

   public function setUser($id){
    $user = PersonalUser::findOrFail($id);
     if($user->approved == 0 && $user->business_user_id != NULL){
        $user->approved = 0;
        $user->business_user_id = NULL;
        $user->save();
    }
 }

满足“if”阻止条件(即)

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

然而,“if”块永远不会被执行。请协助

 DAX_Logic < 1 *(value is 0.99968132240039786)*

我尝试使用下面一段代码,下面的部分只执行“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) 
if DAX_Logic.any() < 1:
    Daily_Return = 100*(DAX['Low']-DAX['Open'])
else:
    Daily_Return = (-100)*(DAX['Close']-DAX['Open'])  

1 个答案:

答案 0 :(得分:0)

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

首先考虑将 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']