LibreOffice Con Python Para Cálculos Numéricos

download LibreOffice Con Python Para Cálculos Numéricos

of 19

Transcript of LibreOffice Con Python Para Cálculos Numéricos

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    1/19

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    2/19

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    3/19

    1. Introducción

    Aunque LibreOffice Calc brinda la posibilidad de crear algoritmos básicos para tratar

    con problemas de métodos numéricos (muy frecuentes en matemáticas e ingeniería),

    el lenguaje de Macros (OOoBasic) en ocasiones brinda unas estructuras de datos muy

    simples, que obligan a escribir mucho código para realizar tareas que en otros lenguajes

    resultarían simples.

    También se pueden usar los componentes de UNO (Universal Network Objects, objetos

    de red universales) para acceder a las funciones de Calc directamente, pero suele ser

    un proceso complejo y desalentador para quienes no tienen (y no les interesa tener)

    profundos conocimientos de LibreOffice.

    Lo ideal sería tener un lenguaje tan simple como OOoBasic pero que a la vez brinde

    mayores posibilidades de expresión sin aumentar la complejidad. Pues bien, esta opción

    existe, y consiste en usar python como lenguaje para programar las macros en LibreOffice

    Calc.

    Python es un lenguaje de programación con un conjunto de estructuras de datos mucho

    más amplio y versátil que OOoBasic, pero cuya sintaxis es igual de fácil. Con python se

    tiene la posibilidad de usar listas, conjuntos, diccionarios, clases,... dentro de las macros

    de LibreOffice, ampliando considerablemente la potencia de estas herramientas. Además,se pueden usar los numerosos módulos estándar, que ahorrarán la escritura de mucho

    código en algunos problemas de métodos numéricos.

    Aunque su funcionalidad dentro de las macros de LibreOffice puede ser limitada (por

    ahora), python puede facilitar enormemente el trabajo de cálculos numéricos en una hoja

    de cálculo. La mejor alternativa sería usar python y OOoBasic en conjunto, con lo cual

    se obtiene una funcionalidad completa.

    1

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    4/19

    2. ¿Qué es LibreOffice?

    LibreOffice es la mejor Suite Ofimática que el dinero no puede comprar.

    Comparada con Microsoft Office, puede realizar el 95 % de las tareas que hace esta, másun 100000000 % de funciones que sólo se pueden realizar con LibreOffice. La razón de esto

    es que LibreOffice es de código abierto, de manera que puedes cambiar la herramienta

    como quieras y hasta donde quieras. El único límite es la imaginación. Si además usas

    LibreOffice junto con GNU/Linux, puedes convertir a LibreOffice en el Dios de todas

    las herramientas de oficina.

    Concretamente, LibreOffice se describe como una suite de productividad moderna, fácil

    de usar y de código abierto, para procesar texto, hojas de cálculo, presentaciones y más.

    La utilidad de hojas de cálculo usada aquí se llama LibreOffice Calc en la versión 4.1.3.2.

    2

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    5/19

    3. ¿Qué es GNU/Linux?

    GNU/Linux es el mejor sistema operativo que el dinero no puede comprar.

    Comparado con Microsoft Windows, es más rápido, no tiene virus, es multitarea y mul-tiusuario, no cobra por la licencia, no cobra por actualizaciones, no roba tu información

    personal para enviarla a servidores remotos,... y más.

    Comparado con Mac OS, es multitarea y multiusuario, no te deja en la ruina económica,

    no te dice qué tipo de persona eres por usarlo (tú decides quién eres, por ejemplo una

    persona auténtica),... y más, aunque se reconoce la superioridad de Mac OS sobre Mi-

    crosoft Windows, ambos sistemas te cobran cifras astronómicas por darte mucho menos

    de lo que GNU/Linux te daría a precios ridículamente bajos (Ojo: no confundir valor

    con precio).

    Concretamente, Linux es un sistema operativo: un conjunto de programas que le permi-

    ten interactuar con su ordenador y ejecutar otros programas.

    Un sistema operativo consiste en varios programas fundamentales que necesita el orde-

    nador para poder comunicar y recibir instrucciones de los usuarios; tales como leer y

    escribir datos en el disco duro, cintas, e impresoras; controlar el uso de la memoria; y

    ejecutar otros programas. La parte más importante de un sistema operativo es el núcleo.

    En un sistema GNU/Linux, Linux es el núcleo. El resto del sistema consiste en otros

    programas, muchos de los cuales fueron escritos por o para el proyecto GNU.

    3

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    6/19

    4. ¿Qué es Python?

    Python es un lenguaje de programación multiparadigma (soporta programación orien-

    tada a objetos, programación imperativa y programación funcional). Es un lenguaje

    interpretado multiplataforma (se puede usar en Microsoft Windows, GNU/Linux, Unix

    y MacOS) y de tipado dinámico.

    El intérprete de Python viene pre-instalado en los sistemas tipo Unix (GNU/Linux y

    MacOS). Para los que usan Microsoft Windows deben buscarlo en google.

    4

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    7/19

    5. ¿Cómo usar python para escribir macros de

    LibreOffice?

    Una completa explicación de los principios conceptuales y técnicos del uso de python enLibreOffice puede encontrarse en internet. Sin embargo, el propósito del presente docu-

    mento es mantener las cosas lo más simple posible, y por tanto se hará una explicación

    del cómo (superficialmente) y se deja al lector la tarea de averiguar el qué y el por qué.

    La explicación que se da aquí funciona para la plataforma GNU/Linux, de modo que es

    preciso hacer algunas pequeñas modificaciones para que funcione para los usuarios de

    Windows y MacOS.

    Lo que se necesita esencialmente son cuatro elementos: 1) Una versión de LibreOffice

    4.1 o Superior, 2) Una versión del intérprete de python 2.7 o Superior, 3) El paquete

    python-uno y 4) El paquete libreoffice-script-provider-python. Estos paquetes se pueden

    instalar fácilmente desde el gestor de software o el emulador de terminal.

    Una vez instalados, los scripts de python se almacenarán en el directorio /usr/lib/libreof-

    fice/share/Scripts/python (en caso de que no sea así, es preciso revisar la configuración

    particular de libreoffice en su sistema). En este directorio se crearán los subdirectorios de

    trabajo que sean necesarios (hay que tener privilegios de administrador para realizar este

    tipo de tareas). En nuestro caso se creará el subdirectorio ’Matematicas’, para escribirlos scripts de ejemplo, para empezar se puede crear un fichero llamado ’Ejemplos.py’.

    Se recomienda hacer una lectura rápida a la documentación de python y LibreOffice

    para no quedar perdidos en los ejemplos, aunque si estas leyendo esto, seguramente ya

    sabes de qué va el asunto.

    5

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    8/19

    6. Algunos ejemplos explicativos

    6.1. Obtener (get) una celda para manipular su valor

    La función que captura una celda para obtener su valor u otorgarle otro es una de las más

    básicas y esenciales, pues permitirá interactuar con la primera hoja del documento Calc

    sobre el que estemos trabajando. En el fichero ’Ejemplos.py’ escribiremos esta función

    de la siguiente manera:

    Listing 1: Función CP

    def    CP(columna=0, f i l a =0):

    e s c r i t o r i o = XSCRIPTCONTEXT. ge tD es kt op ( )O b je t o = e s c r i t o r i o . g e tC u rr e nt C om po ne n t ( )

    H oj a = O b je t o . C u r r e n t C o n t r o l l e r . A c t i v e S h e e t

    C e ld a = H oj a . g e t C e l l B y P o s i t i o n ( c o lu mn a , f i l a )

    return   Celda

    6.2. Aplicar una función

    La siguiente función se encarga de leer un número entero de una celda, asignarlo a la

    variable x y retornar el resultado de aplicar f(x) = x^3+x+1

    Listing 2: Función f 

    def    f ( c o lu mn a =0 , f i l a = 0 ) :

    x =   i nt (CP(col umna , f i l a ) . V alue )

    F = x^3+x+1

    return   F

    6.3. Obtener el factorial de un número

    La función lee el número entero de una celda y retorna su factorial.

    6

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    9/19

    Listing 3: Funcion factorial

    def    f a c t o r i a l ( c olumna =0 , f i l a = 0) :

    x =   i nt (CP(col umna , f i l a ) . V alue )

    f a ct = 1

    i f    x > 0 :

    f o r   i   in range ( 1 , x + 1 ):

    f a c t   ∗= ireturn   f a c t

    6.4. Números armónicos

    La función escribe unos números, calcula los números armónicos  H N  =

    N n=1

    1

    n, y com-

    prueba la veracidad de los análisis matemáticos que establecen que   H N   ≈   ln (N ) +0,57721 para  N   grande.

    Listing 4: Funcion armonico

    def    armonico ( ) :

    import   math

    #O b t ie n e l o s d at os i n i c i a l e s  

    d at os = [ 1 , 1 00 , 1 00 0 , 1 00 00 , 1 00 0 00 0 ]#O b t i e n e l o s n um er os a r mo n ic o s  

    a r m o n i co s = [ ]

    f o r   dato   in   datos :

    n h = 0

    f o r   i   in range ( 1 , d a to + 1) :

    nh += 1/ i

    armon icos . append( nh)

    #O bt i en e l o s d a t o s d e c om pa ra ci on  

    d_comparacion = [ ]

    f o r   dato   in   datos :

    d_comparacion . append( math. l og ( dato )+0. 5772 1)

    #E s cr i be l a i nf or ma ci on en l a h oj a de c a l c u l o

    # −E s c r ib i r d at os i n i c i a l e s  f i l a = 0

    7

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    10/19

    col umna = 0

    CP( c olu mna , f i l a ) . S t r i n g = "N"

    f i l a += 1

    f o r   dato   in   datos :

    CP( c o lu mn a , f i l a ) . V al ue = d a t of i l a += 1

    # −E s c r i b i r n um er os a r mo n ic o s  f i l a = 0

    col umna = 1

    CP(col umna , f i l a ) . St ri ng = "H_N"

    f i l a += 1

    f o r   nh   in   armon icos :

    CP(col umna , f i l a ) . V alue = nhf i l a += 1

    # −E s c r i b i r v a l o r d e c om pa ra ci on  f i l a = 0

    col umna = 2

    CP( c o lu mn a , f i l a ) . S t r i n g = " Ln (N) + 0 , 5 7 72 1 "

    f i l a += 1

    f o r   d_c   in   d_comparacion :

    CP(col umna , f i l a ) . V alue = d_c

    f i l a += 1

    6.5. Una función a trozos

    La función recibe unos valores procedentes de dos celdas y calcula la siguiente expresión:

    T (a, x) =

    a ln (x)   si x > 0

    cosa

    x

    + sin

    a

    x

    + ex si x

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    11/19

    a = CP(col _a , f i l _ a ) . V alue

    x = CP(col_ x , f i l _ x ) . V alue

    Resul tado = N one

    i f    x > 0 :

    R e s u l t a d o = a   ∗   math. log ( x)e l i f    x < 0 :

    Resu ltad o = math. cos ( a/x)+math. si n ( a/x)+math. exp( x)

    e l s e :

    R e s u l t a d o = 0

    return   R e s u l t a d o

    6.6. Estadísticas básicas

    La función genera unos valores de prueba, calcula algunos datos estadísticos básicos y

    luego escribe la información en la hoja de cálculo.

    Listing 6: Funcion estadistica

    def    e s t a d i s t i c a ( ) :

    import   random

    import   math

    #Gen er ar 20 v a l o r e s d e p ru eb a  

    v a l o r e s = [ ]

    f o r   i   in range ( 2 0 ) :

    v a l o re s . append( random. uni form (0 , 1 00 ))

    #E s t a d i s t i c a s b a s i ca s  

    # −Maximomaximo =   max( v a l o r e s )

    # −Minimo

    minimo =   min( v a l o r e s )# −Promediopromedi o =   sum( v a l o r e s ) / len ( v a l o r e s )

    # −Varianza v l r _ v = 0

    f o r   v a l o r   in   v a l o r e s :

    vlr_v += math. pow( ( v a l o r  −   promedi o ) , 2)

    9

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    12/19

    v a ri a nz a = v lr _v / ( len ( v a l o r e s )  −   1)# −D e sv i a ci o n e s t a nd a r  desv _ est = math . sq rt ( v ar i an za )

    #ESCRIBIR LA INFORMACION 

    # −E s c r i b i r v a l o r e s de p ru eb a  f i l a = 0

    col umna = 0

    CP( c o lu mn a , f i l a ) . S t r i n g = " X_i "

    f i l a += 1

    f o r   dato   in   v a l o r e s :

    CP( c o lu mn a , f i l a ) . V al ue = d a t of i l a += 1

    # −E s c r ib i r e s t a d i s t i c a s b a s i c a s  CP(2 , 2 ). Stri ng = "Maximo : "

    CP( 3 ,2 ) . Value = maximo

    CP(2 , 3) . St ri ng = "Minimo : "

    CP( 3 ,3 ) . Value = minimo

    CP(2 , 4 ). St ri ng = " Promedio : "

    CP(3 , 4 ). V alue = promedi o

    CP(2 , 5 ). Stri ng = " V ari anza : "

    CP ( 3 , 5 ) . V al ue = v a r i a n z a

    CP ( 2 , 6 ) . S t r i n g = " D es . E s t a n da r : "

    CP(3 , 6 ). V alue = desv _ est

    6.7. Algunas funciones interesantes presentes en el módulo math

    de python

    factorial(x):  Devuelve el factorial de x

    gamma(x):  Devuelve la función gamma de x

    hypot(x,y):  Devuelve la distancia euclidiana (√ 

    x2 + y2)

    10

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    13/19

    e:  Número e (2.718281828459045)

    pi:   Número  π  ( 3.141592653589793)

    6.8. Otros módulos de python

    Algunos módulos adicionales de python son:

    python-simpy:  Lenguaje de simulación de eventos discretos basados en procesos

    pytho-glpk:  Interfaz para resolver problemas de programación lineal a gran escala

    python-numpy:  Herramienta para operar con vectores n-dimensionales

    python-sympy:  CAS(Computer Algebra System) para python

    python-patsy:  Libreria para describir modelos estadísticos

    Con estos y otros módulos, puedes convertir a tus macros de LibreOffice en unas herra-

    mientas muy potentes y prácticamente ilimitadas.

    11

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    14/19

    7. Conclusiones

    Es posible escribir macros en LibreOffice con el lenguaje python, de una manera

    igual de sencilla y agradable que OOoBasic, pero con toda la potencia y versatilidad

    de un lenguaje de programación profesional.

    Las macros escritas en python pueden extender enormemente la capacidad de las

    hojas de cálculo de LibreOffice.

    12

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    15/19

    Referencias

    [1] Wikipedia: La enciclopedia libre. GNU/Linux.

    http://es.wikipedia.org/wiki/GNU/Linux?oldid=78087514. Fecha de acceso: 11 nov

    2014.

    [2] Wikipedia: La enciclopedia libre. Software libre.

    http://es.wikipedia.org/wiki/Software_libre?oldid=78063707. Fecha de acceso:

    mié 12 nov 2014.

    [3] Wikipedia: La enciclopedia libre. Python. http://es.wikipedia.org/w/index.php?oldid=75999492.

    Fecha de acceso: vie 15 ago 2014.

    13

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    16/19

    A. Script de cálculos matemáticos

    Aquí se anexa el script completo con todos los ejemplos.

    Listing 7: Ejemplo - Calculos matematicos

    import   uno

    def    CP(columna=0, f i l a =0):

    e s c r i t o r i o = XSCRIPTCONTEXT. ge tD es kt op ( )

    O b je t o = e s c r i t o r i o . g e tC u rr e nt C om po ne n t ( )

    H oj a = O b je t o . C u r r e n t C o n t r o l l e r . A c t i v e S h e e t

    C e ld a = H oj a . g e t C e l l B y P o s i t i o n ( c o lu mn a , f i l a )

    return   Celda

    def    f ( c o lu mn a =0 , f i l a = 0 ) :

    x =   i nt (CP(col umna , f i l a ) . V alue )

    F = x^3+x+1

    return   F

    def    f a c t o r i a l ( c olumna =0 , f i l a = 0) :

    x =   i nt (CP(col umna , f i l a ) . V alue )

    f a ct = 1

    i f    x > 0 :

    f o r   i   in range ( 1 , x + 1 ):

    f a c t   ∗= ireturn   f a c t

    def    armonico ( ) :

    import   math

    #O b t ie n e l o s d at os i n i c i a l e s  d at os = [ 1 , 1 00 , 1 00 0 , 1 00 00 , 1 00 0 00 0 ]

    #O b t i e n e l o s n um er os a r mo n ic o s  

    a r m o n i co s = [ ]

    f o r   dato   in   datos :

    n h = 0

    f o r   i   in range ( 1 , d a to + 1) :

    14

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    17/19

    nh += 1/ i

    armon icos . append( nh)

    #O bt i en e l o s d a t o s d e c om pa ra ci on  

    d_comparacion = [ ]

    f o r   dato   in   datos :d_comparacion . append( math. l og ( dato )+0. 5772 1)

    #E s cr i be l a i nf or ma ci on en l a h oj a de c a l c u l o

    # −E s c r ib i r d at os i n i c i a l e s  f i l a = 0

    col umna = 0

    CP( c olu mna , f i l a ) . S t r i n g = "N"

    f i l a += 1

    f o r   dato   in   datos :CP( c o lu mn a , f i l a ) . V al ue = d a t o

    f i l a += 1

    # −E s c r i b i r n um er os a r mo n ic o s  f i l a = 0

    col umna = 1

    CP(col umna , f i l a ) . St ri ng = "H_N"

    f i l a += 1

    f o r   nh   in   armon icos :

    CP(col umna , f i l a ) . V alue = nh

    f i l a += 1

    # −E s c r i b i r v a l o r d e c om pa ra ci on  f i l a = 0

    col umna = 2

    CP( c o lu mn a , f i l a ) . S t r i n g = " Ln (N) + 0 , 5 7 72 1 "

    f i l a += 1

    f o r   d_c   in   d_comparacion :

    CP(col umna , f i l a ) . V alue = d_c

    f i l a += 1

    def    T( c o l_ a =0 , f i l _ a =0 , c ol _x =0 , f i l _ x = 1 ):

    import   math

    15

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    18/19

    a = CP(col _a , f i l _ a ) . V alue

    x = CP(col_ x , f i l _ x ) . V alue

    Resul tado = N one

    i f    x > 0 :

    R e s u l t a d o = a   ∗   math. log ( x)e l i f    x < 0 :

    Resu ltad o = math. cos ( a/x)+math. si n ( a/x)+math. exp( x)

    e l s e :

    R e s u l t a d o = 0

    return   R e s u l t a d o

    def    e s t a d i s t i c a ( ) :

    import   randomimport   math

    #Gen er ar 20 v a l o r e s d e p ru eb a  

    v a l o r e s = [ ]

    f o r   i   in range ( 2 0 ) :

    v a l o re s . append( random. uni form (0 , 1 00 ))

    #E s t a d i s t i c a s b a s i ca s  

    # −Maximomaximo =   max( v a l o r e s )

    # −Minimominimo =   min( v a l o r e s )

    # −Promediopromedi o =   sum( v a l o r e s ) / len ( v a l o r e s )

    # −Varianza v l r _ v = 0

    f o r   v a l o r   in   v a l o r e s :

    vlr_v += math. pow( ( v a l o r

     −  promedi o ) , 2)

    v a ri a nz a = v lr _v / ( len ( v a l o r e s )  −   1)# −D e sv i a ci o n e s t a nd a r  desv _ est = math . sq rt ( v ar i an za )

    #ESCRIBIR LA INFORMACION 

    16

  • 8/18/2019 LibreOffice Con Python Para Cálculos Numéricos

    19/19

    # −E s c r i b i r v a l o r e s de p ru eb a  f i l a = 0

    col umna = 0

    CP( c o lu mn a , f i l a ) . S t r i n g = " X_i "

    f i l a += 1f o r   dato   in   v a l o r e s :

    CP( c o lu mn a , f i l a ) . V al ue = d a t o

    f i l a += 1

    # −E s c r ib i r e s t a d i s t i c a s b a s i c a s  CP(2 , 2 ). Stri ng = "Maximo : "

    CP( 3 ,2 ) . Value = maximo

    CP(2 , 3) . St ri ng = "Minimo : "

    CP( 3 ,3 ) . Value = minimoCP(2 , 4 ). St ri ng = " Promedio : "

    CP(3 , 4 ). V alue = promedi o

    CP(2 , 5 ). Stri ng = " V ari anza : "

    CP ( 3 , 5 ) . V al ue = v a r i a n z a

    CP ( 2 , 6 ) . S t r i n g = " D es . E s t a n da r : "

    CP(3 , 6 ). V alue = desv _ est

    g _ ex p or t ed S cr i pt s = f , f a c t o r i a l , a rmo nico , T, e s t a d i s t i c a ,

    17