Scipy DataFrame 上的逐行最小化优化

Scipy minimisation optimisation row-wise on DataFrame

错误已修复

我需要对我的时间序列中的每个时间步执行最小化优化。优化根据行中不同列中的值和一系列不等式约束设置价格。

我的 Dataframe 在 48 年的时间序列中包含以下列:

['CAPEX_TOT', 'CAPEX_R', 'CAPEX_WS', 'debt_BP', 'principal','interest',
   'debt_service', 'debt_EP', 'OPEX', 'OPEX_R', 'OPEX_WS',
   'DELIVERY_BAWSCA', 'DELIVERY_OTHER_DEMAND',
   'DELIVERY_SAN_FRANCISCO_CITY', 'DELIVERIES_WS', 'DELIVERIES_R',
   'PRICE_crR', 'PRICE_crWS', 'REVENUE', 'FUND_BALANCE_BP',
   'FUND_BALANCE_EP']

PRICE_crR和PRICE_crWS代表两个不同客户的价格类纯粹基于成本回收。优化必须寻求实现成本回收(下面代码中的第一个约束),同时观察几个关键策略约束,这些约束由下面代码中的第二个和第三个约束表示。

这是我目前所拥有的。

要最小化的objective函数

finance_df['revenue_R'] = finance_df.apply(lambda row: row * row.DELIVERIES_R)

约束条件

cons = ({'type': 'ineq', 'fun': finance_df.apply(lambda row: row - row.price_crR, axis=1)},
    {'type': 'ineq', 'fun': finance_df.apply(lambda row: ((row * row.DELIVERIES_R) - row.OPEX_R + OTHER_REVENUE)\
                                            / (debt_CAPEX_ratio * row.debt_service), axis=1)},
    {'type': 'ineq', 'fun': finance_df.apply(lambda row: (1.05 * row.price_crR) - row, axis=1)})

非负约束

bnds = ((0, None), (0, None))

一系列初始最佳猜测

price_0 = [7, 7.5, 8, 8.5, 9, 9.5, 10]

优化函数

res = minimize(finance_df['revenue_R'], price_0, method='SLSQP', bounds=bnds, constraints=cons)

当运行上面的脚本我得到以下错误信息:

    ("'Series' object has no attribute 'DELIVERIES_R'", 'occurred at index CAPEX_TOT')

问题是由不正确的值 finance_df.apply(lambda row: row * row.DELIVERIES_R) 引起的。 与遍历一行 (DataSeries) 不同,遍历 table (DataFrame) 需要指定 axis = 1 if row-wise,即 df.apply(fun, axis=1) 否则你会得到列(axis 0)并且作为您看到的列和错误。

(回复首先作为评论给出,现在转换为答案以快速关闭此错字问题)。