oscarleiva преди 5 години
родител
ревизия
6ec2471fe6
променени са 2 файла, в които са добавени 112 реда и са изтрити 121 реда
  1. 28 38
      simsdt/model.py
  2. 84 83
      simsdt/ofertas/readBids.py

+ 28 - 38
simsdt/model.py

@@ -6,18 +6,17 @@ Modulo principal para ejecutar el modelo de subasta
 import logging
 from logging.handlers import RotatingFileHandler
 from os import path
-import queue
 
 import pandas as pd
 import pyomo.environ as pe
 import pyutilib.subprocess.GlobalData
 from numpy import array, zeros
-from openpyxl import load_workbook
 from pyomo.environ import SolverFactory
-from pyomo.kernel import value
 
 from simsdt.mct.makeMCT import linmct, readmct, set_dir_flujo
-from simsdt.ofertas.readBids import *
+from simsdt.ofertas.readBids import (readexistentes, readofertas, setT, setTE,
+                                     setVIT, setVITE, setVITEX, setVITX,
+                                     setVRT, setVRTE)
 from simsdt.red.create import branchnames, setbranch, setbus
 from simsdt.red.makeBdc import makeBdc
 from simsdt.red.makePTDF import makePTDF
@@ -25,15 +24,14 @@ from simsdt.red.read import excel2net
 from simsdt.utils.arr2dict import arr2dict
 from simsdt.utils.idx_brch import RT_MAX, RT_MIN, R
 
-from qhandler import QueueHandler
-
 pyutilib.subprocess.GlobalData.DEFINE_SIGNAL_HANDLERS_DEFAULT = False
 
 
 fh = RotatingFileHandler(
     'log/simsdt_model_monitor.log', maxBytes=10240, backupCount=10)
 fmt = logging.Formatter(
-    '%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%dT%H:%M:%S')
+    '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
+    datefmt='%Y-%m-%dT%H:%M:%S')
 fh.setFormatter(fmt)
 
 
@@ -190,13 +188,17 @@ class ModeloSubasta:
 
         # Lim. Superior flujos asociados a linea c
         def bfu_param(model, c):
-            return model.Bu[c] - sum(max(0, sum(model.He[c, n]*model.TE[n, o] for n in model.n)) for o in model.o)
+            return model.Bu[c]
+            - sum(max(0, sum(model.He[c, n]*model.TE[n, o]
+                             for n in model.n)) for o in model.o)
 
         model.BFu = pe.Param(model.c, initialize=bfu_param)
 
         # LIm. Inferior flujos asociados a linea c
         def bfl_param(model, c):
-            return model.Bl[c] - sum(max(0, -sum(model.He[c, n]*model.TE[n, o] for n in model.n)) for o in model.o)
+            return model.Bl[c]
+            - sum(max(0, -sum(model.He[c, n]*model.TE[n, o]
+                              for n in model.n)) for o in model.o)
 
         model.BFl = pe.Param(model.c, initialize=bfl_param)
 
@@ -233,7 +235,8 @@ class ModeloSubasta:
         model_logger.info("Ecuación de Función Objetivo Max Z")
 
         def eq_Z(model):
-            return sum(model.alpha_k[k]*model.C[k] - model.gamma_k[k]*model.Cper[k] for k in model.k)
+            return sum(model.alpha_k[k]*model.C[k]
+                       - model.gamma_k[k]*model.Cper[k] for k in model.k)
 
         model.Z = pe.Objective(rule=eq_Z, sense=pe.maximize)
 
@@ -253,7 +256,9 @@ class ModeloSubasta:
         model_logger.info("Factibilidad de derechos Firmes")
 
         def eq_F_k_rule(model, c, k):
-            return model.F_k[c, k] == model.alpha_k[k]*sum(model.He[c, n]*model.T[n, k] for n in model.n)
+            return model.F_k[c, k] == (
+                model.alpha_k[k] *
+                sum(model.He[c, n] * model.T[n, k] for n in model.n))
 
         model.eq_F_k = pe.Constraint(model.c, model.k, rule=eq_F_k_rule)
 
@@ -319,7 +324,8 @@ class ModeloSubasta:
         model.eq_PL = pe.Constraint(model.c, rule=eq_PL_rule)
 
         def eq_Per_rule(model, n):
-            return model.Per[n] == sum(model.Inc[c, n]*(model.PL[c]/2) for c in model.c)
+            return model.Per[n] == (
+                sum(model.Inc[c, n]*(model.PL[c]/2) for c in model.c))
 
         model.eq_Per = pe.Constraint(model.n, rule=eq_Per_rule)
 
@@ -381,7 +387,8 @@ class ModeloSubasta:
 
             model_logger.info("Buscando una solución optima al problema")
             result = opt.solve(
-                model, tee=True, logfile="log/solver_{}.log".format(filename[0]))
+                model, tee=True,
+                logfile="log/solver_{}.log".format(filename[0]))
 
             model.solutions.store_to(result)
             result.write(filename='results.json', format='json')
@@ -464,45 +471,28 @@ class ModeloSubasta:
         pon = bus.copy()
         pon['PON'] = PON
 
-        # Grabar en excel
-        # ================================================================================
-
-        # new_filename = filename[0]+'_results.'+filename[1]
-        #
-        # new_file = path.join(filepath, new_filename)
-        #
-        # book = load_workbook(new_file)
-        # writer = ExcelWriter(new_file, engine='openpyxl')
-        # writer.book = book
-        # writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
-        #
-        # resultado.to_excel(writer, sheet_name='asignacion', index=False, header=True)
-        #
-        # flujos.to_excel(writer, sheet_name='flujos', index=False, header=True)
-        #
-        # pon.to_excel(writer, sheet_name='pon', index=False, header=True)
-        #
-        # writer.save()
-        # writer.close()
-
         # Grabar en csv
         # =================================================================================
         csv_path = filepath
         model_logger.info("Escribiendo archivo de asignaciones")
         resultado.to_csv(
-            path.join(csv_path, filename[0] + '_asignacion.csv'), sep=',', index=False)
+            path.join(csv_path,
+                      filename[0] + '_asignacion.csv'), sep=',', index=False)
 
         model_logger.info("Escribiendo archivo de flujos de potencia")
         flujos.to_csv(
-            path.join(csv_path, filename[0] + '_flujos.csv'), sep=',', index=False)
+            path.join(csv_path,
+                      filename[0] + '_flujos.csv'), sep=',', index=False)
 
         model_logger.info("Escribiendo archivo de flujos de precios")
         pon.to_csv(
-            path.join(csv_path, filename[0] + '_pon.csv'), sep=',', index=False)
+            path.join(csv_path,
+                      filename[0] + '_pon.csv'), sep=',', index=False)
 
         model_logger.info(
             "Escribiendo archivo de flujos de potencia entre areas de control")
         flujos_inter.to_csv(
-            path.join(csv_path, filename[0] + '_flujos_inter.csv'), sep=',', index=False)
+            path.join(csv_path,
+                      filename[0] + '_flujos_inter.csv'), sep=',', index=False)
 
         model_logger.info("Script Finalizado ")

+ 84 - 83
simsdt/ofertas/readBids.py

@@ -6,32 +6,32 @@
 """Importa la información de inyecciones y retiros de archivo de Excel 
 """
 
-from pandas import read_excel, concat
 from numpy import zeros
+from pandas import concat, read_excel
 
 
 def readexistentes(subasta_file):
     """Lee del archivo Excel la información de Derechos Firmes existente.
-    
+
     Retorna un DataFrame con las columnas siguientes:
-        
+
         1. cod_agente    : Código del Agente propietario del DF existente.
         2. tke           : identificador del DF existente
         3. bus_ie        : Nodo de inyección del DF existente
         4. bus_je        : Nodo de retiro del DF existente
         5. MWe           : Potencia asignada al DF existente
     """
-    exist = read_excel(subasta_file,sheet_name='existentes')
-    exist.columns = ['cod_agente','tke','bus_ie','bus_je','MWe','per']
-    
+    exist = read_excel(subasta_file, sheet_name='existentes')
+    exist.columns = ['cod_agente', 'tke', 'bus_ie', 'bus_je', 'MWe', 'per']
+
     return exist
 
 
 def readofertas(subasta_file):
     """Lee del archivo Excel la información de Ofertad de Derechos Firmes.
-    
+
     Retorna un DataFrame con las columnas siguientes:
-        
+
         1. cod_agente    : Código del Agente que oferta.
         2. tko           : identificador de la oferta
         3. bus_io        : Nodo de inyección de la oferta
@@ -42,204 +42,205 @@ def readofertas(subasta_file):
         8. per           : Perdidas asignadas a la oferta
         9. cper          : Oferta en dolares por las pérdidas
     """
-    ofer = read_excel(subasta_file,sheet_name='oferta')
-    ofer.columns = ['cod_agente','tko','bus_io','bus_jo','MWo','oferta','precio','per','cper']
-    
+    ofer = read_excel(subasta_file, sheet_name='oferta')
+    ofer.columns = ['cod_agente', 'tko', 'bus_io',
+                    'bus_jo', 'MWo', 'oferta', 'precio', 'per', 'cper']
+
     return ofer
 
 
 def setVITE(bus, ex):
     """Construye el vector VITE de inyecciones de Derechos Firmes existentes
-    
+
     Vector cuya dimensión es C{nb}, en donde c{nb} es el número de nodos, y 
     cuyas componentes son todas nulas, salvo la correspondiente al nodo de 
     inyección del derecho firme donde tiene el valor correspondiene a la 
     inyección asociada al derecho
-    
+
     La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
     número de nodos y C{ne} es el número de derechos firmes existentes. Cada
     columna de la matriz es el vector VITEe de cada derecho firme e.
-    
+
     """
-    
-    _vite = zeros((bus.shape[0],ex.shape[0]))
-    
+
+    _vite = zeros((bus.shape[0], ex.shape[0]))
+
     for i in range(0, ex.shape[0]):
-        _vite[bus[bus == ex.iloc[i].bus_ie].index[0],i] = ex.iloc[i].MWe
-        
+        _vite[bus[bus == ex.iloc[i].bus_ie].index[0], i] = ex.iloc[i].MWe
+
     return _vite
 
 
 def setVRTE(bus, ex):
     """Construye el vector VRTE de retiros de Derechos Firmes existentes
-    
+
     Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
     componentes son todas nulas, salvo la correspondiente al nodo de retiro
     del derecho firme donde tiene el valor correspondiene a la inyección
     asociada al derecho
-    
+
     La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
     número de nodos y C{ne} es el número de derechos firmes existentes. Cada
     columna de la matriz es el vector VRTEe de cada derecho firme e.
-    
+
     """
-    
+
     _vrte = zeros((bus.shape[0], ex.shape[0]))
-    
+
     for i in range(0, ex.shape[0]):
-        _vrte[bus[bus == ex.iloc[i].bus_je].index[0],i] = ex.iloc[i].MWe
-        
+        _vrte[bus[bus == ex.iloc[i].bus_je].index[0], i] = ex.iloc[i].MWe
+
     return _vrte
 
 
-def setTE(vite,vrte):
+def setTE(vite, vrte):
     """Construye el vector TE resta VITE - VRTE
-    
+
     La suma de su componentes es nula.
-    
+
     La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
     número de nodos y C{ne} es el número de derechos firmes existentes. Cada
     columna de la matriz es el vector TEe de cada derecho firme e.
     """
     _te = vite - vrte
-    
+
     return _te
 
 
 def setVITEX(bus, ex):
     """Construye el vector VITEX de perdidas de Derechos Firmes existentes
-    
+
     Vector cuya dimensión es C{nb}, en donde c{nb} es el número de nodos, y 
     cuyas componentes son todas nulas, salvo la correspondiente al nodo de 
     inyección del derecho firme donde tiene el valor correspondiene a la 
     inyección asociada al derecho
-    
+
     La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
     número de nodos y C{ne} es el número de derechos firmes existentes. Cada
     columna de la matriz es el vector VITEXe de cada derecho firme e.
-    
+
     """
-    
-    _vitex = zeros((bus.shape[0],ex.shape[0]))
-    
+
+    _vitex = zeros((bus.shape[0], ex.shape[0]))
+
     for i in range(0, ex.shape[0]):
-        _vitex[bus[bus == ex.iloc[i].bus_ie].index[0],i] = ex.iloc[i].per
-        
+        _vitex[bus[bus == ex.iloc[i].bus_ie].index[0], i] = ex.iloc[i].per
+
     return _vitex
 
 
 def setVIT(bus, of):
     """Construye el vector VIT de inyecciones de Ofertas de Derechos Firmes
-    
+
     Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
     componentes son todas nulas, salvo la correspondiente al nodo de inyeccion
     del derecho firme donde tiene el valor correspondiene a la inyección
     ofertada en el derecho k
-    
+
     La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
     número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
     columna de la matriz es el vector VITk de cada oferta k.
-    
+
     """
-    
+
     _vit = zeros((bus.shape[0], of.shape[0]))
-    
+
     for i in range(0, of.shape[0]):
-        _vit[bus[bus == of.iloc[i].bus_io].index[0],i] = of.iloc[i].MWo
-        
+        _vit[bus[bus == of.iloc[i].bus_io].index[0], i] = of.iloc[i].MWo
+
     return _vit
 
 
 def setVRT(bus, of):
     """Construye el vector VRT de retiros de Ofertas de Derechos Firmes
-    
+
     Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
     componentes son todas nulas, salvo la correspondiente al nodo de retiro
     del derecho firme donde tiene el valor correspondiene a la inyección
     ofertada en el derecho k
-    
+
     La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
     número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
     columna de la matriz es el vector VRTk de cada oferta k.
-    
+
     """
-   
+
     _vrt = zeros((bus.shape[0], of.shape[0]))
-    
+
     for i in range(0, of.shape[0]):
-        _vrt[bus[bus == of.iloc[i].bus_jo].index[0],i] = of.iloc[i].MWo
-        
+        _vrt[bus[bus == of.iloc[i].bus_jo].index[0], i] = of.iloc[i].MWo
+
     return _vrt
 
 
-def setT(vit,vrt):
+def setT(vit, vrt):
     """Construye el vector T resta VIT - VRT
-    
+
     La suma de sus componentes es nula.
-    
+
     La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
     número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
     columna de la matriz es el vector Tk de cada oferta k.
     """
     _t = vit - vrt
-    
+
     return _t
 
 
-def setVITX(bus,of):
+def setVITX(bus, of):
     """Construye el vector VITX de perdidas de Ofertas de Derechos Firmes
-    
+
     Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
     componentes son todas nulas, salvo la correspondiente al nodo de inyección
     de la oferta de derecho firme donde tiene el valor correspondiene a la 
     perdida máxima asociada a la oferta k
-    
+
     La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
     número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
     columna de la matriz es el vector VITXk de cada oferta k.
-    
+
     """
     _vitx = zeros((bus.shape[0], of.shape[0]))
-    
+
     for i in range(0, of.shape[0]):
-        _vitx[bus[bus == of.iloc[i].bus_io].index[0],i] = of.iloc[i].per
-        
+        _vitx[bus[bus == of.iloc[i].bus_io].index[0], i] = of.iloc[i].per
+
     return _vitx
 
 
 def setIny(bus, exist, ofer):
     """Construye el vector de inyecciones para todos los nodos de la red
     """
-    
+
     iny_e = exist.pivot_table(values='MWe', aggfunc='sum', columns='bus_ie').T
-    iny_o = ofer.pivot_table(values = 'MWo', aggfunc='sum', columns='bus_io').T
-    
-    iny=concat([iny_e, iny_o], axis=1).fillna(0)
-    
-    iny['total'] = iny.iloc[:,0]+iny.iloc[:,1]
-    
+    iny_o = ofer.pivot_table(values='MWo', aggfunc='sum', columns='bus_io').T
+
+    iny = concat([iny_e, iny_o], axis=1).fillna(0)
+
+    iny['total'] = iny.iloc[:, 0]+iny.iloc[:, 1]
+
     _iny = zeros(bus.shape[0])
-    
-    for i in range(0,iny.shape[0]):
+
+    for i in range(0, iny.shape[0]):
         _iny[bus[bus == iny.iloc[i].name].index[0]] = iny.iloc[i].total
-    
+
     return _iny
 
 
 def setRet(bus, exist, ofer):
     """ Construye el vector de retiros para todos los nodos de la red
     """
-    
+
     ret_e = exist.pivot_table(values='MWe', aggfunc='sum', columns='bus_je').T
-    ret_o = ofer.pivot_table(values = 'MWo', aggfunc='sum', columns='bus_jo').T
-    
-    ret=concat([ret_e, ret_o], axis=1).fillna(0)
-    
-    ret['total'] = ret.iloc[:,0]+ret.iloc[:,1]
-    
+    ret_o = ofer.pivot_table(values='MWo', aggfunc='sum', columns='bus_jo').T
+
+    ret = concat([ret_e, ret_o], axis=1).fillna(0)
+
+    ret['total'] = ret.iloc[:, 0]+ret.iloc[:, 1]
+
     _ret = zeros(bus.shape[0])
-    
+
     for i in range(0, ret.shape[0]):
         _ret[bus[bus == ret.iloc[i].name].index[0]] = ret.iloc[i].total
-    
-    return _ret
+
+    return _ret