Могу ли я векторизовать операцию информационного кадра, когда входные данные для операции изменяются после определения каждого значения информационного кадра? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть два кадра данных: один заполняется (назовите это «A»), а другой - со справочными данными (назовите это «B»).У меня есть случайный процесс, который пытается извлечь имя из B и вставить его в A на основе определенных ограничений.Представьте, что B имеет такую ​​структуру столбца: (имя) (данные) ... (данные) (использует оставшиеся)

«Использует оставшиеся» означает, сколько раз я могу использовать имя в кадре данных A.

Для заданного местоположения в кадре данных A процесс находит максимальное значение в столбце «использует оставшиеся» в B с учетом некоторых ограничений, которые извлекают информацию как из A, так и из B (поэтому он не всегда вытягиваетабсолютный максимум).Когда определяется максимум, имя (первый столбец) в B для этой строки максимума переносится в конкретное место в кадре данных A. После этого число 1 вычитается из значения «использует оставшееся» для этого имени в B (т.е., вы использовали имя, так что у вас осталось еще одно, которое будет использоваться в будущем).

Затем процесс повторяется для каждого значения в столбце в DF A. Всего в A есть 9 столбцов для выполненияэта операция на.Число строк варьируется, но находится где-то между 20 и 150.

Вопрос: я вынужден использовать цикл для этого процесса, или есть способ векторизации?Причина, по которой я не могу представить работу векторизации, заключается в том, что я по существу применяю различные ограничения к функции для каждого местоположения в кадре данных A, и эти ограничения меняются в зависимости от предыдущего значения в A. Хотя я хотел бы, чтобы мне сказали, что я ошибаюсь!

Я абстрагирую это, а не дословно копирую / вставляю.Происходит еще несколько вещей, но это соответствующая последовательность.Для данной строки, которая должна быть заполнена в кадре данных A, код выглядит примерно так:

#loop
  for i in range(len(A)):
  #determine max value in B - this part is vectorized
  maxrow_in_B = B['constraints using info from both A and B'][uses\ 
       remaining].idxmax()

  #populate location in dataframe A using name from B
  A.loc[i,column] = B.loc[maxrow_in_B,name]

  #update B
  B.loc[max,uses remaining] -= 1

Цикл работает, но для его запуска требуется несколько секунд.Я хотел бы сократить это, поскольку я буду в конечном счете использовать это в моделировании Монте-Карло, и экономия времени увеличится.Я знаю, что мне нужно конвертировать в iterrows, но я не понимаю, как я мог бы использовать векторизацию или даже функцию .apply ().Мысли оценили.Я попробовал версию этого алгоритма, которая обновляет «оставшиеся количества использований» только после заполнения всего столбца, но не обеспечивает нужную мне точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...