Python 3.x 熊猫数据帧:保持最佳行组合
这是我关于StackOverflow的第一篇文章,我会尽量简洁 问题 我有600个电池单元,需要保留418个(共38组,每组11个)。每个电池都有一个内阻和一个容量。电池测试X次(药膏=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
- 同一组内细胞(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的初学者,请原谅我所做的一切愚蠢的事情(但我仍然想从中学习!)
提前感谢!您的问题的约束条件可能无法同时满足。这有点像要求拥有
- 高度的变化越小越好
- 年龄越近越好
- 同时保持球员最少的失误和最高的投篮命中率
- 同一组内电池(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)]