У меня проблема с циклом foor, который включает в себя кадры данных - PullRequest
0 голосов
/ 05 июля 2019

У меня есть датафрейм с 8 столбцами.Если два из этих столбцов удовлетворяют условию, я должен заполнить два столбца произведением двух других.И после запуска алгоритма он не работает.

Я пытался использовать серии, я пытался использовать предупреждения импорта warnings.filterwarnings("ignore"), но он не работает

for i in seq:

     if dataframefinal['trade'][i] == 1 and dataframefinal['z'][i] > 0:

         dataframefinal['CloseAdj2'][i]= dataframefinal['Close2'][i] * 
         dataframefinal['trancosshort'][i]
         dataframefinal['CloseAdj1'][i]= dataframefinal['Close1'][i] * 
         dataframefinal['trancostlong'][i]

    elif dataframefinal['trade'][i] == 1 and dataframefinal['z'][i] < 0:
        dataframefinal['CloseAdj2'][i]= dataframefinal['Close1'][i] * 
        dataframefinal['trancosshort'][i]
        dataframefinal['CloseAdj1'][i]= dataframefinal['Close2'][i] * 
        dataframefinal['trancostlong'][i]

    else:
        dataframefinal['CloseAdj1'][i]= dataframefinal['Close1'][i]
        dataframefinal['CloseAdj2'][i]= dataframefinal['Close2'][i]

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете использовать векторную функцию условия numpy.select(), чтобы сделать это быстро:

import pandas as pd
from numpy.random import randn, randint

n = 10
df_data = pd.DataFrame(dict(trade=randint(0, 2, n), 
                       z=randn(n), 
                       Close1=randn(n), 
                       Close2=randn(n), 
                       trancosshort=randn(n), 
                       trancostlong=randn(n)))

df_data["CloseAdj1"] = 0
df_data["CloseAdj2"] = 0

seq = [1, 3, 5, 7, 9]

df = df_data.loc[seq]

cond1 = df.eval("trade==1 and z > 0")
cond2 = df.eval("trade==2 and z < 0")

df["CloseAdj2"] = np.select([cond1, cond2], 
          [df.eval("Close2 * trancosshort"), 
           df.eval("Close1 * trancosshort")], df.Close2)

df["CloseAdj1"] = np.select([cond1, cond2], 
          [df.eval("Close1 * trancostlong"), 
           df.eval("Close2 * trancostlong")], df.Close1)

df_data.loc[seq, ["CloseAdj1", "CloseAdj2"]] = df[["CloseAdj1", "CloseAdj2"]]
...