0

I have a dataframe with 8 columnds. If two of those columns satisfy a condition, I have to fill two columns with the product of other two. And after running the algorithm it is not working.

I have tryed to use series, I have tryed to use import warnings warnings.filterwarnings("ignore") but it is not working

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]
  • what's `seq`? Also [related](https://stackoverflow.com/questions/13611065/efficient-way-to-apply-multiple-filters-to-pandas-dataframe-or-series/13616382#13616382). – Quang Hoang Jul 05 '19 at 02:43

1 Answers1

0

You can use vectorized condition function numpy.select() to do this quickly:

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"]]
HYRY
  • 94,853
  • 25
  • 187
  • 187