在平均匹配条件下找到最大的数据子集

时间:2019-02-26 21:46:39

标签: python optimization weighted-average

我正在尝试查找特定数据集的最大子集总和,其中数据集中的字段平均值与预定条件匹配。

例如,假设我有一个人的体重(下面的示例),而我的目标是找到最大的总重量,从而得出的组的平均体重在200到201磅之间。

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

使用上述方法,平均体重在200磅和201磅之间的最大重量之和来自1、2和3人。它们的重量之和为601,而它们之间的平均重量为200.3。

除了蛮力外,是否有办法对上述内容进行编程,最好使用python?我什至不知道从哪里开始进行研究,因此不胜感激任何帮助或指导。

2 个答案:

答案 0 :(得分:1)

为方便起见,首先将所需范围转换为0。尽管中点也是一个不错的选择,但我将转换为下界。

这将使您的数据集为[10, 1, -10, 20, -12]。设置的总和为9;您需要将其设置在0upper_bound * len(data)范围内。

这给您“目标总和”问题的一个明显的变化:找到满足总和约束的列表子集。在这种情况下,您有两种解决方案:[10, 1, -10][10, 1, -12]。您可以通过增强常规目标和问题以包括变化的总和来发现这一点:“剩余金额”将包括平均值计算中的变化。

你能从那里结束吗?

答案 1 :(得分:0)

有很多方法可以做到这一点,但是熊猫是你的朋友。

=INDEX(A:E,AGGREGATE(15,3,(($A$4:$A$11>=N3)/($A$4:$A$11>=N3))*ROW($A$4:$A$11),1),AGGREGATE(15,3,(($B$3:$J$3>=M3)/($B$3:$J$3>=M3))*COLUMN($B$3:$J$3),1))

在这种情况下,我们根据权重创建一个数据框。然后,我们每3个权重取滚动平均值。由此我们可以得出200到201磅之间的最大平均值。

输出:

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()
相关问题