Как использовать более быстрый l oop, чем iterrows для следующего кода? - PullRequest
1 голос
/ 18 марта 2020

У меня есть функция, которая вычисляет возврат цен на срезе кадра данных return_df и отдельный l oop, который снова вычисляет стандартные отклонения на нарезанном кадре данных. Я могу запустить оба и вычислить результат прямо сейчас с помощью метода iterrows. Я пытался применить функцию, чтобы ускорить ее и даже читать о вандеризации pandas / numpy, но вместо этого я получаю nan значения. Есть ли способ запустить этот код быстрее? Любая помощь приветствуется.

#sigma calculation function
def sigma_calculation(sample_trade):

    trade_index = sample_trade.index[0]
    sample_return_lst=[]
    eurusd_return_lst=[]
    for i, row in return_df[trade_index-28:trade_index:1].iterrows():
        sample_return_lst.append(return_df.iloc[i,0] * sample_trade.iloc[0,1])
        eurusd_return_lst.append(return_df.iloc[i,1] * sample_trade.iloc[0,1])

    stats_df = pd.DataFrame(
    {'Asset Total Return'       : sample_return_lst,
     'Reference Total Return'   : eurusd_return_lst
     })  

    sigma_trade = stats_df['Asset Total Return'].std()
    sigma_eurusd = stats_df['Reference Total Return'].std()

    d_lev = sigma_trade/sigma_eurusd

    return d_lev

#running the sigma_calculation function for 45 rows from the return_df dataframe and creating a separate df from it
d_lev_lst = []
for i, row in return_df[4433::1].iterrows():
    d_lev_lst.append(sigma_calculation(return_df.iloc[[i]]))

d_lev_df = pd.DataFrame({'D-Leverage' : d_lev_lst})

Это то, что я пробовал для второй части (запуск sigma_calculation для 45 строк):

d_lev_df = pd.DataFrame(
    {'D-Leverage'   : return_df['Asset Return'].iloc[4433::1].apply(lambda row: sigma_calculation(return_df.iloc[[row]])),
    })
...