使用不同维度的输入数据进行优化

时间:2018-08-17 15:47:33

标签: python dataframe optimization convex-optimization cvxpy

我有一个凸优化案例,我试图求解2组不同的权重。第一个数据帧是(10,3),第二个数据帧是(10,10)和向量(10,1)。我编写了以下伪代码,只是随机选择了值来演示问题。

import pandas as pd
import numpy as np
import cvxpy as cvx

data_E_df = pd.DataFrame({'Series1':[0.2,0,0.2,0,0.2,0,0.2,0,0.2,0],'Series2':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'Series3':[0.3,0.2,0,0,0,0,0,0,0.3,0.2]}) 

data_S_df = pd.DataFrame({'1':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'2':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'3':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],
                      '4':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'5':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'6':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],
                      '7':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'8':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],'9':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1],
                      '10':[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]}) 

betas_vec = pd.DataFrame({'BETA':[0,1,0,1,0,1,0,1,0,1]})

cov = np.array([[1,0,0,0,0,0,0,0,0,0],
            [0,1,0,0,0,0,0,0,0,0],
            [0,0,1,0,0,0,0,0,0,0],
            [0,0,0,1,0,0,0,0,0,0],
            [0,0,0,0,1,0,0,0,0,0],
            [0,0,0,0,0,1,0,0,0,0],
            [0,0,0,0,0,0,1,0,0,0],
            [0,0,0,0,0,0,0,1,0,0],
            [0,0,0,0,0,0,0,0,1,0],
            [0,0,0,0,0,0,0,0,0,1]])

Weights_E_series = cvx.Variable(3,1)
Weights_S_series = cvx.Variable(10,1)

# Works 
#constraints =[
#cvx.sum_entries(data_E_df['Series1'].as_matrix()*cvx.mul_elemwise(betas_vec['BETA'].as_matrix(), Weights_E_series[0]) 
#+ data_S_df.as_matrix()*Weights_S_series) == 1., Weights_E_series >= 0.0, Weights_S_series >= 0.0]

constraints =[
            cvx.sum_entries(data_E_df.as_matrix() * betas_vec['BETA'].as_matrix() * Weights_E_series
            + data_S_df.as_matrix()*Weights_S_series) == 1., Weights_E_series >= 0.0, Weights_S_series >= 0.0]

prob = cvx.Problem(cvx.Minimize(cvx.quad_form(data_E_df.as_matrix()*Weights_E_series + data_S_df.as_matrix()*Weights_S_series, cov)), constraints)

prob.solve()

print(Weights_E_series.value)
print(Weights_S_series.value)

有没有办法让我获得data_E_df * Weights_E_series * betas_vec的约束,而无需编码每个Series1,Series2列* betas_vec * Weights_E_series []组合?

0 个答案:

没有答案