Python 3.x 熊猫数据帧:保持最佳行组合

Python 3.x 熊猫数据帧:保持最佳行组合,python-3.x,numpy,pandas,optimization,dataframe,Python 3.x,Numpy,Pandas,Optimization,Dataframe,这是我关于StackOverflow的第一篇文章,我会尽量简洁 问题 我有600个电池单元,需要保留418个(共38组,每组11个)。每个电池都有一个内阻和一个容量。电池测试X次(药膏=X) 考虑到这些限制因素,需要组建小组: 同一组内细胞(11)的内阻方差应为可能的最低值 组的总容量(电池容量总和)应尽可能接近彼此 所有这些,同时保持最好的电池(最好的电池具有最低的内阻和最高的容量 但我们可以关注第一个约束,因为它是最重要的 要处理的数据 给定一个包含电池芯循环结果的文件: salve 1

这是我关于StackOverflow的第一篇文章,我会尽量简洁

问题 我有600个电池单元,需要保留418个(共38组,每组11个)。每个电池都有一个内阻和一个容量。电池测试X次(药膏=X)

考虑到这些限制因素,需要组建小组:

  • 同一组内细胞(11)的内阻方差应为可能的最低值
  • 组的总容量(电池容量总和)应尽可能接近彼此
  • 所有这些,同时保持最好的电池(最好的电池具有最低的内阻和最高的容量
但我们可以关注第一个约束,因为它是最重要的

要处理的数据 给定一个包含电池芯循环结果的文件:

salve 1:cellule 1:intRes 50:capacite 3338
salve 1:cellule 2:intRes 47:capacite 3277
...
salve 9:cellule 599:intRes 55:capacite 3267
salve 9:cellule 600:intRes 35:capacite 3487
我解析了所有必要的数据,并将它们放在一个数据框中(尽管我相信有更好的方法):

然后,我计算了每个电池(药膏1、药膏2,…)的平均性能:

并保持418的最高容量:

final=final.sort_values('Capacity', ascending=False)
final['index'] = range(1, len(final) + 1)
final = final[final['index'] < 418]
我现在遇到了麻烦。我曾想过使用itertools.combines()和numpy.var()来获得最佳组合,但我很难将其用于整个数据帧的行(例如:不仅是final['InternalRes'])来跟踪单元格。此外,由于这会产生很多可能性,因此处理速度很慢

简而言之,我试图在itertools.combines的每组“InternalRes”元素上使用.var(),并得到38个独立组(无复制单元格)。我完全弄错了吗

for group in itertools.combinations(final['InternalRes']):
    #calculate variance of group's InternalRes
    #keep best group
我发现这和我的问题有点关系

目前,脚本效率不是大问题,只要它能完成任务,但将是一个+

我是python的初学者,请原谅我所做的一切愚蠢的事情(但我仍然想从中学习!)


提前感谢!

您的问题的约束条件可能无法同时满足。这有点像要求拥有

  • 高度的变化越小越好
  • 年龄越近越好
  • 同时保持球员最少的失误和最高的投篮命中率
您需要某种方法将高度的变化与高度的变化结合起来 将失误和投篮命中率之和转换为a 单一值。然后您可以明智地尝试最小化该值

结合各种属性的公式可能包括确认相对重要性的权重。该公式可能有争议,但如果没有客观公式,则问题无法回答

如果我们只关注你的第一个标准

  • 同一组内电池(11)的内阻变化应尽可能低
然后,您只需按
InternalRes
对行进行排序,然后将行分割为38个连续的组。这样做再好不过了,因为将任意两个值交换到不同的组会增加这两个组的内部方差,因为每个值都比b值更远离组的平均值以前




请注意,如果删除每个组大小相同的要求,则答案是使用。和具有用于执行kmeans群集的函数。

有一个用于“groupby”操作的“var”方法。看看这是否符合要求。@ako是的,我确信它可能有用,问题是itertools.combinations()从数据文件中的数据中创建元组(我也失去了跟踪哪个单元的电阻的能力)。事实上,我认为你对排序和砍掉这38个组是正确的。我没有意识到这一点。如果我们考虑其他约束,它肯定会使事情复杂化,但我想现在就可以了。多谢!
final=final.sort_values('Capacity', ascending=False)
final['index'] = range(1, len(final) + 1)
final = final[final['index'] < 418]
         InternalRes     Capacity  index
Cellule                                 
469        43.000000  3436.111111      1
29         45.888889  3429.555556      2
...
558        55.888889  3335.555556    416
59         42.888889  3335.333333    417
[417 rows x 3 columns]
for group in itertools.combinations(final['InternalRes']):
    #calculate variance of group's InternalRes
    #keep best group
import numpy as np
import pandas as pd

np.random.seed(2016)
N = 600
result = pd.DataFrame(
    {'Cellule': np.arange(N),
     'InternalRes': np.random.uniform(30, 60, size=N),
     'Capacity': np.random.uniform(3000, 4000, size=N)})

final = result.groupby('Cellule')['InternalRes','Capacity'].mean()
final = final.sort_values('Capacity', ascending=False)
final = final.iloc[:418]

final = final.sort_values('InternalRes')
groups = [final.iloc[i:i+11] for i in range(0, 418, 11)]