【问题标题】:Finding Largest Subset of Data where Average Matches Criteria查找平均匹配标准的最大数据子集
【发布时间】:2019-02-26 21:46:38
【问题描述】:

我试图找到特定数据集的最大子集总和,其中数据集中某个字段的平均值符合预定标准。

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

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

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

除了蛮力之外,有没有办法编写一些东西来完成上述操作,最好使用python?我什至不知道从哪里开始研究这个,所以感谢任何帮助或指导。

【问题讨论】:

    标签: python optimization weighted-average


    【解决方案1】:

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

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

    这为您提供了“目标总和”问题的易处理变体:找到满足总和约束的列表子集。在这种情况下,您有两个解决方案:[10, 1, -10][10, 1, -12]。您可以通过增强惯常的目标和问题以包括变化的总和来发现这一点:“剩余数量”将包括均值计算的变化。

    你能从那里完成吗?

    【讨论】:

    • 谢谢,这更接近我正在寻找的东西。我想我可以用这个来工作。谢谢!
    【解决方案2】:

    有很多方法可以做到这一点,但 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
    

    【讨论】:

    • 这只会找到子序列,而不是子集。此外,我们正在尝试确定最大的此类子序列,这需要将 3 参数从 df 大小迭代到 1,直到找到解决方案。
    • 在问题中没有限制 3 或窗口。如果我理解正确,改组输入会产生相同的结果
    • 是的,我读错了,如果用例有帮助,请留下:)
    • 感谢您的回复 - 我同意 cmets 但我感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2017-07-24
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多