Ускоренный цикл Python, выполняемый строками и элементами в каждой строке - PullRequest
0 голосов
/ 15 мая 2018

У меня есть фрейм данных, содержащий даты в виде строк и столбцов в виде $ инвестиций в каждую акцию в определенный день («ndate»).Кроме того, у меня есть Серия («portT»), содержащая сумму общих инвестиций во все акции за каждую дату (размер серии: len (ndate) * 1).Вот код, который вычисляет вес каждой акции / каждой даты путем деления каждого элемента каждой строки ndate на сумму этого дня:

(l,w)=port1.shape  
for i in range(0,l):      
    port1.iloc[i]=np.divide(ndate.iloc[i],portT.iloc[i])

Код работает очень медленно, пожалуйста, дайте мне знатькак я могу изменить и ускорить это?Я пытался сделать это с помощью векторизации, но безуспешно.

1 Ответ

0 голосов
/ 15 мая 2018

, поскольку это просто простое деление двух фреймов данных одинаковой формы (или вы можете сформулировать его как таковой), вы можете использовать простой / -оператор, pandas выполнит его поэлементно (возможно, с репликацией, если фигуры не не подходит, так что будьте уверены в этом):

import pandas as pd
df1 = pd.DataFrame([[1,2], [3,4]])
df2 = pd.DataFrame([[2,2], [3,3]])
df_new = df1 / df2
#>>> pd.DataFrame([[0.5, 1.],[1., 1.3]])

это, скорее всего, внутреннее выполнение тех же операций, которые вы указали в своем примере, однако внутренние назначения и проверки обходятся, что должно дать вам некоторую скорость

EDIT: Я ошибся в плане вашей проблемы; может быть, в следующий раз добавим минимальный автономный код Тем не менее / -оператор также работает для Dataframes и Series в комбинации:

import pandas as pd
df = pd.DataFrame([[1,2], [3,4]])
s = pd.Series([1,2])
new_df = df / s
#>>> pd.DataFrame([[1., 3.],[1., 2]])
...