列上的Python / Pandas / PuLP优化

问题描述

我正在尝试优化Pandas数据框中的数据列。我浏览了过去的文章,但找不到解决数据框列中优化值问题的文章。这是我的第一篇文章,相对于编码来说还比较新,因此在此道歉。下面是我正在使用的代码

  File "/home/pie3636/project/main.py",line 28,in __init__
    embeddings = CustomEmbeddings(name,**params)
  File "/home/pie3636/project/custom_embeddings.py",line 35,in __init__
    trainer.train('model',mini_batch_size=mini_batch_size,max_epochs=10,train_with_dev=train_with_dev)
  File "/usr/local/lib/python3.6/dist-packages/flair/trainers/trainer.py",line 371,in train
    loss = self.model.forward_loss(batch_step)
  File "/usr/local/lib/python3.6/dist-packages/flair/models/sequence_tagger_model.py",line 603,in forward_loss
    features = self.forward(data_points)
  File "/usr/local/lib/python3.6/dist-packages/flair/models/sequence_tagger_model.py",line 608,in forward
    self.embeddings.embed(sentences)
  File "/usr/local/lib/python3.6/dist-packages/flair/embeddings/base.py",line 60,in embed
    self._add_embeddings_internal(sentences)
  File "/usr/local/lib/python3.6/dist-packages/flair/embeddings/token.py",line 610,in _add_embeddings_internal
    text_sentences,start_marker,end_marker,self.chars_per_chunk
  File "/usr/local/lib/python3.6/dist-packages/flair/models/language_model.py",line 157,in get_representation
    _,rnn_output,hidden = self.forward(batch,hidden)
  File "/usr/local/lib/python3.6/dist-packages/flair/models/language_model.py",line 80,in forward
    output,hidden = self.rnn(emb,hidden)
  File "/home/m.meloux/.local/lib/python3.6/site-packages/torch/nn/modules/module.py",line 726,in _call_impl
    hook_result = hook(self,input,result)
  File "/home/m.meloux/.local/lib/python3.6/site-packages/torch/quantization/quantize.py",line 74,in _observer_forward_hook
    return self.activation_post_process(output)
  File "/home/m.meloux/.local/lib/python3.6/site-packages/torch/nn/modules/module.py",line 722,in _call_impl
    result = self.forward(*input,**kwargs)
  File "/home/m.meloux/.local/lib/python3.6/site-packages/torch/quantization/observer.py",line 276,in forward
    x = x_orig.detach()  # avoid keeping autograd tape
AttributeError: 'tuple' object has no attribute 'detach'

我使用np.select搜索“条件”并返回适当的“选择”。这就像我在excel中使用的vlookup一样。

我正在尝试获取PuLP或任何其他合适的优化工具,甚至可能只是一个循环,以找到df.speed的最佳值(我从临时值50开始),以最大化“ final_column。”下面是我尝试过的代码,但是没有用。

from pandas import DataFrame
import numpy as np
from pulp import *

heading = [184,153,140,122,119]
df = DataFrame (heading,columns=['heading'])
df['speed'] = 50 
df['ratio'] = df.speed/df.heading
conditions = [
    (df['ratio'] < 0.1),(df['ratio'] >= 0.1 ) & (df['ratio'] < 0.2),(df['ratio'] >= 0.2 ) & (df['ratio'] < 0.3),(df['ratio'] >= 0.3 ) & (df['ratio'] < 0.4),(df['ratio'] > 0.4 )]
choices = [3,1,8,5,2]
df['choice'] = np.select(conditions,choices)
df['final_column'] = df.choice * df.heading

print(np.sum(df.final_column))

以下是我遇到的错误:

speed_vars = LpVariable(“ Variable”,df.speed,lowBound = 0,cat ='Integer') TypeError: init ()为参数“ lowBound”获得了多个值

非常感谢您的帮助。任何帮助将不胜感激!

解决方法

欢迎您!

首先要获得的特定错误消息: TypeError: __init__() got multiple values for argument 'lowBound'

在python中,调用函数时,您可以通过'position'传递参数-这意味着您传递参数的顺序告诉函数每个参数是什么-或通过命名它们。如果您在documentation中查找pulp.LpVariable方法,您将看到第二个位置参数是'lowbound',然后您还将其作为命名参数传递-从而出现错误消息。

我认为您可能还误会了数据框的工作原理。它不像excel那样,您需要在列中设置一个“公式”,并且随着该行上其他元素的更改,它仍会更新为该公式。您可以为列分配值,但是如果输入数据发生更改-仅当再次运行该代码位时,才会更新单元格。

在解决您的问题方面-我不相信我已经了解您要尝试做的事情,但我了解以下内容。

  • 我们要选择df['speed']的值以最大化headingchoices列的和积
  • 选项列的值取决于ratiospeed的{​​{1}}(按照给定的5个范围)
  • heading列是固定的

通过检查,可以通过设置所有速度来实现最佳值,以使比率在[0.2-0.3]范围内,而落在该范围内的位置无关紧要。在下面的pandas数据帧内的PuLP中执行此操作的代码。它依靠使用二进制变量来跟踪比率所处的范围。

尽管语法有点尴尬-我建议完全在数据帧之外进行优化,然后仅在最后加载结果-使用Heading方法来创建变量数组。

LpVariable.dicts

最后一位打印出来:

from pandas import DataFrame
import numpy as np
from pulp import *

headings = [184.0,153.0,140.0,122.0,119.0]
df = DataFrame (headings,columns=['heading'])
df['speed'] = 50
max_speed = 500.0
max_ratio = max_speed / np.min(headings)
df['ratio'] = df.speed/df.heading
conditions_lb = [0,0.1,0.2,0.3,0.4]
conditions_ub = [0.1,0.4,max_speed / np.min(headings)]
choices = [3,1,8,5,2]
n_range = len(choices)
n_rows = len(df)

# Create primary ratio variables - one for each variable:
df['speed_vars'] = [LpVariable("speed_"+str(j)) for j in range(n_rows)]

# Create auxilary variables - binaries to control
# which bit of range each speed is in
df['aux_vars'] = [[LpVariable("aux_"+str(i)+"_"+str(j),cat='Binary')
                   for i in range(n_range)]
                   for j in range(n_rows)]

# Declare problem
prob = LpProblem("max_pd_column",LpMaximize)

# Define objective function
prob += lpSum([df['aux_vars'][j][i]*choices[i]*headings[j] for i in range(n_range)
               for j in range(n_rows)])

# Constrain only one range to be selected for each row
for j in range(n_rows):
    prob += lpSum([df['aux_vars'][j][i] for i in range(n_range)]) == 1

# Constrain the value of the speed by the ratio range selected
for j in range(n_rows):
    for i in range(n_range):
        prob += df['speed_vars'][j]*(1.0/df['heading'][j]) <= \
                        conditions_ub[i] + (1-df['aux_vars'][j][i])*max_ratio
        prob += df['speed_vars'][j]*(1.0/df['heading'][j]) >= \
                        conditions_lb[i]*df['aux_vars'][j][i]

# Solve problem and print results
prob.solve()

# Dislay the optimums of each var in problem
for v in prob.variables ():
    print (v.name,"=",v.varValue)

# Set values in dataframe and print:
df['speed_opt'] = [df['speed_vars'][j].varValue for j in range(n_rows)]
df['ratio_opt'] = df.speed_opt/df.heading
print(df)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...