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)并且作为您看到的列和错误。
(回复首先作为评论给出,现在转换为答案以快速关闭此错字问题)。
错误已修复
我需要对我的时间序列中的每个时间步执行最小化优化。优化根据行中不同列中的值和一系列不等式约束设置价格。
我的 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)并且作为您看到的列和错误。
(回复首先作为评论给出,现在转换为答案以快速关闭此错字问题)。