我正在尝试查找特定数据集的最大子集总和,其中数据集中的字段平均值与预定条件匹配。
例如,假设我有一个人的体重(下面的示例),而我的目标是找到最大的总重量,从而得出的组的平均体重在200到201磅之间。
使用上述方法,平均体重在200磅和201磅之间的最大重量之和来自1、2和3人。它们的重量之和为601,而它们之间的平均重量为200.3。
除了蛮力外,是否有办法对上述内容进行编程,最好使用python?我什至不知道从哪里开始进行研究,因此不胜感激任何帮助或指导。
答案 0 :(得分:1)
为方便起见,首先将所需范围转换为0。尽管中点也是一个不错的选择,但我将转换为下界。
这将使您的数据集为[10, 1, -10, 20, -12]
。设置的总和为9;您需要将其设置在0
至upper_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()