2017-01-29 2 views
0

Когда я выполняю код ниже, он выполняет условие «else», даже если выполнено условие «if». НапримерPandas: блок «if» не выполняется.

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

Он удовлетворяет "если" состояние блока (то есть)

DAX_Logic < 1 *(value is 0.99968132240039786)* 

Однако "если" блок никогда не будет выполнена. Пожалуйста помогите

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']) 

Я попытался использовать следующий фрагмент кода и ниже фрагмент выполняется только «Если» блок и никогда не «еще» блок ... немного смущен, что я делаю не так в выше и ниже кода. (Они производят совершенно противоположные результаты)

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']) 
+0

Вы говорите, что 'DAX_Logic <1 * (значение +0,99968132240039786) * ', но оператор if читает' if DAX_Logic.any() <1: ', возможно, DAX_Logic.any() возвращает другое значение, чем DAX_Logic. – Alex

+0

Эти булевские выражения работают только внутри 'DAX [DAX ['Low'] <1]' или с .ix или подобным, но не нормальным, если. – YOU

ответ

0

в настоящее время вы работаете общее назначение питон с for и if вместо операций векторизованных панд, таких как условно создание столбцов (т.е. серии) по логической индексации с другой серией.

Рассмотрим первое добавление DAX_Logic и DAX_Logic_1 в качестве новых столбцов в DAX dataframe инлайн с другими строками, что позволяет использовать 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 к автономному вне столбца dataframe, просто присвоить его, так как каждый столбец в панд dataframe серия панды:

Daily_Return = DAX['Daily_Return'] 
+0

Спасибо @Parfait. Это отличное решение и идеально. – user2560244

Смежные вопросы