动态更改变量名称,评估和填充字典
Changing variable names dynamically, evaluating and populating a dictionary
我用pyomo
和gurobi
来解决优化问题。现在我有 5 个变量,它们的名称类似于 model.str
,其中 str
可以是 [x, y, z, w, s]
。我想用这些字符串中的每一个替换 str
并对其进行 20 次迭代评估。例如,我需要 model.x[1]
、model.x[2]
等值。
我使用了以下代码,它不是很好但几乎得到了我的结果:
dict = {}
var_names = ["x", "y", "z", "w", "s"]
for i in var_names:
for t in model.T:
var_name = "model." + str(i) + "[" + str(t) + "]"
dict[var_name] = pe.value(eval(var_name))
这段代码的结果是:
{'model.x1': 5000.0, 'model.x[2]': 5000.0, 'model.x[3]': 6000.0,
'model.x[4]': 7000.0, 'model.x[5]': 8000.0, 'model.x[6]': 9000.0,
'model.x[7]': 10000.0, 'model.x[8]': 11000.0, 'model.x[9]': 12000.0,
'model.x[10]': 13000.0, 'model.x[11]': 14000.0, 'model.x[12]':
15000.0, 'model.x[13]': 16000.0, 'model.x[14]': 17000.0, 'model.x[15]': 18000.0, 'model.x[16]': 19000.0, 'model.x[17]':
20000.0, 'model.x[18]': 21000.0, 'model.x[19]': 21000.0, 'model.x[20]': 21000.0, 'model.y1': 0.0, 'model.y[2]': 0.0,
'model.y[3]': 0.0, 'model.y[4]': 0.0, 'model.y[5]': 0.0, 'model.y[6]':
0.0, 'model.y[7]': 0.0, 'model.y[8]': 0.0, 'model.y[9]': 0.0, 'model.y[10]': 0.0, 'model.y[11]': 0.0, 'model.y[12]': 0.0,
'model.y[13]': 0.0, 'model.y[14]': 0.0, 'model.y[15]': 0.0,
'model.y[16]': 0.0, 'model.y[17]': 0.0, 'model.y[18]': 0.0,
'model.y[19]': 0.0, 'model.y[20]': 0.0, 'model.z1': 0.0,
'model.z[2]': 0.0, 'model.z[3]': 1000.0, 'model.z[4]': 1000.0,
'model.z[5]': 1000.0, 'model.z[6]': 1000.0, 'model.z[7]': 1000.0,
'model.z[8]': 1000.0, 'model.z[9]': 1000.0, 'model.z[10]': 1000.0,
'model.z[11]': 1000.0, 'model.z[12]': 1000.0, 'model.z[13]': 1000.0,
'model.z[14]': 1000.0, 'model.z[15]': 1000.0, 'model.z[16]': 1000.0,
'model.z[17]': 1000.0, 'model.z[18]': 1000.0, 'model.z[19]': 0.0,
'model.z[20]': 0.0, 'model.w1': 4000.0, 'model.w[2]': 5000.0,
'model.w[3]': 6000.0, 'model.w[4]': 7000.0, 'model.w[5]': 8000.0,
'model.w[6]': 9000.0, 'model.w[7]': 10000.0, 'model.w[8]': 11000.0,
'model.w[9]': 12000.0, 'model.w[10]': 13000.0, 'model.w[11]': 14000.0,
'model.w[12]': 15000.0, 'model.w[13]': 16000.0, 'model.w[14]':
17000.0, 'model.w[15]': 18000.0, 'model.w[16]': 19000.0, 'model.w[17]': 20000.0, 'model.w[18]': 21000.0, 'model.w[19]':
21000.0, 'model.w[20]': 21000.0, 'model.s1': 0.0, 'model.s[2]': 0.0, 'model.s[3]': 0.0, 'model.s[4]': 0.0, 'model.s[5]': 0.0, 'model.s[6]':
0.0, 'model.s[7]': 0.0, 'model.s[8]': 0.0, 'model.s[9]': 0.0, 'model.s[10]': 0.0, 'model.s[11]': 0.0, 'model.s[12]': 0.0,
'model.s[13]': 0.0, 'model.s[14]': 0.0, 'model.s[15]': 0.0,
'model.s[16]': 0.0, 'model.s[17]': 0.0, 'model.s[18]': 0.0,
'model.s[19]': 1000.0, 'model.s[20]': 2000.0}
但是我需要的是为字典键 x
放置每个 model.x[i]
值,这样我就有了一个包含 x
、y
、[=25 的字典=]、w
、s
作为键,它们的值作为列表中的值,例如最后创建一个 pandas
数据框。
我确信有更好的方法,因为在每次迭代中创建变量名不是很有效,而且我对 Python 还很陌生。如有必要,为了清楚起见,我还可以提供其余代码,因此如果我需要提供更多详细信息,请告诉我。
在此先感谢您的帮助。
更新解决方案
在收到亲爱的 Matthew 的一些重要提示后,我想到了以下解决方案:
var_names = ["x", "y", "z", "w", "s"]
dict = {}
for i in var_names:
var_name = f"model.{i}"
for t in model.T:
var = f"model.{i}[{t}]"
if str(var_name) in dict:
dict[str(var_name)].append(pe.value(eval(var)))
else :
dict[str(var_name)] = [pe.value(eval(var))]
import pandas as pd
df = pd.DataFrame(dict)
print(df)
输出:
model.x model.y model.z model.w model.s
0 5000.0 0.0 0.0 4000.0 0.0
1 5000.0 0.0 0.0 5000.0 0.0
2 6000.0 0.0 1000.0 6000.0 0.0
3 7000.0 0.0 1000.0 7000.0 0.0
4 8000.0 0.0 1000.0 8000.0 0.0
5 9000.0 0.0 1000.0 9000.0 0.0
6 10000.0 0.0 1000.0 10000.0 0.0
7 11000.0 0.0 1000.0 11000.0 0.0
8 12000.0 0.0 1000.0 12000.0 0.0
9 13000.0 0.0 1000.0 13000.0 0.0
10 14000.0 0.0 1000.0 14000.0 0.0
11 15000.0 0.0 1000.0 15000.0 0.0
12 16000.0 0.0 1000.0 16000.0 0.0
13 17000.0 0.0 1000.0 17000.0 0.0
14 18000.0 0.0 1000.0 18000.0 0.0
15 19000.0 0.0 1000.0 19000.0 0.0
16 20000.0 0.0 1000.0 20000.0 0.0
17 21000.0 0.0 1000.0 21000.0 0.0
18 21000.0 0.0 0.0 21000.0 1000.0
19 21000.0 0.0 0.0 21000.0 2000.0
我不得不在无法访问 model.T
和 pe.value(eval(var_name))
的情况下即兴发挥,但我认为这接近您想要的。我使用 f-string 来清理你的 var_name
语法。接下来,我们使用 .get() 检查键是否已经在 the_dict
中,并根据需要扩展或追加。否则,我们创建一个新密钥。最后,我们可以将 the_dict
传递给 DataFrame 构造函数。
如果这对您不起作用,post 发表评论,我会提供帮助,直到它起作用为止。为 model.T
提供示例列表将大有帮助。
import random
import pandas as pd
the_dict = {}
var_names = ["x", "y", "z", "w", "s"]
model_t = [1, 2, 3, 1, 2, 3, 1, 2, 3]
for i in var_names:
for t in model_t:
var_name = f"model.{i}[{t}]"
if the_dict.get(var_name, False):
if isinstance(var_name, list):
the_dict[var_name].extend(random.randint(3, 9))
else:
the_dict[var_name].append(random.randint(3, 9))
else:
the_dict[var_name] = [random.randint(3, 9)]
the_dict 输出:
{'model.x[1]': [3, 8, 5],
'model.x[2]': [8, 3, 9],
'model.x[3]': [9, 6, 7],
'model.y[1]': [7, 4, 5],
'model.y[2]': [3, 6, 6],
'model.y[3]': [6, 7, 4],
'model.z[1]': [6, 9, 9],
'model.z[2]': [8, 8, 7],
'model.z[3]': [7, 4, 5],
'model.w[1]': [4, 9, 3],
'model.w[2]': [5, 9, 5],
'model.w[3]': [4, 9, 5],
'model.s[1]': [4, 8, 5],
'model.s[2]': [7, 6, 7],
'model.s[3]': [9, 5, 8]}
现在让我们制作一个pandas df.
df = pd.DataFrame(the_dict)
df 输出:
model.x[1] model.x[2] model.x[3] model.y[1] model.y[2] model.y[3]...
0 3 8 9 7 3 6
1 8 3 6 4 6 7
2 5 9 7 5 6 4
我用pyomo
和gurobi
来解决优化问题。现在我有 5 个变量,它们的名称类似于 model.str
,其中 str
可以是 [x, y, z, w, s]
。我想用这些字符串中的每一个替换 str
并对其进行 20 次迭代评估。例如,我需要 model.x[1]
、model.x[2]
等值。
我使用了以下代码,它不是很好但几乎得到了我的结果:
dict = {}
var_names = ["x", "y", "z", "w", "s"]
for i in var_names:
for t in model.T:
var_name = "model." + str(i) + "[" + str(t) + "]"
dict[var_name] = pe.value(eval(var_name))
这段代码的结果是:
{'model.x1': 5000.0, 'model.x[2]': 5000.0, 'model.x[3]': 6000.0, 'model.x[4]': 7000.0, 'model.x[5]': 8000.0, 'model.x[6]': 9000.0, 'model.x[7]': 10000.0, 'model.x[8]': 11000.0, 'model.x[9]': 12000.0, 'model.x[10]': 13000.0, 'model.x[11]': 14000.0, 'model.x[12]': 15000.0, 'model.x[13]': 16000.0, 'model.x[14]': 17000.0, 'model.x[15]': 18000.0, 'model.x[16]': 19000.0, 'model.x[17]': 20000.0, 'model.x[18]': 21000.0, 'model.x[19]': 21000.0, 'model.x[20]': 21000.0, 'model.y1': 0.0, 'model.y[2]': 0.0, 'model.y[3]': 0.0, 'model.y[4]': 0.0, 'model.y[5]': 0.0, 'model.y[6]': 0.0, 'model.y[7]': 0.0, 'model.y[8]': 0.0, 'model.y[9]': 0.0, 'model.y[10]': 0.0, 'model.y[11]': 0.0, 'model.y[12]': 0.0, 'model.y[13]': 0.0, 'model.y[14]': 0.0, 'model.y[15]': 0.0, 'model.y[16]': 0.0, 'model.y[17]': 0.0, 'model.y[18]': 0.0, 'model.y[19]': 0.0, 'model.y[20]': 0.0, 'model.z1': 0.0, 'model.z[2]': 0.0, 'model.z[3]': 1000.0, 'model.z[4]': 1000.0, 'model.z[5]': 1000.0, 'model.z[6]': 1000.0, 'model.z[7]': 1000.0, 'model.z[8]': 1000.0, 'model.z[9]': 1000.0, 'model.z[10]': 1000.0, 'model.z[11]': 1000.0, 'model.z[12]': 1000.0, 'model.z[13]': 1000.0, 'model.z[14]': 1000.0, 'model.z[15]': 1000.0, 'model.z[16]': 1000.0, 'model.z[17]': 1000.0, 'model.z[18]': 1000.0, 'model.z[19]': 0.0, 'model.z[20]': 0.0, 'model.w1': 4000.0, 'model.w[2]': 5000.0, 'model.w[3]': 6000.0, 'model.w[4]': 7000.0, 'model.w[5]': 8000.0, 'model.w[6]': 9000.0, 'model.w[7]': 10000.0, 'model.w[8]': 11000.0, 'model.w[9]': 12000.0, 'model.w[10]': 13000.0, 'model.w[11]': 14000.0, 'model.w[12]': 15000.0, 'model.w[13]': 16000.0, 'model.w[14]': 17000.0, 'model.w[15]': 18000.0, 'model.w[16]': 19000.0, 'model.w[17]': 20000.0, 'model.w[18]': 21000.0, 'model.w[19]': 21000.0, 'model.w[20]': 21000.0, 'model.s1': 0.0, 'model.s[2]': 0.0, 'model.s[3]': 0.0, 'model.s[4]': 0.0, 'model.s[5]': 0.0, 'model.s[6]': 0.0, 'model.s[7]': 0.0, 'model.s[8]': 0.0, 'model.s[9]': 0.0, 'model.s[10]': 0.0, 'model.s[11]': 0.0, 'model.s[12]': 0.0, 'model.s[13]': 0.0, 'model.s[14]': 0.0, 'model.s[15]': 0.0, 'model.s[16]': 0.0, 'model.s[17]': 0.0, 'model.s[18]': 0.0, 'model.s[19]': 1000.0, 'model.s[20]': 2000.0}
但是我需要的是为字典键 x
放置每个 model.x[i]
值,这样我就有了一个包含 x
、y
、[=25 的字典=]、w
、s
作为键,它们的值作为列表中的值,例如最后创建一个 pandas
数据框。
我确信有更好的方法,因为在每次迭代中创建变量名不是很有效,而且我对 Python 还很陌生。如有必要,为了清楚起见,我还可以提供其余代码,因此如果我需要提供更多详细信息,请告诉我。
在此先感谢您的帮助。
更新解决方案 在收到亲爱的 Matthew 的一些重要提示后,我想到了以下解决方案:
var_names = ["x", "y", "z", "w", "s"]
dict = {}
for i in var_names:
var_name = f"model.{i}"
for t in model.T:
var = f"model.{i}[{t}]"
if str(var_name) in dict:
dict[str(var_name)].append(pe.value(eval(var)))
else :
dict[str(var_name)] = [pe.value(eval(var))]
import pandas as pd
df = pd.DataFrame(dict)
print(df)
输出:
model.x model.y model.z model.w model.s
0 5000.0 0.0 0.0 4000.0 0.0
1 5000.0 0.0 0.0 5000.0 0.0
2 6000.0 0.0 1000.0 6000.0 0.0
3 7000.0 0.0 1000.0 7000.0 0.0
4 8000.0 0.0 1000.0 8000.0 0.0
5 9000.0 0.0 1000.0 9000.0 0.0
6 10000.0 0.0 1000.0 10000.0 0.0
7 11000.0 0.0 1000.0 11000.0 0.0
8 12000.0 0.0 1000.0 12000.0 0.0
9 13000.0 0.0 1000.0 13000.0 0.0
10 14000.0 0.0 1000.0 14000.0 0.0
11 15000.0 0.0 1000.0 15000.0 0.0
12 16000.0 0.0 1000.0 16000.0 0.0
13 17000.0 0.0 1000.0 17000.0 0.0
14 18000.0 0.0 1000.0 18000.0 0.0
15 19000.0 0.0 1000.0 19000.0 0.0
16 20000.0 0.0 1000.0 20000.0 0.0
17 21000.0 0.0 1000.0 21000.0 0.0
18 21000.0 0.0 0.0 21000.0 1000.0
19 21000.0 0.0 0.0 21000.0 2000.0
我不得不在无法访问 model.T
和 pe.value(eval(var_name))
的情况下即兴发挥,但我认为这接近您想要的。我使用 f-string 来清理你的 var_name
语法。接下来,我们使用 .get() 检查键是否已经在 the_dict
中,并根据需要扩展或追加。否则,我们创建一个新密钥。最后,我们可以将 the_dict
传递给 DataFrame 构造函数。
如果这对您不起作用,post 发表评论,我会提供帮助,直到它起作用为止。为 model.T
提供示例列表将大有帮助。
import random
import pandas as pd
the_dict = {}
var_names = ["x", "y", "z", "w", "s"]
model_t = [1, 2, 3, 1, 2, 3, 1, 2, 3]
for i in var_names:
for t in model_t:
var_name = f"model.{i}[{t}]"
if the_dict.get(var_name, False):
if isinstance(var_name, list):
the_dict[var_name].extend(random.randint(3, 9))
else:
the_dict[var_name].append(random.randint(3, 9))
else:
the_dict[var_name] = [random.randint(3, 9)]
the_dict 输出:
{'model.x[1]': [3, 8, 5],
'model.x[2]': [8, 3, 9],
'model.x[3]': [9, 6, 7],
'model.y[1]': [7, 4, 5],
'model.y[2]': [3, 6, 6],
'model.y[3]': [6, 7, 4],
'model.z[1]': [6, 9, 9],
'model.z[2]': [8, 8, 7],
'model.z[3]': [7, 4, 5],
'model.w[1]': [4, 9, 3],
'model.w[2]': [5, 9, 5],
'model.w[3]': [4, 9, 5],
'model.s[1]': [4, 8, 5],
'model.s[2]': [7, 6, 7],
'model.s[3]': [9, 5, 8]}
现在让我们制作一个pandas df.
df = pd.DataFrame(the_dict)
df 输出:
model.x[1] model.x[2] model.x[3] model.y[1] model.y[2] model.y[3]...
0 3 8 9 7 3 6
1 8 3 6 4 6 7
2 5 9 7 5 6 4