Оптимизация сложной функции с использованием фрейма данных - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь использовать Python Bashopping , чтобы оптимизировать (максимизировать) сложную функцию, которая получает свои значения из переменных в кадре данных.Я новичок в методах оптимизации, поэтому прошу прощения, если я покажу это слишком много.Я искал, и самая близкая вещь выглядит как это .Позвольте мне создать игрушку для описания проблемы.Предположим следующее:

df = pd.DataFrame({"A":range(1,14), "B":range(5,18), "ID": 
[1,1,2,2,2,2,3,3,3,4,5,6,7],"C":[0,0,10,0,0,16,0,0,22,1,1,1,1], "last": 
[0,1,0,0,0,1,0,0,1,1,1,1,1], 
"Value": [19.25,8,91.6,71.05,45.85,16,104.95,65.8,22,24,13,28,15], "Z": 
[0,1,0,0,0,0,0,0,1,1,0,1,0]})

Самая сложная часть (на мой взгляд) - это дизайн целевой функции.Вот как.

  • Случай, когда идентификаторы не повторяются (в данном случае идентификаторы 4,5,6,7)
    • Если столбец Z = 1, тоцелевой функцией является просто сумма (A, B)
    • Если столбец Z = 0, то целевой функцией является просто 0,5 * сумма (A, B)
  • Случайгде идентификаторы повторяются (в данном случае 1,2,3)
    • Если last = 1, то целевой функцией является просто сумма (A, B)
    • Если last = 0, тоЦелевая функция рекурсивно строится на последней строке каждого идентификатора.Общая формула для целевой функции: (предыдущий C) + (3 * ток A) + (1,65 * ток B).Ключ должен знать, что значение этого случая ЗАВИСИТ от ПРЕДЫДУЩИХ значений.Если бы значения были сделаны в Excel, это выглядело бы так: F4 = "F5 + (3 * A4) + (1.65 * B4)", F5 = "F6 + (3 * A5) + (1.65 * B5)", F6 =«F7 + (3 * A6) + (1,65 * B6)», F7 = «A7 + B7».Очевидно, что существует некоторая зависимость / рекурсивность
      • Кроме того, значения 3 и 1,65 являются параметрами, которые должны быть переданы в оптимизатор.Фактически, они могут быть столбцами в наборе данных, что означает, что их значения меняются в каждой строке

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

Это то, что я делал ранее: разделите набор данных на две части: те, которые имеют повторяющиеся идентификаторы, и те, которые не имеютповторяющиеся идентификаторы.Для тех, кто повторяется, используйте оператор if для вычисления значения целевой функции.

Для тех с повторяющимися идентификаторами создайте переменную, которая идентифицирует последнее наблюдение для каждого идентификатора, а затем вычислите значения снизу вверх«.Затем я добавляю два набора данных.Тем не менее, это приводит к моей главной борьбе: целевая функция не «целая», а скорее «изменчивая», основанная на наборе данных.

Я надеюсь, что смогу помочь с этим.Спасибо

...