readBids.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. # -*- coding: utf-8 -*-
  2. # =============================================================================
  3. # Copyright (C) 2018 Mercados Electricos de Centroamérica. All rights reserved
  4. # =============================================================================
  5. """Importa la información de inyecciones y retiros de archivo de Excel
  6. """
  7. from pandas import read_excel, concat
  8. from numpy import zeros
  9. def readexistentes(subasta_file):
  10. """Lee del archivo Excel la información de Derechos Firmes existente.
  11. Retorna un DataFrame con las columnas siguientes:
  12. 1. cod_agente : Código del Agente propietario del DF existente.
  13. 2. tke : identificador del DF existente
  14. 3. bus_ie : Nodo de inyección del DF existente
  15. 4. bus_je : Nodo de retiro del DF existente
  16. 5. MWe : Potencia asignada al DF existente
  17. """
  18. exist = read_excel(subasta_file,sheet_name='existentes')
  19. exist.columns = ['cod_agente','tke','bus_ie','bus_je','MWe','per']
  20. return exist
  21. def readofertas(subasta_file):
  22. """Lee del archivo Excel la información de Ofertad de Derechos Firmes.
  23. Retorna un DataFrame con las columnas siguientes:
  24. 1. cod_agente : Código del Agente que oferta.
  25. 2. tko : identificador de la oferta
  26. 3. bus_io : Nodo de inyección de la oferta
  27. 4. bus_jo : Nodo de retiro de la oferta
  28. 5. MWo : Potencia ofertada
  29. 6. oferta : Oferta en dólares por la compra de DF
  30. 7. precio : Precio del MWh ofertado [oferta/(24*365*MWo)]
  31. 8. per : Perdidas asignadas a la oferta
  32. 9. cper : Oferta en dolares por las pérdidas
  33. """
  34. ofer = read_excel(subasta_file,sheet_name='oferta')
  35. ofer.columns = ['cod_agente','tko','bus_io','bus_jo','MWo','oferta','precio','per','cper']
  36. return ofer
  37. def setVITE(bus, ex):
  38. """Construye el vector VITE de inyecciones de Derechos Firmes existentes
  39. Vector cuya dimensión es C{nb}, en donde c{nb} es el número de nodos, y
  40. cuyas componentes son todas nulas, salvo la correspondiente al nodo de
  41. inyección del derecho firme donde tiene el valor correspondiene a la
  42. inyección asociada al derecho
  43. La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
  44. número de nodos y C{ne} es el número de derechos firmes existentes. Cada
  45. columna de la matriz es el vector VITEe de cada derecho firme e.
  46. """
  47. _vite = zeros((bus.shape[0],ex.shape[0]))
  48. for i in range(0, ex.shape[0]):
  49. _vite[bus[bus == ex.iloc[i].bus_ie].index[0],i] = ex.iloc[i].MWe
  50. return _vite
  51. def setVRTE(bus, ex):
  52. """Construye el vector VRTE de retiros de Derechos Firmes existentes
  53. Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
  54. componentes son todas nulas, salvo la correspondiente al nodo de retiro
  55. del derecho firme donde tiene el valor correspondiene a la inyección
  56. asociada al derecho
  57. La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
  58. número de nodos y C{ne} es el número de derechos firmes existentes. Cada
  59. columna de la matriz es el vector VRTEe de cada derecho firme e.
  60. """
  61. _vrte = zeros((bus.shape[0], ex.shape[0]))
  62. for i in range(0, ex.shape[0]):
  63. _vrte[bus[bus == ex.iloc[i].bus_je].index[0],i] = ex.iloc[i].MWe
  64. return _vrte
  65. def setTE(vite,vrte):
  66. """Construye el vector TE resta VITE - VRTE
  67. La suma de su componentes es nula.
  68. La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
  69. número de nodos y C{ne} es el número de derechos firmes existentes. Cada
  70. columna de la matriz es el vector TEe de cada derecho firme e.
  71. """
  72. _te = vite - vrte
  73. return _te
  74. def setVITEX(bus, ex):
  75. """Construye el vector VITEX de perdidas de Derechos Firmes existentes
  76. Vector cuya dimensión es C{nb}, en donde c{nb} es el número de nodos, y
  77. cuyas componentes son todas nulas, salvo la correspondiente al nodo de
  78. inyección del derecho firme donde tiene el valor correspondiene a la
  79. inyección asociada al derecho
  80. La función regresa una matriz de dimensión C{nb x ne}, en donde C{nb} es el
  81. número de nodos y C{ne} es el número de derechos firmes existentes. Cada
  82. columna de la matriz es el vector VITEXe de cada derecho firme e.
  83. """
  84. _vitex = zeros((bus.shape[0],ex.shape[0]))
  85. for i in range(0, ex.shape[0]):
  86. _vitex[bus[bus == ex.iloc[i].bus_ie].index[0],i] = ex.iloc[i].per
  87. return _vitex
  88. def setVIT(bus, of):
  89. """Construye el vector VIT de inyecciones de Ofertas de Derechos Firmes
  90. Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
  91. componentes son todas nulas, salvo la correspondiente al nodo de inyeccion
  92. del derecho firme donde tiene el valor correspondiene a la inyección
  93. ofertada en el derecho k
  94. La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
  95. número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
  96. columna de la matriz es el vector VITk de cada oferta k.
  97. """
  98. _vit = zeros((bus.shape[0], of.shape[0]))
  99. for i in range(0, of.shape[0]):
  100. _vit[bus[bus == of.iloc[i].bus_io].index[0],i] = of.iloc[i].MWo
  101. return _vit
  102. def setVRT(bus, of):
  103. """Construye el vector VRT de retiros de Ofertas de Derechos Firmes
  104. Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
  105. componentes son todas nulas, salvo la correspondiente al nodo de retiro
  106. del derecho firme donde tiene el valor correspondiene a la inyección
  107. ofertada en el derecho k
  108. La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
  109. número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
  110. columna de la matriz es el vector VRTk de cada oferta k.
  111. """
  112. _vrt = zeros((bus.shape[0], of.shape[0]))
  113. for i in range(0, of.shape[0]):
  114. _vrt[bus[bus == of.iloc[i].bus_jo].index[0],i] = of.iloc[i].MWo
  115. return _vrt
  116. def setT(vit,vrt):
  117. """Construye el vector T resta VIT - VRT
  118. La suma de sus componentes es nula.
  119. La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
  120. número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
  121. columna de la matriz es el vector Tk de cada oferta k.
  122. """
  123. _t = vit - vrt
  124. return _t
  125. def setVITX(bus,of):
  126. """Construye el vector VITX de perdidas de Ofertas de Derechos Firmes
  127. Vector cuya dimensión es C{nb}, en donde nb es el número de nodos, y cuyas
  128. componentes son todas nulas, salvo la correspondiente al nodo de inyección
  129. de la oferta de derecho firme donde tiene el valor correspondiene a la
  130. perdida máxima asociada a la oferta k
  131. La función regresa una matriz de dimensión C{nb x nk}, en donde C{nb} es el
  132. número de nodos y C{nk} es el número de ofertas de derechos firmes. Cada
  133. columna de la matriz es el vector VITXk de cada oferta k.
  134. """
  135. _vitx = zeros((bus.shape[0], of.shape[0]))
  136. for i in range(0, of.shape[0]):
  137. _vitx[bus[bus == of.iloc[i].bus_io].index[0],i] = of.iloc[i].per
  138. return _vitx
  139. def setIny(bus, exist, ofer):
  140. """Construye el vector de inyecciones para todos los nodos de la red
  141. """
  142. iny_e = exist.pivot_table(values='MWe', aggfunc='sum', columns='bus_ie').T
  143. iny_o = ofer.pivot_table(values = 'MWo', aggfunc='sum', columns='bus_io').T
  144. iny=concat([iny_e, iny_o], axis=1).fillna(0)
  145. iny['total'] = iny.iloc[:,0]+iny.iloc[:,1]
  146. _iny = zeros(bus.shape[0])
  147. for i in range(0,iny.shape[0]):
  148. _iny[bus[bus == iny.iloc[i].name].index[0]] = iny.iloc[i].total
  149. return _iny
  150. def setRet(bus, exist, ofer):
  151. """ Construye el vector de retiros para todos los nodos de la red
  152. """
  153. ret_e = exist.pivot_table(values='MWe', aggfunc='sum', columns='bus_je').T
  154. ret_o = ofer.pivot_table(values = 'MWo', aggfunc='sum', columns='bus_jo').T
  155. ret=concat([ret_e, ret_o], axis=1).fillna(0)
  156. ret['total'] = ret.iloc[:,0]+ret.iloc[:,1]
  157. _ret = zeros(bus.shape[0])
  158. for i in range(0, ret.shape[0]):
  159. _ret[bus[bus == ret.iloc[i].name].index[0]] = ret.iloc[i].total
  160. return _ret