Python Oe
Python Oe
Abstract.
This paper presents a review of the use of Python for different types of analysis in the
electrical industry, the use of Python in geographic information systems among others.
We can cite the implementation of script in the software DIgSILENT POWER FACTORY,
implementation of script in the CYMDIST software, and also a review of the use of Python
as a real alternative in numerical analysis, thanks to its libraries called Numpy / Matplotlib
for numerical operations, Cython for code optimizations low, IPython to work interactively,
etc.
RESUMEN.
El presente trabajo presenta una revisión del uso del Python para diferentes tipos de análisis
en la industria eléctrica, el uso de Python en los sistemas de información geográfica entre
otros. Podemos citar la implementación de script en el software DIgSILENT POWER FACTORY,
implementación de script en el software CYMDIST, así también una revisión del uso del Python
como una alternativa real en el análisis numérico, gracias a sus librerías llamadas Numpy
/ Matplotlib para operaciones numéricas, Cython para optimizaciones de código a bajo nivel,
IPython para trabajar de forma interactiva, etc.
INTRODUCCIÓN.
En la actualidad existen herramientas como el DIgSILENT POWER FACTORY que se utiliza para
el análisis de los sistemas eléctricos de potencia, el CYME que se utiliza para el análisis de los
sistemas eléctricos de distribución, el ArcGis para los sistemas de información geográfica, etc.,
de amplio uso en el caso de Bolivia. Las herramientas mencionadas tienen en común que se
pueden automatizar mediante el uso del software Python, se pueden acceder a la modificación
de los parámetros mediante programación en Python.
El software Digsilent Power Factory, es una herramienta integrada para el análisis de sistemas
eléctricos de potencia, caracterizando técnicas confiables y flexibles de modelado y algoritmos.
El programa utiliza un ambiente de trabajo muy similar al que utiliza Windows.
22
Colegio de Ingenieros Electricistas y Electrónicos
El software CYME es un conjunto de programas para el análisis de redes eléctricas, entre los que
podemos mencionar el estimador de estado de redes de distribución, protección de distancia,
análisis de redes secundarias malladas, etc.
El software ArcGis comprende una serie de aplicaciones, que utilizadas en conjunto, permiten
realizar funciones que alimentan y administran un sistema de información geográfica (SIG), desde
creación de mapas, manejo y análisis de información, edición de datos, metadatos y publicación de
mapas en internet. Tiene diferentes módulos (aplicaciones) como el ArcGis Desktop, ArcCatalog,
ArcToolbox, ArcMAP. Trabaja con el Shape File que es el archivo principal que se utiliza en el
ArcGis, el mismo que está formado por varias extensiones.
Tiene un entorno fácil de usar, donde los problemas y las soluciones son expresados como se
escriben matemáticamente. El nombre MATLAB proviene de ``Matrix Laboratory’’ (Laboratorio de
Matrices). MATLAB fue escrito originalmente para proporcionar un acceso sencillo al software
matricial desarrollado por los proyectos LINPACK y EISPACK, que juntos representan lo más
avanzado en programas de cálculo matricial. MATLAB es un sistema interactivo cuyo elemento
básico de datos es una matriz que no requiere dimensionamiento.
SOFTWARE PYTHON.
Python puede ser utilizado en diversas plataformas y sistemas operativos, entre los que podemos
destacar los más populares, cómo Windows, Mac OS X y Linux. Pero, además, Python también
puede funcionar en smartphones, Nokia desarrolló un intérprete de esté lenguaje para su sistema
operativo Symbian.
Python es open source, todos los usuarios del Python pueden contribuir a su desarrollo y divulgación.
Además, no es necesario pagar ninguna licencia para distribuir el software desarrollado con esté
lenguaje.
Fue creado por Guido van Rossum y su nombre se debe a la afición de su creador a los humoristas
británicos Monty Python.
Se trata de un lenguaje de programación en scripts, competencia directa de Perl.
Python permite dividir el programa en módulos reutilizables desde otros programas Python.
23
Colegio de Ingenieros Electricistas y Electrónicos
También viene con una gran colección de módulos estándar que proporcionan E/S de ficheros,
llamadas al sistema, sockets, interfaces GUI, etc.
Los scripts de Python tienen la extensión de archivo .PY, que pueden ser parseados y ejecutados
inmediatamente.
Permite grabar programas compilados con extensión de archivo .PYC, los cuales suelen ser
usados como módulo que pueden ser referenciados por otros programas Python.
Python nació de la mano de Guido van Rossum, un programador de origen holandés que desarrolló
este lenguaje de programación a finales de los años 80 para el Centro para las Matemáticas y la
Informática de los Países Bajos que buscaba un lenguaje de programación para ser utilizado bajo
el sistema operativo Amoeba de Andrew S. Tanenbaum que fuese capaz de sustituir al lenguaje
ABC. ¿Y qué es Python? Un lenguaje de programación de alto nivel que fue diseñado con una
sintaxis muy limpia que permitiese obtener códigos que fuesen fáciles de leer, es multiplataforma
y soporta orientación a objetos, programación imperativa e, incluso, programación funcional.
Con un nombre que era un guiño al grupo de humoristas Monty Python, Van Rossum asumió el papel
del BDFL de Python y siguió a la cabeza de los desarrollos de este lenguaje. En 1991, Van Rossum
publicó la versión 0.9.0 del lenguaje en el que aparecían clases con herencia o excepciones, en
1994 se formó el primer foro de discusión alrededor de este lenguaje además de lanzarse, en el
mes de enero, la versión 1.0 del lenguaje (que incluía herramientas para programación funcional).
En 1995, Van Rossum dejó el Centro para las Matemáticas y la Informática de los Países Bajos
y se marchó a Estados Unidos a continuar el desarrollo de Python en la Corporation for National
Research Initiatives hasta que en el año 2000, Van Rossum y su equipo de desarrolladores se
marcharon a BeOpen.com donde lanzaron Python 2.0 (que incluía un recolector de basura) hasta
marcharse, de nuevo, a Digital Creations (ambos movimientos motivados por la idea de trabajar
en software comercial).
Python está presente en muchas de las aplicaciones y servicios que utilizamos de manera habitual,
por ejemplo, el cliente oficial de Dropbox está desarrollado en Python, el Software Center de
Ubuntu, el gestor de ebooks Calibre (que está escrito en Python y en C), el servicio de streaming
Flumotion, el gestor de listas de correo Mailman o, incluso, YouTube también lo utiliza.
24
Colegio de Ingenieros Electricistas y Electrónicos
• Herencia múltiple.
• Ligadura dinámica.
• Polimorfismo.
Su núcleo es también orientado a objetos: jerarquía de clases.
Portable: está implementado en C estándar usando E/S Posix.
Gratuito, y de libre distribución.
Las desventajas del Python las extractamos de la referencia [13].
Podemos suponer que la mayoría de los programas escritos hoy en día podrían pasarse a
Python, pero él sólo no sería suficiente para la cantidad de aplicaciones que están orientadas a
componentes compilados.
Por ejemplo, no está indicado para las siguientes aplicaciones:
2 Algoritmos de compresión de datos:
Estos algoritmos traducen un flujo de datos a una forma más pequeña.
Esto implica examinar cada byte, y hacer un tratamiento estadístico. Para grandes cantidades de
datos los compresores escritos en Python resultan demasiado lentos.
2 Controladores de dispositivos:
Al igual que antes, una aplicación que realice millones de operaciones en punto flotante no
uniformes será demasiado lenta en Python. 2 Operaciones críticas de bases de datos.
2 Operaciones altamente especializadas.
IMPLEMENTACIÓN DE SCRIPT.
A partir de la versión 15.1.6, se tiene la opción del uso de script para la automatización en el
análisis de los sistemas eléctricos de potencia.
Para empezar el uso de script de Python, se requiere la instalación del Python versión 3.2.2 que
se encuentra en el subdirectorio PYTHON al interior del directorio donde se instaló el Digsilent.
Figura Nº 1: Entorno de trabajo para crear Script.
25
Colegio de Ingenieros Electricistas y Electrónicos
Figura Nº 2: Selección en Digsilent para trabajar con script del Python.
Para el trabajo de forma interactiva con el Excel, se requiere la instalación de la librería winpy32
que debe ser compatible con la versión del Python.
26
Colegio de Ingenieros Electricistas y Electrónicos
# Programa de flujos de carga en forma interactiva con el Excel
import powerfactory
app=powerfactory.GetApplication()
# se invoca al win32 para interactuar con el Excel
from win32com import client
excel=client.Dispatch(“Excel.Application”)
excel.visible=True
wb = excel.Workbooks.open(“c:\python33\Redes.xlsx”)
ws=wb.Worksheets[0]
lineas = app.GetCalcRelevantObjects(“*.ElmLne”)
demandas = app.GetCalcRelevantObjects(“*.ElmLod”)
ldf = app.GetFromStudyCase(“ComLdf”)
ldf.Execute()
ws.Cells(1,1).Value=”Line Name”
ws.Cells(1,2).Value=”loading [%]”
ws.Cells(1,6).Value=”Nombre Carga”
ws.Cells(1,7).Value=”MW”
ws.Cells(1,8).Value=”MVAr”
j,t=1,1
for linea in lineas:
if linea.outserv == 0:
linea_c = round(linea.GetAttribute(‘c:loading’),2)
ws.Cells(j+1,1).Value=str(linea.loc_name)
ws.Cells(j+1,2).Value=linea_c
j=j+1
for demanda in demandas:
if demanda.outserv == 0:
ws.Cells(t+1,6).Value=str(demanda.loc_name)
ws.Cells(t+1,7).Value=str(demanda.plini)
ws.Cells(t+1,8).Value=str(demanda.qlini)
t=t+1
wb.Close(True)
En el anterior script se invoca a la librería win32 para la interacción con el Excel, se abre el
archivo Redes.xlsx para trabajo interactivo con el Digsilent.
Con la siguiente instrucción se accede al objeto líneas del Digsilent:
lineas = app.GetCalcRelevantObjects(“*.ElmLne”)
Con la siguiente instrucción se graban datos en el Excel:
ws.Cells(1,1).Value=”Line Name”
Para acceder a los atributos del objeto línea en forma secuencial, se considera la siguiente
instrucción:
for linea in lineas:
La siguiente instrucción se utiliza para verificar las líneas que se encuentran en servicio:
if linea.outserv == 0:
Para acceder al valor del atributo del estado de carga de la línea, se utiliza la siguiente instrucción:
linea_c = round(linea.GetAttribute(‘c:loading’),2)
Con la siguiente instrucción se accede al valor del atributo de la potencia del objeto demanda y se
almacena en el Excel (en este caso se está obteniendo el valor de la potencia activa de la carga):
ws.Cells(t+1,7).Value=str(demanda.plini)
Con la siguiente instrucción se cierra el archivo abierto del Excel y se guardan los cambios
realizados.
wb.Close(True).
27
Colegio de Ingenieros Electricistas y Electrónicos
Para acceder a los diferentes objetos del Digsilent como transformadores, buses, generadores,
etc., se puede realizar la consulta en el Digsilent y conocer los atributos y su forma de invocar a
las diferentes variables.
Una alternativa para el análisis numérico, el uso de matrices en forma intensiva, el uso de gráficos,
el uso de números complejos, etc., es el software Python que presenta funcionalidades similares
al Matlab. Para el trabajo con matrices y cálculos numéricos, se requiere la instalación de la
librería numpy que se dispone de manera gratuita y libre en el internet, para mayor referencia
consultar la referencia [11] de la bibliografía del presente documento.
28
Colegio de Ingenieros Electricistas y Electrónicos
penaliza = np.zeros((Npob,1))
# se genera los vectores inf y sup de orden Npob x1
inf = 30*aux
sup = 50*aux
# genera poblacion inicial
pob = inf+(sup-inf)*pob
# se asignan los valores de la constante “a” de las funciones de costo de los tres generadores
que se presentan en la tabla Nº 1
a = np.array([[40,50,45]])
b = np.array([[4.50,3.50,3.3]])
c = np.array([[0.015,0.010,0.02]])
pg = pob[:,0:3]
pg[:,2] = Pd-pg[:,0]-pg[:,1]
# se calcula el costo de los tres generadores y de la cantidad
# de Npob individuos.
costo = a + b*pg + c*pg**2
pob[:,3] = costo[:,1]+costo[:,0]+costo[:,2]+penaliza[:,0]
# se ordena la matriz pob de menor a mayor
pob = pob[pob[:,3].argsort(),]
En el anterior script, se puede apreciar que las operaciones matriciales son similares a las
utilizadas en el Matlab.
Para la generación de números aleatorios entre 0 y se utiliza la siguiente instrucción:
pob = np.random.rand(Npob,4)
Para almacenar los valores de la potencia generada 3, como la diferencia de la demanda menos
las potencias generadas 1 y 2, se utiliza la siguiente instrucción:
pg[:,2] = Pd-pg[:,0]-pg[:,1]
Se hace notar que se esta trabajando con matrices de Npob filas (en el ejemplo es 600).
Para el cálculo del costo de los tres generadores del ejemplo, se utiliza la siguiente instrucción:
costo = a + b*pg + c*pg**2
Para ordenar la matriz pob respecto a la columna 4, se utiliza la siguiente instrucción:
pob = pob[pob[:,3].argsort(),]
Los resultados obtenidos del ejemplo son los siguientes:
𝑃𝑃𝑃𝑃1 = 30 MW, 𝑃𝑃𝑃𝑃2 = 48,15 MW, 𝑃𝑃𝑃𝑃3 = 41,12 MW.
Para mayor referencia del uso de algoritmos genéticos para el despacho económico, consultar la
referencia [7] de la bibliografía del presente documento.
Los paquetes Numpy y Scipy pueden convertirlo, con poco trabajo, en un sustituto completo
a programas prohibitivamente caros pero de uso común en este ámbito como otros que son
utilizados para el cálculo numérico y en particular en el área de la ingeniería.
Hay que destacar que las librerías mencionadas son de uso gratuito y pueden ser obtenidas
fácilmente en el internet.
Así también si se dispone de programas basados en Python, que puede conectarlo a una
secuencia de comandos de MATLAB, existe la opción del uso del conversor de código abierto de
MATLAB-a-Python, que se puede probar en línea.
ArcGIS es un sistema que permite recopilar, organizar, administrar, analizar, compartir y distribuir
información geográfica. Como la plataforma reconocida a nivel global para crear y utilizar sistemas
de información geográfica (SIG), ArcGIS es utilizada para poner el conocimiento geográfico al
servicio de los sectores del gobierno, la empresa, la ciencia, la educación y los medios. ArcGIS
permite publicar la información geográfica para que esté accesible para usuarios que utilicen y
30
Colegio de Ingenieros Electricistas y Electrónicos
tengan conocimiento del SIG. El sistema está disponible en lugares a través de navegadores Web,
dispositivos móviles como smartphones y equipos de escritorio. El sistema ArcGIS hace posible
que información geográfica autorizada creada por la comunidad SIG pueda ser aprovechada
fácilmente y de forma gratuita. Este sistema incluye software, una infraestructura on-line basada
en la nube, herramientas profesionales, recursos configurables como plantillas de aplicación,
mapas base listos para utilizar y contenido propio compartido por la comunidad de usuarios. La
compatibilidad con las plataformas de servidor y de la nube posibilitan la colaboración y el uso
compartido, lo que garantiza que la información vital para la planificación y la toma de decisiones
está disponible de inmediato para los usuarios.
Una de las ventajas que tiene ArcGis es que utiliza un paquete relacionado con Python
denominado “ArcPy”. ArcPy es un paquete de sitio que se basa en el exitoso módulo arcgis scripting.
Su objetivo es crear la piedra angular para una manera útil y productiva de realizar análisis de
datos geográficos, conversión de datos, administración de datos y automatización de mapas con
Python. Este paquete proporciona una rica experiencia en Python nativa, que ofrece finalización
de código así como documentación de referencia para cada función, módulo y clase.
31
Colegio de Ingenieros Electricistas y Electrónicos
Figura Nº 6: Identificación de un Municipio del Departamento de La Paz
CONCLUSIONES.
De acuerdo a los ejemplos de script para la interacción con el Digsilent, se concluye que es
posible acceder a los objetos como líneas y demandas, para modificar, así también se verifico
32
Colegio de Ingenieros Electricistas y Electrónicos
que es posible realizar el análisis de flujos de carga por ejemplo. Se destaca la importancia de
poder automatizar los análisis de los sistemas eléctricos de potencia con la combinación del
Python el Digsilent.
Se verifica también, el uso de la librería matplotlib, para realizar gráficas y su sencillez y simplicidad
en la programación en Python.
Se verifica el uso del ArcPy para trabajar en el entorno del ArcGIS, en el ejemplo analizado es
posible la extracción de datos del municipio considerado, de forma automática.
Finalmente recomendamos el uso del Python en el análisis de los sistemas eléctricos, análisis
numérico, etc., sobre todo a los estudiantes que son los que pueden profundizar y expandir el
uso del Python.
REFERENCIA BIBLIOGRÁFICA.
[1] Gonzalo Oscar Eulate Choque, “Flujo óptimo de potencia”, Revista Electromundo Nº 44, La
Paz Bolivia, marzo 1995.
[2] Gonzalo Oscar Eulate Choque, “Factores de distribución en el análisis de los sistemas eléctricos
de potencia”, Revista Electromundo Nº 62, La Paz Bolivia, mayo 2011.
[3] Gonzalo Oscar Eulate Choque, “Análisis de Flujos de Carga mediante el uso de Técnicas
Heurísticas”, Tesis de Maestría UMSA, La Paz Bolivia, marzo 2013.
[4] Gonzalo Oscar Eulate Choque, “Análisis de Flujos de Carga mediante el uso de Técnicas
Heurísticas”, Tesis de Maestría UMSA, La Paz Bolivia, marzo 2013.
[5] Gonzalo Oscar Eulate Choque, “Análisis de Flujos de Carga mediante el uso de Técnicas
Heurísticas”, Tesis de Maestría UMSA, La Paz Bolivia, marzo 2013.
[6] Gonzalo Oscar Eulate Choque, “Análisis de Flujos de Carga mediante Algoritmos Genéticos”,
Revista Electromundo Nº 69, La Paz Bolivia, marzo 2013.
[7] Gonzalo Oscar Eulate Choque, “Despacho económico de carga mediante el uso de Algoritmos
Genéticos en el software Digsilent”, Revista Electromundo No 74, ISSN 2220-5276. La Paz
Bolivia, julio 2015.
[8] Dr. Adrian Will “Algoritmos Genéticos y Optimización Heurística”, apuntes de clases. Grupo de
Aplicaciones de Inteligencia Artificial Universidad Nacional de Tucumán, 290 páginas.
[9] Digsilent GmbH, “Python Tutorial, Digsilent Technical Documentaction”, DIgSILENT
PowerFactory, Aplication Guide Power Factory Version 15.2. 2014, 42 páginas. En línea: http://
documents.tips/documents/python-tutorial-560f11ef2caba.html.
[10] 2016 GitHub, Inc., “Python scripting for PowerFactory”, Python for PowerFactory, 2015, en
línea: https://github.com/susantoj/powerfactory_python.
[11] José María Herrera Fernández, Luis Miguel Sánchez Brea “Computación científica con Python
para módulos de evaluación continua en asignaturas de ciencias aplicadas”, Esta página web
es una extracto del Proyecto de Innovación y Mejora de la Calidad Docente, en línea: http://
pendientedemigracion.ucm.es/info/aocg/python/modulos_cientificos/matplotlib/index.html.
[12] Eugenia Bahit “Curso: Python para Principiantes”, safeCreative 1207302042960. Buenos Aires
Argentina 2012, 136 páginas. En línea: www.eugeniabahit.com.
[13] Francisco Barranco Espósito, Antonio Guerrero Galindo, Manuel entrena Casas y Álvaro
González Nonay “Introducción a Python”, España 2012, 56 páginas. En línea: http://lsi.ugr.
es/~pdo/Seminarios/Python2005.pdf
33
Colegio de Ingenieros Electricistas y Electrónicos
AUTORES.
Ingeniero Electricista, Magister Sc en Ingeniería del Software, Docente Universidad Mayor de San
Andrés, Trabaja en el Sistema Nuevo de la Empresa de Electricidad La Paz S.A., DELAPAZ, áreas
de interés: Regulación de Electricidad, Inteligencia Artificial, Sistemas Eléctricos de Distribución,
Senior Member IEEE. Estudios de Postgrado en Administración de Empresas, Planificación,
Protección de Redes de Distribución, Métodos Numéricos de la Simulación y Modelación,
Análisis de los Regímenes de las Redes de Distribución, Economía Informática, Ingeniería del
Software. Este artículo dedico a mi señora madre Valentina Choque de Eulate, por su invaluable
colaboración en mi formación personal y profesión y a la memoria de mi señor padre Benigno
Eulate Chambi.
Página web: http://geulate.okicode.com
Email: [email protected]
ANEXO 1
import numpy as np
Npob, Ngen, Pd = 600, 100, 120
pob = np.random.rand(Npob,4)
aux = np.ones((Npob,1))
penaliza = np.zeros((Npob,1))
inf , sup = 30*aux, sup = 50*aux
#genera poblacion inicial
pob = inf+(sup-inf)*pob
a = np.array([[40,50,45]])
b = np.array([[4.50,3.50,3.3]])
c = np.array([[0.015,0.010,0.02]])
for t in range(1,Ngen+1):
pg = pob[:,0:3]
pg[:,2] = Pd-pg[:,0]-pg[:,1]
costo = a + b*pg + c*pg**2
34
Colegio de Ingenieros Electricistas y Electrónicos
pob[:,3] = costo[:,1]+costo[:,0]+costo[:,2]+penaliza[:,0]
pob = pob[pob[:,3].argsort(),]
#realiza el cruce
padres = np.random.randint(1, 0.4*Npob,0.4*Npob)
padres1 = padres[0:0.2*Npob,]
padres2 = padres[0.2*Npob:0.4*Npob,]
#print pob
ax = np.random.rand()
A = ax*pob[padres1,] + (1-ax)*pob[padres2,]
B = (1+ax)*pob[padres1,] - ax*pob[padres2,]
C = ax*pob[padres1,] + (1+ax)*pob[padres2,]
pob[0.4*Npob:0.6*Npob,] = A
pob[0.6*Npob:0.8*Npob,] = B
pob[0.8*Npob:Npob,] = C
#penaliza a los individuos que están fuera de los limites
penaliza = np.zeros((Npob,1))
for i in range(0,Npob):
for j in range(0,3):
if pob[i,j] < 30:
penaliza[i,0] = penaliza[i,0] + 1000
if pob[i,j] > 50:
penaliza[i,0] = penaliza[i,0] + 1000
#calcula nuevamente el costo
pg = pob[:,0:3]
pg[:,2] = Pd-pg[:,0]-pg[:,1]
costo = a + b*pg + c*pg**2
pob[:,3] = costo[:,1]+costo[:,0]+costo[:,2]+penaliza[:,0]
pob = pob[pob[:,3].argsort(),]
#genera poblacion inicial
#el 20 % de los peores individuos
aux1 = np.random.rand(Npob,4)
aux1 = inf+(sup-inf)*aux1
n1 = 0.2*Npob
pob[n1:Npob,0:3] = aux1[n1:Npob,0:3]
print “resultado despacho economico”
print pob[1:20,:]
Python es un lenguaje de programación interpretado cuya filosofía hace hincapié en una sintaxis
muy limpia y que favorezca un código legible.