Нахождение наибольшего подмножества данных, где среднее соответствует критериям - PullRequest
0 голосов
/ 27 февраля 2019

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

Например, скажем, у меня есть веса людей (примерниже), и моя цель - найти наибольший общий вес, где средний вес полученной группы составляет от 200 до 201 фунтов.

  1. 210
  2. 201
  3. 190
  4. 220
  5. 188

Используя вышеизложенное, наибольшая сумма весов, где средний вес составляет от 200 до 201 фунтов, приходится на лиц 1, 2,и 3. Сумма их весов составляет 601, а средний вес между ними составляет 200,3.

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Начните с перевода желаемого диапазона в 0, просто для удобства.Я переведу на нижнюю границу, хотя средняя точка также является хорошим выбором.

Это делает ваш набор данных [10, 1, -10, 20, -12].Установленная сумма 9;вам нужно, чтобы он находился в диапазоне от 0 до upper_bound * len(data).

. Это дает вам вариабельный вариант решения проблемы "целевой суммы": найдите подмножество списка, которое удовлетворяет ограничению суммы.В этом случае у вас есть два решения: [10, 1, -10] и [10, 1, -12].Вы можете найти это, расширив обычные задачи целевой суммы, включив в нее изменяющуюся сумму: «оставшаяся сумма» будет включать в себя изменение от вычисления среднего.

Можете ли вы оттуда закончить?

0 голосов
/ 27 февраля 2019

Есть много способов сделать это, но Pandas - ваш друг.

import pandas as pd

df = pd.DataFrame({'weight':[209, 203, 190, 220, 188, 193]})
df = df.rolling(3).mean()
df.query('200 <= weight <= 201').max()

В этом случае мы создаем фрейм данных из наших весов.Затем мы берем скользящее среднее значение каждые 3 веса.Из этого мы получаем максимальное среднее значение между 200 и 201 фунтами.

вывод:

weight    200.666667
dtype: float64
...