<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>http://wiki.cima.fcen.uba.ar/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anthony.schrapffer</id>
	<title>Wikicima - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.cima.fcen.uba.ar/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anthony.schrapffer"/>
	<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php/Especial:Contribuciones/Anthony.schrapffer"/>
	<updated>2026-05-12T00:26:34Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1729</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1729"/>
		<updated>2020-01-08T14:11:03Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Cartopy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Presentaciones == &lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=1Dh0L63zBGkcva1k6YMCBNJRjXytxg-fQ Presentación]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=15e7yXxeUbgJ28KYdTj0cSkMoabSoFxNT Ejemplos python]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=17PTCQMhewB6RpPv_QZAPsTt52s3HnRWe Ejemplo xarray]&lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
Paquetes basicos:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalador de paquete pip:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3-pip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mas paquetes:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 install netcdf4 matplotlib pandas&lt;br /&gt;
 pip3 install xarray cartopy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IDE Spyder:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install spyder3&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver un tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
=== Comandos básicos ===&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Al usar slice(a,b) le estamos indicando que tome todos los valores comprendidos entre a y b. Si, además, le agregamos &amp;quot;-1&amp;quot;, slice(a,b,-1), le indicamos que nos de vuelta esa coordenada.&lt;br /&gt;
En estos datos de ERA5 vemos que la latitud viene por defecto de mayor a menor (como se vio en la metadata más arriba). Le agrego el -1 para dar vuelta la coordenada latitud y quede de menor a mayor, al igual que la longitud. Hacer esto es lo recomendado si al momento de graficar no queremos las figuras con el norte abajo. Lo hacemos al principio y nos olvidamos del problema.&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos, es posible que tengan que usar la opción &amp;quot;transform&amp;quot; si sus datos no están en la misma proyección. &lt;br /&gt;
 ax.contourf(lons, lats, temp)&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
 import matplotlib.ticker as mticker&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=llaves_ssh&amp;diff=1727</id>
		<title>llaves ssh</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=llaves_ssh&amp;diff=1727"/>
		<updated>2019-11-06T19:07:14Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hay distintos tipos de encriptación, pero una de las más usadas está basada en pares de llaves una pública y la otra privada. La idea básica es que una persona da su llave pública al mundo y sólo con su par llave privada puede des-encriptar la información [https://en.wikipedia.org/wiki/Public-key_cryptography Wiki_pari_keys_ecnription]&lt;br /&gt;
&lt;br /&gt;
En las compus se utiliza el mismo sistema. La herramienta de terminal más común es la &amp;lt;code&amp;gt;ssh&amp;lt;/code&amp;gt; ([https://fr.wikipedia.org/wiki/Secure_Shell Secure Shell]).&lt;br /&gt;
&lt;br /&gt;
Esta herramienta puede ser utilizada para no tener que estar introduciendo el pasword de usuario cada vez que se entra en un clúster... . La idea es senzilla, se mete la llave pública de la compu personal, en la lista de &#039;llaves autorizadas&#039; del clúster. &#039;&#039;&#039;NOTA: Si alguien entra en tu compu, accede libremente a todas las otras máquinas!!!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pasos:&lt;br /&gt;
# Desde el terminal de tu compu, generar el par de llaves de encriptación (para evitar problemas dejamos sin &amp;lt;code&amp;gt;passphrase&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh-keygen&lt;br /&gt;
Generating public/private rsa key pair.&lt;br /&gt;
Enter file in which to save the key (/home/anthony/.ssh/id_rsa): &lt;br /&gt;
Enter passphrase (empty for no passphrase): &lt;br /&gt;
Enter same passphrase again: &lt;br /&gt;
Your identification has been saved in /home/anthony/.ssh/id_rsa.&lt;br /&gt;
Your public key has been saved in /home/anthony/.ssh/id_rsa.pub.&lt;br /&gt;
The key fingerprint is:&lt;br /&gt;
SHA256:pAOz41atUhCkOOqmstoIfywaIICA3xz5O7nxebF1QDs anthony@anthony&lt;br /&gt;
The key&#039;s randomart image is:&lt;br /&gt;
(...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Aparece un directorio nuevo en el $HOME&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ls -lrt .ssh/&lt;br /&gt;
-rw-r--r-- 1 anthony anthony 3100 oct.  19 12:19 known_hosts&lt;br /&gt;
-rw-r--r-- 1 anthony anthony  397 nov.   2 16:09 id_rsa.pub&lt;br /&gt;
-rw------- 1 anthony anthony 1679 nov.   2 16:09 id_rsa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* * &amp;lt;code&amp;gt;id_rsa.pub&amp;lt;/code&amp;gt;: Es la llave pública&lt;br /&gt;
* * &amp;lt;code&amp;gt;id_rsa&amp;lt;/code&amp;gt;: Es la llave privada (fijarse que sólo el usuario puede leer el fichero)&lt;br /&gt;
* * &amp;lt;code&amp;gt;known_hosts&amp;lt;/code&amp;gt;: resgistro de las IPs de todas las máquinas que se ha accedido. Si el nombre de máquina no coincide con la IP de este fichero, da error y no se deja acceder a la máquina (por si alguien hackeó algo)&lt;br /&gt;
# Ahora queda introducir la llave pública en la máquina deseada. Cómo ejemplo &amp;lt;code&amp;gt;hydra&amp;lt;/code&amp;gt;. Se abre otra terminal y:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh anthony.schapffer@hydra.cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Seguramente no hay llaves públicas/privadas generadas. Mejor hacerlo...&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh-keygen&lt;br /&gt;
(...)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# En el directorio &amp;lt;code&amp;gt;.ssh&amp;lt;/code&amp;gt;, editar/crear un fichero que se llame &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;authorized_keys2&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ vim .ssh/authorized_keys2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Al final añadir exactamente (nunca abrir este fichero con Windows ya que introduce caracteres extraños!!!) el contenido en la otra terminal de la llave pública&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ vim .ssh/id_rsa.pub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Ya estamos! Asegurarse que el fichero &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;, sólo es leíble y modificable por el usuario!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ls .ssh/authorized_keys2&lt;br /&gt;
-rw------- 1 anthony.schrapffer cima 792  2 nov.  16:23 .ssh/authorized_keys2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Para cambiar los permisos&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ chmod u+rw .ssh/authorized_keys2&lt;br /&gt;
$ chmod g-rw .ssh/authorized_keys2&lt;br /&gt;
$ chmod a-rw .ssh/authorized_keys2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Ahora des de la otra terminal, verificar que no pide la contraseña para entrar en hydra&lt;br /&gt;
&lt;br /&gt;
== Uso de alias ==&lt;br /&gt;
Se puede evitar también la necesidad de introducir todo el texto de usuario@servidor a la hora de entrar en el clúster. Para evitar eso se usan `alias&#039;&lt;br /&gt;
&lt;br /&gt;
# Desde el home de la máquina editar el fichero &amp;lt;code&amp;gt;.bash_aliases&amp;lt;/code&amp;gt; y añadir (p.e. &amp;lt;code&amp;gt;hydra&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
       alias       hydra=&#039;ssh anthony.schrapffer@hydra.cima.fcen.uba.ar&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Después mirar si en el &amp;lt;code&amp;gt;.bashrc&amp;lt;/code&amp;gt; (script que se ejecuta cada vez que se abre una terminal) existe la línea:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source .bash_aliases&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Ahora para entrar en hydra, Anthony sólo tiene que:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ hydra&lt;br /&gt;
Last login: Thu Nov  2 16:23:35 2017 from 157.92.36.110&lt;br /&gt;
[anthony.schrapffer@hydra ~]$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1595</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1595"/>
		<updated>2019-06-25T15:28:14Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Cartopy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Presentaciones == &lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=1Dh0L63zBGkcva1k6YMCBNJRjXytxg-fQ Presentación]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=15e7yXxeUbgJ28KYdTj0cSkMoabSoFxNT Ejemplos python]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=17PTCQMhewB6RpPv_QZAPsTt52s3HnRWe Ejemplo xarray]&lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
Paquetes basicos:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalador de paquete pip:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3-pip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mas paquetes:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 install netcdf4 matplotlib pandas&lt;br /&gt;
 pip3 install xarray cartopy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IDE Spyder:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install spyder3&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver un tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
=== Comandos básicos ===&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
 import matplotlib.ticker as mticker&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1591</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1591"/>
		<updated>2019-06-13T19:02:25Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Presentaciones == &lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=1Dh0L63zBGkcva1k6YMCBNJRjXytxg-fQ Presentación]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=15e7yXxeUbgJ28KYdTj0cSkMoabSoFxNT Ejemplos python]&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=17PTCQMhewB6RpPv_QZAPsTt52s3HnRWe Ejemplo xarray]&lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
Paquetes basicos:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalador de paquete pip:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3-pip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mas paquetes:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 install netcdf4 matplotlib pandas&lt;br /&gt;
 pip3 install xarray cartopy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IDE Spyder:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install spyder3&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver este tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1585</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1585"/>
		<updated>2019-06-13T15:31:22Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Paquete a instalar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
Paquetes basicos:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalador de paquete pip:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3-pip&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mas paquetes:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 install netcdf4 matplotlib pandas&lt;br /&gt;
 pip3 install xarray cartopy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IDE Spyder:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install spyder3&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver este tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1584</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1584"/>
		<updated>2019-06-13T15:31:10Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Paquete a instalar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
Paquetes basicos:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalador de paquete pip:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install python3-pip&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mas paquetes:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 install netcdf4 matplotlib pandas&lt;br /&gt;
 pip3 install xarray cartopy&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IDE Spyder:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 sudo apt-get install spyder3&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver este tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1583</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1583"/>
		<updated>2019-06-13T15:12:17Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Paquete a instalar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
&lt;br /&gt;
apt-get install python3-pip&lt;br /&gt;
&lt;br /&gt;
pip3 install netcdf4 matplotlib pandas&lt;br /&gt;
&lt;br /&gt;
pip3 install xarray cartopy&lt;br /&gt;
&lt;br /&gt;
apt-get install spyder3&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver este tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1582</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1582"/>
		<updated>2019-06-13T15:07:05Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Paquete a instalar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
&lt;br /&gt;
apt-get install python3-netcdf4&lt;br /&gt;
&lt;br /&gt;
apt-get install python3-matplotlib python3-matplotlib-data python3-matplotlib-doc python3-pandas&lt;br /&gt;
&lt;br /&gt;
apt-get install python3-xarray python3-cartopy&lt;br /&gt;
&lt;br /&gt;
apt-get install spyder3&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver este tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1581</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1581"/>
		<updated>2019-06-13T15:06:20Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Si tienen sugerencias, correcciones o comentarios, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra se suele trabajar con muchos datos (observaciones, salidas de modelo, etc.) y para analizar estos datos y comunicar resultados vía gráficos o mapas uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas: esta página les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles un entendimiento básico de Python, y algunas herramientas prácticas para las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuarios cercanos o en línea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Paquete a instalar ==&lt;br /&gt;
apt-get install python3 python3-scipy python3-numpy&lt;br /&gt;
apt-get install python3-netcdf4&lt;br /&gt;
apt-get install python3-matplotlib python3-matplotlib-data python3-matplotlib-doc python3-pandas&lt;br /&gt;
apt-get install python3-xarray python3-cartopy&lt;br /&gt;
apt-get install spyder3&lt;br /&gt;
&lt;br /&gt;
== Historia ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre por la famosa serie de televisión &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;, pero la serpiente marcó más su imaginación y por esta razón el lenguaje termina adoptándola como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de Ciencias de la Tierra y muchas otras disciplinas. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no será más actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportes de usuarixs de todo el mundo en forma de paquetes fáciles de instalar. Estos paquetes se tuvieron que adaptar para python 3.x y esto ha retrasado su uso. Pero ahora este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por qué elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales está basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la gran comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039; por lo que no hay necesidad de definir todo lo que hacemos, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulando. Si dejamos a Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar desde 0, así el primer elemento de una lista, arreglo, etc. es el elemento 0 ! &lt;br /&gt;
* Los espacios a principio de línea cuentan para definir los bloques&lt;br /&gt;
* Se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que el resto de la línea sea considerada como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Esto permite&lt;br /&gt;
 Comentar sobre varias líneas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una línea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezar la línea siguiente a un nivel más alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variables se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se pueden escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la línea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante es la diferencia entre función y método, ambas pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudándose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitar el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en la terminal&lt;br /&gt;
* opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden investigar en el artículo siguiente los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales; y si el número no tiene decimales se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean (o tipo de dato lógico) son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;&#039;, y también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (más detalles en otra parte), lo que nos devuelve una matriz de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser vistos como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciados gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser modificados ni se pueden agregar nuevos elementos, hay que redefinir la lista si se quiere cambiar sus elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su índice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificadores pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionario&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificadores &lt;br /&gt;
 &lt;br /&gt;
D.values() devuelve la lista de los diferentes valores  &lt;br /&gt;
&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items  &lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loops: bucles ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el comando &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer un loop, mientras la condición siga siendo válida se sigue ejecutando el comando del loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tener cuidado con poder siempre salir del loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que por lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición para salir del bucle.&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de stop&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de manera eficiente hay otras herramientas disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables en memoria, pero cuando utilizamos una función sólo los elementos retornados quedan guardados en memoria.&lt;br /&gt;
Una vez que la función termina de ejecutarse, las variables locales son borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variables_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivel de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables. Si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y gestionar mejor los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que éste se detenga por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerías = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionador de paquetes para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatibles especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]. Se recomienda instalar todas las librerías deseadas de una vez en el mismo comando &amp;lt;code&amp;gt;conda install LYBRARY1 LYBRARY2 LIBRARY3&amp;lt;/code&amp;gt; para evitar conflictos de versiones&lt;br /&gt;
&lt;br /&gt;
*En general, se instalan automáticamente los paquetes necesarios para el funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== Numpy ==&lt;br /&gt;
Numpy es la librería más usada para gestionar matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones, diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de booleans indicando cuáles son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser  ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039;  para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039;  para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039;  son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039;  Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039;  Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NetCDF ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en Ciencias de la Tierra. Para más detalle ver : [https://www.unidata.ucar.edu/software/netcdf/ netCDF]&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: uno para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
xarray es un paquete de Python pensado para trabajar fácilmente con arreglos multidimensionales con etiquetas en forma de dimensiones, coordenadas y atributos. Es especialmente útil para trabajar con datos grillados georeferenciados, particularmente archivos netCDF.&lt;br /&gt;
&lt;br /&gt;
xarray toma funciones de Numpy y Pandas para trabajar fácil y eficientemente e integra la librería Dask para computación en paralelo y manejo de grandes archivos.&lt;br /&gt;
&lt;br /&gt;
Sitio web: http://xarray.pydata.org&lt;br /&gt;
&lt;br /&gt;
==== ¿A qué nos referimos con todo esto? ====&lt;br /&gt;
&lt;br /&gt;
xarray es capaz de leer la metadata incluída en los archivos netCDF y posee poderosas herramientas para fácilmente seleccionar variables, recortar dimensiones y hacer cálculos básicos pero laboriosos en una sola línea, entre otras cosas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo ===&lt;br /&gt;
Se puede ver este tutorial en formato html (abrir con el navegador) o de manera interactiva en Jupyter Notebook usando los archivos del siguiente link:&lt;br /&gt;
[https://drive.google.com/drive/folders/1fS0kf-fwpUrbbwaOa-mMfU5WH3enJtdW?usp=sharing Introducción a xarray en html y Jupyter Notebook]&lt;br /&gt;
&lt;br /&gt;
==== Abrir un archivo ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargamos los paquetes&lt;br /&gt;
 import xarray as xr&lt;br /&gt;
 &lt;br /&gt;
 # Abrimos un archivo&lt;br /&gt;
 data_xr = xr.open_dataset(&#039;total_precipitation_year_1980.nc&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Si es un .grib: (debemos tener los paquetes cfgrib y eccodes instalados)&lt;br /&gt;
 data_grib = xr.open_dataset(&#039;example.grib&#039;, engine=&#039;cfgrib&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Vemos la metadata&lt;br /&gt;
 data_xr&lt;br /&gt;
 &lt;br /&gt;
  &amp;lt;xarray.Dataset&amp;gt;&lt;br /&gt;
  Dimensions:    (latitude: 297, longitude: 201, time: 8784)&lt;br /&gt;
  Coordinates:&lt;br /&gt;
    * longitude  (longitude) float32 -83.0 -82.75 -82.5 ... -33.5 -33.25 -33.0&lt;br /&gt;
    * latitude   (latitude) float32 14.0 13.75 13.5 13.25 ... -59.5 -59.75 -60.0&lt;br /&gt;
    * time       (time) datetime64[ns] 1980-01-01 ... 1980-12-31T23:00:00&lt;br /&gt;
  Data variables:&lt;br /&gt;
      tp         (time, latitude, longitude) float32 ...&lt;br /&gt;
  Attributes:&lt;br /&gt;
      Conventions:  CF-1.6&lt;br /&gt;
      history:      2019-05-27 14:06:13 GMT by grib_to_netcdf-2.10.0: /opt/ecmw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos extraer la variable y sus dimensiones de esta forma&lt;br /&gt;
 tp = data_xr[&#039;tp&#039;] &lt;br /&gt;
 &lt;br /&gt;
 lon = data_xr[&#039;longitude&#039;]&lt;br /&gt;
 lat = data_xr[&#039;latitude&#039;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También se puede convertir, por ejemplo, un numpy array a un xarray usando:&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 data_xrnp = xr.DataArray(np.random.randn(2, 3), coords={&#039;x&#039;: [&#039;a&#039;, &#039;b&#039;]}, dims=(&#039;x&#039;, &#039;y&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo recortar un dominio espacial o temporal ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Recortamos el dominio&lt;br /&gt;
 tp_cut = tp.loc[{&#039;time&#039;:slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), &#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}]&lt;br /&gt;
&lt;br /&gt;
 # También se puede usar el método .sel() de manera similar&lt;br /&gt;
 tp_cut = tp.sel({time=slice(&#039;1980-03-01&#039;,&#039;1980-07-01&#039;), latitude=slice(-30,0,-1), longitude=slice(-60,-40)})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cálculos básicos ====&lt;br /&gt;
Los arreglos de xarray funcionan de manera similar a los de numpy, sumado a que ciertas operaciones se pueden hacer especificando los nombres de las dimensiones en lugar de sus índices.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Podemos calcular la media total en el tiempo de estas dos maneras:&lt;br /&gt;
 tp_mean = tp.mean(axis=0) # Porque sabemos que &#039;time&#039; es la primer coordenada, es decir la coordenada 0&lt;br /&gt;
 tp_mean = tp.mean(dim=&#039;time&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Graficamos directamente desde xarray (gráficos básicos para visualizar rápido)&lt;br /&gt;
 tp_mean.plot.pcolormesh(vmax=1, cmap=&#039;YlGnBu&#039;) # vmax es el máximo de la colorbar, cmap el mapa de colores&lt;br /&gt;
 &lt;br /&gt;
 [[Archivo: xarray_plot1.png]]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # También podemos hacer otras operaciones como suma&lt;br /&gt;
 tp_sum = tp.sum(dim=&#039;time&#039;)*1000&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupby y resample =====&lt;br /&gt;
xarray ya tiene manejo de dimensiones tipo calendario y nos brinda útiles herramientas para hacer cálculos en una sola línea&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Calcular el ciclo diurno medio:&lt;br /&gt;
 tp_hour_means = tp.groupby(&#039;time.hour&#039;).mean(axis=0)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Pasar a datos diarios&lt;br /&gt;
 tp_daily = tp.resample(time=&#039;1D&#039;).sum(axis=0) # o time=&#039;24H&#039;&lt;br /&gt;
 &lt;br /&gt;
 # Pasar a datos estacionales&lt;br /&gt;
 tp_seas = tp.resample(time=&#039;QS&#039;).mean(axis=0)  # QS : quarter start&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Guardar en un netCDF =====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para guardar en un archivo netCDF:&lt;br /&gt;
 tp_seas.to_netcdf(&#039;tp_seas.nc&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cómo cargar múltiples archivos y/o usar Dask ====&lt;br /&gt;
Lo que hace Dask es dividir en bloques nuestro dataset y realizar los cálculos de manera paralela, es decir, envía a cada núcleo del procesador uno de estos bloques y va calculando en simultáneo. Luego une el resultado final. Esto permite que sea mucho más rápido en sus cálculos al dividir el trabajo entre los múltiples núcleos del procesador. Se recomienda usarlo siempre que sus archivos sean pesados, ya que las funciones y métodos aplican de la misma forma que si uno no tuviera Dask activo y ganará en rendimiento al hacer cálculos.&lt;br /&gt;
&lt;br /&gt;
[[Archivo: Bloques.png]]&lt;br /&gt;
&lt;br /&gt;
Para activar dask usar la opción &#039;chunks&#039; dentro de .open_dataset().&lt;br /&gt;
&lt;br /&gt;
El método .open_mfdataset() abre múltiples archivos y ya activa Dask asignando por defecto un bloque = un archivo, pero conviene especificar &#039;chunks&#039; para que sea más eficiente al calcular. En el sitio de xarray recomiendan que cada bloque contenga aproximadamente un millón de elementos.&lt;br /&gt;
&lt;br /&gt;
Al abrir una serie de archivos con .open_mfdataset() automáticamente se concatenan a lo largo de las dimensiones posibles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Abrir un dataset de múltiples archivos (poner * como wildcard)&lt;br /&gt;
 data_mf = xr.open_mfdataset(&#039;total_precipitation_year_198*.nc&#039;, chunks={&#039;time&#039;:20})&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
xarray con Dask activado funciona de forma &amp;quot;perezosa&amp;quot; o &amp;quot;lazy&amp;quot;, quiere decir que no hace ningún cómputo hasta que le pedimos los datos explícitamente (al graficar, guardar en un archivo o con .compute())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # De esta forma no se hace el cómputo todavía&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0)&lt;br /&gt;
 &lt;br /&gt;
 # Si especifico .compute() sí hace el cáculo:&lt;br /&gt;
 tp_mfmean = data_mf[&#039;tp&#039;].loc[{&#039;latitude&#039;:slice(-30,0,-1), &#039;longitude&#039;:slice(-60,-40)}].mean(axis=0).compute()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Otros ====&lt;br /&gt;
Eso es todo por ahora! &lt;br /&gt;
Hay muchas otras herramientas para hacer selecciones de los datos, transformar los arreglos, mover o modificar las coordenadas, etc. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
Concatenar, unir, combinar:&lt;br /&gt;
 Para combinar datasets o data arrays a lo largo de una dimensión: xr.concat()  &lt;br /&gt;
 Para combinar datasets con distintas variables: xr.merge()  &lt;br /&gt;
 Para combinar datasets o data arrays con diferentes índices o valores faltantes: xr.combine()  &lt;br /&gt;
 http://xarray.pydata.org/en/stable/combining.html  &lt;br /&gt;
&lt;br /&gt;
Interpolar:  &lt;br /&gt;
&lt;br /&gt;
Con el método .interp() podemos interpolar un DataArray a una nueva grilla, mientras que con .interp_like() podemos interpolar un DataArray a las coordenadas de otro DataArray. Este método utiliza los métodos de interpolación del paquete Scipy, los cuales son métodos simples (lineal, cúbica).&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidades con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en pulgadas&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== Cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con mapas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada y entonces porque no empezar directamente con cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejos = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (recuerde que python es de alto nivel, es bastante flexible con la estructura de los códigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1455</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1455"/>
		<updated>2019-06-07T18:41:21Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Diferencia con Procesadores de Texto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1454</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1454"/>
		<updated>2019-06-07T18:41:12Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Gedit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1453</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1453"/>
		<updated>2019-06-07T18:40:59Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Gedit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gedit.png|center|300px|Gedit en acción]]]&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1452</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1452"/>
		<updated>2019-06-07T18:40:51Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Gedit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gedit.png|center|200px|Gedit en acción]]]&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1451</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1451"/>
		<updated>2019-06-07T18:39:48Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Gedit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:gedit.png|frame|Gedit en acción|200px]]]&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1450</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1450"/>
		<updated>2019-06-07T18:38:35Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Procesadores de texto en Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
[[Archivo:gedit.png]]&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1449</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1449"/>
		<updated>2019-06-07T18:37:49Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Gedit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:[gedit.png]]&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Archivo:gedit.png&amp;diff=1448</id>
		<title>Archivo:gedit.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Archivo:gedit.png&amp;diff=1448"/>
		<updated>2019-06-07T18:37:23Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1447</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1447"/>
		<updated>2019-06-07T18:31:27Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Comandos principales */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1446</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1446"/>
		<updated>2019-06-07T18:31:11Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Vi y Vim */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1445</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1445"/>
		<updated>2019-06-07T18:30:58Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Vi y Vim */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
Para empezar con vi / vim escribir en la terminal : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vi file&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
o &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 vim file&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abre file si el archivo ya existe, en caso contrario permite crearlo si se decide guardarlo.&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1444</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1444"/>
		<updated>2019-06-07T18:28:21Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Modo Visual */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1443</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1443"/>
		<updated>2019-06-07T18:28:06Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Vi y Vim */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. &lt;br /&gt;
&lt;br /&gt;
En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Es el modo por defecto al iniciar el editor&lt;br /&gt;
*Para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
Este es el modo de escritura y edición de texto. Desde aquí, las teclas son interpretadas como el texto a insertar.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar la tecla &#039;&#039;&#039;i&#039;&#039;&#039; desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
Ayuda a seleccionar visualmente partes del texto. &lt;br /&gt;
&lt;br /&gt;
Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
&lt;br /&gt;
Para ingresar a este modo: &lt;br /&gt;
*Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Comandos principales==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1442</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1442"/>
		<updated>2019-06-07T18:23:58Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Procesadores de texto en Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. En esta parte, describiremos brevemente los siguientes editores:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Gedit&#039;&#039;&#039;, editor de texto con interfacie grafica&lt;br /&gt;
*&#039;&#039;&#039;Vi / Vim&#039;&#039;&#039;, editor de texto en la terminal&lt;br /&gt;
*&#039;&#039;&#039;Emacs&#039;&#039;&#039;, otro editor de texto en la terminal&lt;br /&gt;
&lt;br /&gt;
==Gedit==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gedit&#039;&#039;&#039; es el editor de textos por defecto en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. En gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar para la terminal incluido en -casi- todos los sistemas operativos UNIX. Su versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual&lt;br /&gt;
&lt;br /&gt;
===Modo normal===&lt;br /&gt;
:Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
Para ingresar a este modo: Es el modo default al iniciar el editor, y para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
===Modo Insertar===&lt;br /&gt;
:Este es el modo de escritura y edición de texto. Desde aquí, las teclas que se tipean son interpretadas como texto que se desea insertar.&lt;br /&gt;
Para ingresar a este modo: Presionar la tecla I desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
===Modo Visual===&lt;br /&gt;
:Ayuda a seleccionar visualmente partes del texto. Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
Para ingresar a este modo: Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
Algunos de los principales comandos en Vim son:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1441</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1441"/>
		<updated>2019-06-07T18:18:40Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Procesadores de texto en Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. Aquí describiremos brevemente los siguientes editores:&lt;br /&gt;
#Emacs&lt;br /&gt;
#Vi / Vim&lt;br /&gt;
#Gedit&lt;br /&gt;
&lt;br /&gt;
==gedit==&lt;br /&gt;
&lt;br /&gt;
gedit es el editor de textos default en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. A diferencia de los editores de terminal, en gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar incluido en -casi- todos los sistemas operativos UNIX. La versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual&lt;br /&gt;
&lt;br /&gt;
;Modo normal&lt;br /&gt;
:Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
Para ingresar a este modo: Es el modo default al iniciar el editor, y para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
;Modo Insertar&lt;br /&gt;
:Este es el modo de escritura y edición de texto. Desde aquí, las teclas que se tipean son interpretadas como texto que se desea insertar.&lt;br /&gt;
Para ingresar a este modo: Presionar la tecla I desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
;Modo Visual&lt;br /&gt;
:Ayuda a seleccionar visualmente partes del texto. Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
Para ingresar a este modo: Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
Algunos de los principales comandos en Vim son:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1440</id>
		<title>Editores</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=Editores&amp;diff=1440"/>
		<updated>2019-06-07T18:18:05Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- línea sólo para empezar la página, es borrable --&amp;gt;&lt;br /&gt;
=Editores de Texto=&lt;br /&gt;
&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros.&lt;br /&gt;
&lt;br /&gt;
==Diferencia con Procesadores de Texto==&lt;br /&gt;
Los editores de texto son aplicaciones utilizadas para la creación y edición de archivos de texto sencillo y sin formato. La mayoría de los sistemas operativos incluyen al menos un editor de texto que permite la creación, edición, lectura y guardado de archivos. En general, soportan funciones adicionales como copiar-pegar, búsqueda y uso de macros. &lt;br /&gt;
&lt;br /&gt;
[[Screenshot editor de texto]]&lt;br /&gt;
&lt;br /&gt;
A pesar de las restricciones en los editores de texto, el uso de texto sin formato posee ventajas prácticas. Los archivos creados por un editor de texto en general pueden ser utilizados por otros editores o procesadores de texto sin generar ningún tipo de conflicto. En programación, debido a que el código fuente no requiere ningún tipo de formato, es común -y necesario- utilizar editores de texto para escribir y editar código. La carencia de interfaz gráfica en los editores de texto permite además utilizarlos para editar archivos remotamente. Es posible así, por ejemplo, ingresar a un servidor y editar archivos de texto sin la necesidad de transferir por red el entorno gráfico, reduciendo significativamente el consumo de ancho de red.&lt;br /&gt;
&lt;br /&gt;
=Procesadores de texto en Linux=&lt;br /&gt;
Existe una amplia variadad de editores de texto para Linux. Aquí describiremos brevemente los siguientes editores:&lt;br /&gt;
#Emacs&lt;br /&gt;
#Vi / Vim&lt;br /&gt;
#Gedit&lt;br /&gt;
&lt;br /&gt;
==Emacs==&lt;br /&gt;
Desarrollado por Richard Stallman en 1976, Emacs es aún hoy uno de los editores de texto más completos disponibles.&lt;br /&gt;
Para iniciar el editor, se debe ejecutar el comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto abrirá Emacs en modo gráfico. Con la interfaz gráfica de Emacs es posible ejecutar los comandos básicos utilizando los menúes despegables.   Para ejecutar Emacs desde la terminal, deben ingresarse adicionalmente la opción -nw&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$ emacs -nw&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
En el modo terminal, no es posible utilizar mouse, por lo que los comandos se deben acceder utilizando combinaciones de teclas. Por ejemplo para guardar un archivo deberá ingresarse C-X C-S. Esto es, tipear simultáneamente las teclas CTRL y X, seguida de CTRL y S.&lt;br /&gt;
&lt;br /&gt;
Entre los comandos más básicos en Emacs se encuentran:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Iniciar Tutorial de Emacs&lt;br /&gt;
| C-h t&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Emacs&lt;br /&gt;
| C-x C-c&lt;br /&gt;
|-&lt;br /&gt;
| Interrumpir comando&lt;br /&gt;
| C-g&lt;br /&gt;
|-&lt;br /&gt;
| Abrir un archivo&lt;br /&gt;
| C-x C-f&lt;br /&gt;
|-&lt;br /&gt;
| Guardar un archivo&lt;br /&gt;
| C-x C-s&lt;br /&gt;
|-&lt;br /&gt;
| Buscar en el texto&lt;br /&gt;
| C-s&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| C-x u&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| F3&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| F4&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar última Macro&lt;br /&gt;
| F4&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Una lista exhaustiva de comandos puede encontrarse [https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf aquí]&lt;br /&gt;
&lt;br /&gt;
==Vi y Vim==&lt;br /&gt;
&lt;br /&gt;
Vi es el editor de textos estándar incluido en -casi- todos los sistemas operativos UNIX. La versión mejorada Vim (“Vi IMproved”) incluye más funcionalidades.  Tanto Vi como Vim, carecen de interfaz gráfica. A diferencia de los editores de texto tradicionales, Vim posee tres modos de trabajo: modo Normal o de Comandos, modo Insertar y modo visual&lt;br /&gt;
&lt;br /&gt;
;Modo normal&lt;br /&gt;
:Es el modo principal de Vim y sólo desde aquí es posible ingresar a los otros modos. En este modo, todas las teclas ingresadas son interpretadas como un comando. Desde aquí es posible guardar un archivo, copiar y pegar líneas, buscar palabras, deshacer-rehacer acciones, eliminar palabras y líneas, etc.&lt;br /&gt;
Para ingresar a este modo: Es el modo default al iniciar el editor, y para regresar a modo normal, basta con presionar la tecla ESC.&lt;br /&gt;
&lt;br /&gt;
;Modo Insertar&lt;br /&gt;
:Este es el modo de escritura y edición de texto. Desde aquí, las teclas que se tipean son interpretadas como texto que se desea insertar.&lt;br /&gt;
Para ingresar a este modo: Presionar la tecla I desde el modo Normal&lt;br /&gt;
&lt;br /&gt;
;Modo Visual&lt;br /&gt;
:Ayuda a seleccionar visualmente partes del texto. Imita al uso del mouse para seleccionar porciones de texto en editores de texto con interfaz gráfica.&lt;br /&gt;
Para ingresar a este modo: Presionar v, V o CTRL-v para acceder al modo visual y seleccionar caracteres, líneas o bloques de texto, respectivamente.&lt;br /&gt;
&lt;br /&gt;
Algunos de los principales comandos en Vim son:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Teclas&lt;br /&gt;
|-&lt;br /&gt;
| Salir de Vim&lt;br /&gt;
| :q&lt;br /&gt;
|-&lt;br /&gt;
| Guardar archivo&lt;br /&gt;
| :w&lt;br /&gt;
|-&lt;br /&gt;
| Eliminar línea&lt;br /&gt;
| dd&lt;br /&gt;
|-&lt;br /&gt;
| Pegar&lt;br /&gt;
| p&lt;br /&gt;
|-&lt;br /&gt;
| Buscar&lt;br /&gt;
| /&lt;br /&gt;
|-&lt;br /&gt;
| Deshacer&lt;br /&gt;
| u&lt;br /&gt;
|-&lt;br /&gt;
| Rehacer&lt;br /&gt;
| C-r&lt;br /&gt;
|-&lt;br /&gt;
| Comenzar Macro&lt;br /&gt;
| q &amp;lt;una letra que identifique a la macro&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Finalizar Macro&lt;br /&gt;
| q&lt;br /&gt;
|-&lt;br /&gt;
| Ejecutar una Macro&lt;br /&gt;
| @ &amp;lt;letra que identifica a la macro&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Otros comandos comunes pueden verse [https://www.fprintf.net/vimCheatSheet.html aquí]&lt;br /&gt;
&lt;br /&gt;
==gedit==&lt;br /&gt;
&lt;br /&gt;
gedit es el editor de textos default en los entornos GNOME (uno de los entornos disponibles en Debian). Cuenta con una interfaz relativamente amigable para nuevos usuarios. A diferencia de los editores de terminal, en gedit es posible Abrir y Guardar archivos, Buscar y reemplazar palabras, Seleccionar partes del texto, entre muchas opciones utilizando sólo el mouse.&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1435</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1435"/>
		<updated>2019-06-05T23:57:13Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&#039;&#039;Por si tienen sugestiones, correcciones, a proponer o comentarios a hacer, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039; pero la serpiente marcó más la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039;, no hay necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitarse el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el número no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificador pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificador&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de maneja eficiente otras herramientas son disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijo : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionario de paquete para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
*En general, se instala automáticamente los paquetes necesarias al funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones espacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidad con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con cartas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1434</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1434"/>
		<updated>2019-06-05T23:55:51Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Por si tienen sugestiones, correcciones, a proponer o comentarios a hacer, no duden en contactarse !&amp;lt;/i&amp;gt;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039; pero la serpiente marcó más la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039;, no hay necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitarse el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el número no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificador pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificador&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de maneja eficiente otras herramientas son disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijo : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionario de paquete para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
*En general, se instala automáticamente los paquetes necesarias al funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones espacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidad con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con cartas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1433</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1433"/>
		<updated>2019-06-05T23:54:49Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Por si tienen sugestiones, correcciones, a proponer o comentarios a hacer, no duden en contactarse !&#039;&#039;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039; pero la serpiente marcó más la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039;, no hay necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitarse el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el número no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificador pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificador&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de maneja eficiente otras herramientas son disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijo : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionario de paquete para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
*En general, se instala automáticamente los paquetes necesarias al funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones espacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidad con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con cartas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1432</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1432"/>
		<updated>2019-06-05T23:53:41Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Librerias */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039; pero la serpiente marcó más la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039;, no hay necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitarse el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el número no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificador pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificador&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de maneja eficiente otras herramientas son disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijo : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* &#039;&#039;&#039;En Debian&#039;&#039;&#039; : &lt;br /&gt;
En general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Primero, entrar al modo superuser (&#039;&#039;su&#039;&#039;)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buscar la libreria para conocer el nombre exacto : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instalar la libreria :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;En anaconda&#039;&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Con pip&#039;&#039;&#039; :&lt;br /&gt;
pip es un gestionario de paquete para python&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
*Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
*En general, se instala automáticamente los paquetes necesarias al funcionamiento de la librería que queremos instalar, &#039;&#039;&#039;pero&#039;&#039;&#039; a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una librería que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por números enteros por defecto, pero se puede especificar indices personalizados. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con números aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadísticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna referenciada como &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matemáticas y estadísticas (promedio, standard deviation) que se pueden aplicar sobre una o varias columnas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está basado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensiones, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe &#039;&#039;None&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el caso de que una variable sea ilimitada, se puede ir agregando nuevos datos. No olviden definir nueva descripción de los pasos temporales en la variable asociada con el tiempo.&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones espacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerías integran funciones de gráficos (seaborn, numpy..) pero en general están basadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
Existen una infinidad de posibilidad con matplotlib, el objetivo de esta parte es dejar unas bases para que cada uno después busque como personalizar a su gusto su gráfico.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, acá el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parámetros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Colormap es para especificar la mapa de color&lt;br /&gt;
 cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
 # Se puede después mostrar la escala de color con &lt;br /&gt;
 plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parámetro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
 plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerías basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la librería para trabajar con cartas. La librería anterior es Basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geo-espaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para graficas las longitudes / latitudes : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Armo la grilla con los detalles que me gustan&lt;br /&gt;
 gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True,&lt;br /&gt;
      linewidth=1, color=&#039;k&#039;, alpha=0.7, linestyle=&#039;--&#039;)&lt;br /&gt;
&lt;br /&gt;
 # Preparo las locaciones de longitud / latitud&lt;br /&gt;
 gl.ylocator = mticker.FixedLocator(np.arange(-90,90,10))&lt;br /&gt;
 gl.xlocator = mticker.FixedLocator(np.arange(-180,0,10))&lt;br /&gt;
&lt;br /&gt;
 # Por si quiero o no latitud a la izq./der.&lt;br /&gt;
 # Si puse True a draw_labels, todo están puesto directamente a True&lt;br /&gt;
 gl.ylabels_right = False&lt;br /&gt;
 gl.ylabels_left = True&lt;br /&gt;
 gl.yformatter = LATITUDE_FORMATTER&lt;br /&gt;
&lt;br /&gt;
 # Lo mismo para la longitud&lt;br /&gt;
 gl.xlabels_top = False&lt;br /&gt;
 gl.xlabels_bottom = True&lt;br /&gt;
 gl.xformatter = LONGITUDE_FORMATTER&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cartopy facilita la lectura de los datos GIS (shapefile ..), por ejemplo integra directamente la gestion de shapfile de [https://www.naturalearthdata.com/ Natural_earth]&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy.io.shapereader as shpreader&lt;br /&gt;
&lt;br /&gt;
 # Abrir la categoría deseada, con la resolución deseada&lt;br /&gt;
 geo_reg_shp = shpreader.natural_earth(resolution=&#039;50m&#039;, category=&#039;physical&#039;,&lt;br /&gt;
                                        name=&#039;geography_regions_polys&#039;)&lt;br /&gt;
 # Abrirlo&lt;br /&gt;
 geo_reg = shpreader.Reader(geo_reg_shp)&lt;br /&gt;
 # ax es el eje en uso, para graficar&lt;br /&gt;
 ax = plt.gca()&lt;br /&gt;
 # graficar todos los elementos, se puede seleccionar ciertos elementos con un if&lt;br /&gt;
 # si queremos solo borde poner edgecolor = color de borde deseado y facecolor = &#039;none&#039;&lt;br /&gt;
 # hacer el contrario si solo queremos rellenar la forma&lt;br /&gt;
 for rec in geo_reg.records():&lt;br /&gt;
    ax.add_geometries( [rec.geometry], ccrs.PlateCarree(), edgecolor=&amp;quot;r&amp;quot;, facecolor=&#039;none&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1431</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1431"/>
		<updated>2019-06-05T21:13:55Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Basic Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039; pero la serpiente marcó más la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039;, no hay necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitarse el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de Objetos == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de objetos ya incluidos en python, cada tipo de objeto es una clase con su propio tipo de datos, sus propios métodos, funciones y operaciones para interactuar entre objetos similares o de otro tipo.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada para el objeto &#039;&#039;obj&#039;&#039; : &lt;br /&gt;
&amp;lt;code&amp;gt; type(obj) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el número no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los números&lt;br /&gt;
 float(a) # retorna un número flotante valiendo 5.&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para hacer simplificaciones por ej. para la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser representados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión utilizando diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funciones verificando otros aspectos pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a &#039;&#039;Numpy&#039;&#039; (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 &lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; [True, True, False, False, False, False]&lt;br /&gt;
 &lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt; True&lt;br /&gt;
 &lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt; False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayúscula / minúscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas características del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alfanuméricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alfabetices&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minúscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numéricos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayúscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;containers&#039;&#039;&#039; (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificador, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los símbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificador pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificador&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriéndose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros fácilmente con la función &#039;&#039;range&#039;&#039; podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguirá corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
Manipular estos diferentes objetos es esencial, pero para trabajar de maneja eficiente otras herramientas son disponibles.&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Las funciones son una herramienta indispensable para trabajar con Python.&#039;&#039;&#039; Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_función(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más prolijo : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
Python ofrece la posibilidad de crear sus propios tipos de objetos via las clases. Permite tener una versión operacional y muy personalizada para gestionar los datos que manipulamos. Se crea una clase de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input1):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input2):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para utilizarla se puede iniciar un objeto de la manera siguiente :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 mi_obj = name_class(input = mi_input)&lt;br /&gt;
 # Para utilizar un método de la clase : &lt;br /&gt;
 mi_obj.additional_method_1(input = mi_input1)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el código sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1430</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1430"/>
		<updated>2019-06-05T20:57:12Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Para empezar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039; pero la serpiente marcó más la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Python es un &#039;&#039;&#039;Lenguaje de alto nivel&#039;&#039;&#039;, no hay necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y MAYÚSCULAS&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;se debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea permiten definir los bloques)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt;. Se pueden imprimir en pantalla diferentes variables en una sola llamada con : &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea, solo hace falta separarlas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea llamando a este comando se termina por &#039;&#039;&#039;:&#039;&#039;&#039; y los comandos utilizados adentro de esta condición se definen en un bloque de nivel más alto, para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En la terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
 exit()&lt;br /&gt;
 # o un &lt;br /&gt;
 quit() &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de códigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerías que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Código a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment a.k.a. Entorno de desarrollo integrado) son muy útiles para facilitarse el desarrollo de un script, contienen en general:&lt;br /&gt;
* una parte con múltiples pestañas para poder navegar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1429</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1429"/>
		<updated>2019-06-05T20:33:21Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039; pero la serpiente marcó más la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje (2.x y 3.x) las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print(&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de los scripts. En este curso vamos por lo más moderno, &#039;&#039;&#039;python 3&#039;&#039;&#039; ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles (ya integrado o en librerías) y posibilidad de crear clases&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1428</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1428"/>
		<updated>2019-06-05T20:20:37Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..) y para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1427</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1427"/>
		<updated>2019-06-05T20:20:16Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..), para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1426</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1426"/>
		<updated>2019-06-05T20:20:08Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..), para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1425</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1425"/>
		<updated>2019-06-05T20:19:59Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autor: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..), para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1424</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1424"/>
		<updated>2019-06-05T20:19:51Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autora: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..), para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1423</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1423"/>
		<updated>2019-06-05T20:19:38Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Introducción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
\Wc{}: &amp;amp;copy;Windows&lt;br /&gt;
\W{}: Windows&amp;lt;SUP&amp;gt;TM&amp;lt;/SUP&amp;gt;&lt;br /&gt;
\L{}: Linux&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Línea sólo para empezar la página --&amp;gt;&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Autora: Anthony SCHRAPFFER&lt;br /&gt;
Año: 2019&lt;br /&gt;
Contacto: anthony.schrapffer@cima.fcen.uba.ar&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En las Ciencias de la Tierra, se suele trabajar con muchos datos (observaciones, salida de modelo ..), para investigar estos datos y comunicar resultados vía gráficos o mapas, uno necesita una herramienta adecuada. Al buen trabajador, las buenas herramientas : esta pagina les presenta &#039;&#039;&#039;Python&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Esta guía intenta darles el entendimiento básico de Python, y algunas herramientas practicas en las áreas de las Ciencias de la Tierra para facilitar un primer uso de este lenguaje de programación. Para ir más allá, pueden ir a buscar soluciones a sus problemas en la comunidad de usuario cercano, o en linea. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1422</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1422"/>
		<updated>2019-06-05T19:24:11Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Para escribir un NetCDF */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Empezar a escribir el archivo netcdf al lugar indicado, &amp;quot;w&amp;quot; es para writing.&lt;br /&gt;
&#039;&#039;&#039;CUIDADO&#039;&#039;&#039; Si ya existía un archivo en esta dirección, sera sobrescrito ! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo = NetCDFFile(&#039;data/test.nc&#039;,&#039;w&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las dimensions, con el nombre de las dimensiones y la dimensión.&lt;br /&gt;
En caso de ser una variable &#039;&#039;ilimitada&#039;&#039;, se inscribe None.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 level = foo.createDimension(&#039;level&#039;, 10)&lt;br /&gt;
 lat = foo.createDimension(&#039;lat&#039;, 73)&lt;br /&gt;
 lon = foo.createDimension(&#039;lon&#039;, 144)&lt;br /&gt;
 time = foo.createDimension(&#039;time&#039;, None)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para crear las variables, con el nombre, el tipo de datos y las dimensiones relacionadas.&lt;br /&gt;
Agregando &amp;lt;code&amp;gt;zlib = True&amp;lt;/code&amp;gt; al final autoriza la compresión del archivo, es decir que los &#039;&#039;espacios&#039;&#039; sin datos no ocupan espacio.&lt;br /&gt;
&lt;br /&gt;
Primero no agregar las variables detallando las dimensiones, agrego un &#039;s&#039; a sus nombres para no confundirlas con las dimensiones. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
times = foo.createVariable(&#039;time&#039;, np.float64, (&#039;time&#039;,), zlib = True)&lt;br /&gt;
levels = foo.createVariable(&#039;level&#039;, np.int32, (&#039;level&#039;,))&lt;br /&gt;
latitudes = foo.createVariable(&#039;latitude&#039;, np.float32,(&#039;lat&#039;,))&lt;br /&gt;
longitudes = foo.createVariable(&#039;longitude&#039;, np.float32,(&#039;lon&#039;,))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se puede crear las variables que queremos guardar&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  temp = dataset.createVariable(&#039;temp&#039;, np.float32,(&#039;time&#039;,&#039;level&#039;,&#039;lat&#039;,&#039;lon&#039;))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para ponerles valores es muy simple, por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 lats = np.arange(-90,91,2.5)&lt;br /&gt;
 lons = np.arange(-180,180,2.5)&lt;br /&gt;
 latitudes[:] = lats&lt;br /&gt;
 longitudes[:] = lons&lt;br /&gt;
 &lt;br /&gt;
 # Y si tengo T un array a 4 dimensiones con las buenos dimensiones, en el buen orden (time, level, lat, lon) : &lt;br /&gt;
 temp[:,:,:,:] = T&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después es importante describir las variables y el archivo via los atributos.&lt;br /&gt;
&lt;br /&gt;
Para los atributos globales : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.description = &#039;Mean temperature datasets&#039;&lt;br /&gt;
 foo.history = &#039;Created 13/06/2019&#039;&lt;br /&gt;
 foo.source = &#039;netCDF4 python example&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para las variables : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 latitudes.units = &#039;degree_north&#039;&lt;br /&gt;
 longitudes.units = &#039;degree_east&#039;&lt;br /&gt;
 levels.units = &#039;hPa&#039;&lt;br /&gt;
 temp.units = &#039;K&#039;&lt;br /&gt;
 times.units = &#039;seconds since 1900-01-01 00:00:00&#039;&lt;br /&gt;
 times.calendar = &#039;gregorian&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Una dificuldad para describir el tiempo, hay que convertir las fechas en un formato compatible (en general secundos desde una cierta fecha, cf ejemplo).&lt;br /&gt;
Nos ayudara la función siguiente para convertir estas fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 from netcdf4 import date2num&lt;br /&gt;
 from datetime import datetime, timedelta&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para el ejemplo, creo una lista de fechas : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Dates = [datetime(2001, 3, 1)+n*timedelta(hours=12) for n in range(10)]&lt;br /&gt;
 times[:] = date2num(Dates, units = times.units)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Para terminar, no olvidar sincronizar y cerrar : &#039;&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 foo.sync()&lt;br /&gt;
 foo.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1421</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1421"/>
		<updated>2019-06-05T18:26:10Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* import this */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 The Zen of Python, by Tim Peters&lt;br /&gt;
 &lt;br /&gt;
 Beautiful is better than ugly.&lt;br /&gt;
 Explicit is better than implicit.&lt;br /&gt;
 Simple is better than complex.&lt;br /&gt;
 Complex is better than complicated.&lt;br /&gt;
 Flat is better than nested.&lt;br /&gt;
 Sparse is better than dense.&lt;br /&gt;
 Readability counts.&lt;br /&gt;
 Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
 Although practicality beats purity.&lt;br /&gt;
 Errors should never pass silently.&lt;br /&gt;
 Unless explicitly silenced.&lt;br /&gt;
 In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
 There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
 Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
 Now is better than never.&lt;br /&gt;
 Although never is often better than *right* now.&lt;br /&gt;
 If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
 If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
 Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1420</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1420"/>
		<updated>2019-06-05T18:25:31Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Algunos tips */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips =&lt;br /&gt;
== import this ==&lt;br /&gt;
&lt;br /&gt;
The Zen of Python, by Tim Peters&lt;br /&gt;
&lt;br /&gt;
Beautiful is better than ugly.&lt;br /&gt;
Explicit is better than implicit.&lt;br /&gt;
Simple is better than complex.&lt;br /&gt;
Complex is better than complicated.&lt;br /&gt;
Flat is better than nested.&lt;br /&gt;
Sparse is better than dense.&lt;br /&gt;
Readability counts.&lt;br /&gt;
Special cases aren&#039;t special enough to break the rules.&lt;br /&gt;
Although practicality beats purity.&lt;br /&gt;
Errors should never pass silently.&lt;br /&gt;
Unless explicitly silenced.&lt;br /&gt;
In the face of ambiguity, refuse the temptation to guess.&lt;br /&gt;
There should be one-- and preferably only one --obvious way to do it.&lt;br /&gt;
Although that way may not be obvious at first unless you&#039;re Dutch.&lt;br /&gt;
Now is better than never.&lt;br /&gt;
Although never is often better than *right* now.&lt;br /&gt;
If the implementation is hard to explain, it&#039;s a bad idea.&lt;br /&gt;
If the implementation is easy to explain, it may be a good idea.&lt;br /&gt;
Namespaces are one honking great idea -- let&#039;s do more of those!&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1411</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1411"/>
		<updated>2019-06-05T14:04:04Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducción = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1410</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1410"/>
		<updated>2019-06-05T00:13:10Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Para empezar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero &#039;&#039;&#039;CUIDADO&#039;&#039;&#039;, hay que estar atento con lo que estamos manipulamos. Si dejemos Python interpretar el tipo de una variable, puede influir en las operaciones que podremos aplicar a esta variable.&lt;br /&gt;
* El lenguaje reconoce minúsculas y mayúsculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de código en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel mas alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias características y métodos.&lt;br /&gt;
* Se puede escribir varias comandes en una sola linea separandolas con el símbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un &#039;&#039;for&#039;&#039;, &#039;&#039;if&#039;&#039;, &#039;&#039;while&#039;&#039; etc. la linea se termina por : y los comandos utilizados adentro de esta condición se definen por más espacio a principio de linea (&#039;&#039;&#039;para definir el bloques&#039;&#039;&#039;), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parámetros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parámetros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera mas eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1409</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1409"/>
		<updated>2019-06-05T00:07:35Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerías disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.&lt;br /&gt;
* El lenguaje reconoce minusculas y mayusculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de codigo en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias caracteristicas y metodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea gracias al simbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parametros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parametros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1408</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1408"/>
		<updated>2019-06-04T17:33:00Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Para ir más lejo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerias disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.&lt;br /&gt;
* El lenguaje reconoce minusculas y mayusculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de codigo en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias caracteristicas y metodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea gracias al simbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parametros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parametros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
Sirve también a paralelizar ciertas funciones manualmente.&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
Primero compilar con f2py3 algún modulo fortran con las subroutinas que nos interesen. Por ejemplo : &lt;br /&gt;
MODULE_one.f90&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 module one&lt;br /&gt;
&lt;br /&gt;
 contains&lt;br /&gt;
&lt;br /&gt;
 subroutine func(x,y, z)&lt;br /&gt;
     real(8), intent(in) :: x,y&lt;br /&gt;
     real(8), intent(out) ::z&lt;br /&gt;
     z = x*y&lt;br /&gt;
 end subroutine&lt;br /&gt;
 end module&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Es importante explicitar las variables de entrada y de salida con intent(in), intent(out).&lt;br /&gt;
La compilación nos da un archivo en .so&lt;br /&gt;
&lt;br /&gt;
Después se puede importar el modulo desde python para utilizarla directamente como : &lt;br /&gt;
from MODULE_one import *&lt;br /&gt;
&lt;br /&gt;
result = one.func(x = 2, y = 3)&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1407</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1407"/>
		<updated>2019-06-04T17:25:04Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* Para graficar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerias disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.&lt;br /&gt;
* El lenguaje reconoce minusculas y mayusculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de codigo en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias caracteristicas y metodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea gracias al simbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parametros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parametros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1406</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1406"/>
		<updated>2019-06-04T17:24:43Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* cartopy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerias disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.&lt;br /&gt;
* El lenguaje reconoce minusculas y mayusculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de codigo en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias caracteristicas y metodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea gracias al simbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parametros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parametros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 # Para obtener las longitudes, latitudes&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 # Empezar la figura&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1405</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1405"/>
		<updated>2019-06-04T17:24:03Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* cartopy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerias disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.&lt;br /&gt;
* El lenguaje reconoce minusculas y mayusculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de codigo en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias caracteristicas y metodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea gracias al simbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parametros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parametros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import cartopy&lt;br /&gt;
 import cartopy.crs as ccrs&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
 # Promedio temporal de la temperatura : &lt;br /&gt;
&lt;br /&gt;
 temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
 lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
 lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
 fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
 # Empezar con la proyección deseada&lt;br /&gt;
 ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos trabajar con subplot&lt;br /&gt;
 ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
 # Si queremos poner color a la superficie terrestre&lt;br /&gt;
 ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
 # Si queremos poner color a los oceanos&lt;br /&gt;
 ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
 # Para graficar las costas&lt;br /&gt;
 ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
 # Para graficar los datos&lt;br /&gt;
 ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
 plt.show()&lt;br /&gt;
 plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1404</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1404"/>
		<updated>2019-06-04T17:23:24Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* cartopy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerias disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.&lt;br /&gt;
* El lenguaje reconoce minusculas y mayusculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de codigo en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias caracteristicas y metodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea gracias al simbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parametros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parametros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tengo un array numpy de datos de temperatura de 2 dimensiones llamado &#039;&#039;Temp&#039;&#039; de dos dimensiones, con sus respectivo lon y lat cada uno de una dimensión&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
import cartopy&lt;br /&gt;
import cartopy.crs as ccrs&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
import numpy.ma as ma&lt;br /&gt;
from netcdf4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ncfile = NetCDFFile(ncdir, &amp;quot;r&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Suponemos que temp tiene por variable (time, lat, lon)&lt;br /&gt;
# Promedio temporal de la temperatura : &lt;br /&gt;
&lt;br /&gt;
temp = ma.mean(ncfile.variables[&amp;quot;Temp&amp;quot;][:,:,:], axis = 0) &lt;br /&gt;
&lt;br /&gt;
lon = ncfile.variables[&amp;quot;lon&amp;quot;][:]&lt;br /&gt;
lat = ncfile.variables[&amp;quot;lat&amp;quot;][:]&lt;br /&gt;
&lt;br /&gt;
fig = plt.figure(figsize= (20,10))&lt;br /&gt;
&lt;br /&gt;
# Empezar con la proyección deseada&lt;br /&gt;
ax = plt.axes(projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
# Por si queremos trabajar con subplot&lt;br /&gt;
ax1 = plt.subplot(2, 1, 1, projection=ccrs.PlateCarree())&lt;br /&gt;
&lt;br /&gt;
# Si queremos poner color a la superficie terrestre&lt;br /&gt;
ax.add_feature(cartopy.feature.LAND)&lt;br /&gt;
# Si queremos poner color a los oceanos&lt;br /&gt;
ax.add_feature(cartopy.feature.OCEAN)&lt;br /&gt;
# Para graficar las costas&lt;br /&gt;
ax.add_feature(cartopy.feature.COASTLINE)&lt;br /&gt;
&lt;br /&gt;
# Para graficar los datos&lt;br /&gt;
ax.contourf(lons, lats, temp, transform=ccrs.PlateCarree()&lt;br /&gt;
&lt;br /&gt;
plt.show()&lt;br /&gt;
plt.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
	<entry>
		<id>http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1403</id>
		<title>python 3</title>
		<link rel="alternate" type="text/html" href="http://wiki.cima.fcen.uba.ar/index.php?title=python_3&amp;diff=1403"/>
		<updated>2019-06-04T17:12:44Z</updated>

		<summary type="html">&lt;p&gt;Anthony.schrapffer: /* tensorflow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction = &lt;br /&gt;
== Histórico ==&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje de programación iniciado por Guido van Rossum. Tiene su nombre de la famosa serie tele &#039;&#039;Monty Python&#039;s Flying Circus&#039;&#039;. La serpiente marco mas la imaginación, por esta razón el lenguaje termina adoptándolo como logo.&lt;br /&gt;
&lt;br /&gt;
El lenguaje [https://www.python.org/ python] es un lenguaje interpretado muy versátil y cada vez más utilizado en actividades de ciencias de la Tierra. Existen dos versiones del lenguaje 2.x y 3.x las cuáles no son compatibles. Los cambios son menores (ej.: &amp;lt;code&amp;gt;print &#039;Hola&#039; --&amp;gt; print (&#039;Hola&#039;)&amp;lt;/code&amp;gt;), pero requiere una recodificación de las scripts. En este curso vamos por lo mas moderno, python3 ya que la versión 2 no sera mas actualizada a partir de 2020.&lt;br /&gt;
&lt;br /&gt;
Python es un lenguaje muy rico, porque está constituido por aportaciones de usuarixs de todo el mundo en forma de paquetes fáciles de instalaciones. Estos paquetes se tuvieron que adaptar para python 3.x y esto a retrasado su uso. Pero ahora, este proceso de migración y adaptación ya casi terminó y ya se puede usar con tranquilidad python 3.&lt;br /&gt;
&lt;br /&gt;
La presentación se puede descargar desde este enlace [[File:python-TUX.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Por que elegir Python ? ==&lt;br /&gt;
&lt;br /&gt;
*Por el diseño del lenguaje: &lt;br /&gt;
&#039;&#039;su simplicidad facilita la implementación de ideas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de uso: &lt;br /&gt;
&#039;&#039;es un lenguaje interpretado, no necesita ser compilado solo basta ejecutar el código&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la facilidad de lectura: &lt;br /&gt;
&#039;&#039;para poder compartirlo con otras personas, con la comunidad científica&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la alta compatibilidad: &lt;br /&gt;
&#039;&#039;puede funcionar con otros tipos de lenguajes de programación (C con cython, Fortran con f2py, en los cuales esta basado)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la estructura de los datos: &lt;br /&gt;
&#039;&#039;numerosos tipos de objetos disponibles&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Por la grande comunidad que lo usa: &lt;br /&gt;
&#039;&#039;mucha información en internet, libros, librerias disponibles y actualizadas&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Para empezar =&lt;br /&gt;
== A saber antes de empezar == &lt;br /&gt;
&lt;br /&gt;
* Lenguaje alto nivel, no necesidad de definir todo, interpreta mucho pero CUIDADO, hay que estar atento con lo que estamos manipulamos, si dejemos python interpretar el tipo de una variable, la operaciones de esta variable van a depender de como la definó python.&lt;br /&gt;
* El lenguaje reconoce minusculas y mayusculas&lt;br /&gt;
* Python empieza a contar a 0, así el primer elemento de una lista es el elemento 0 ! &lt;br /&gt;
* los espacios a principio de linea cuentan para definir los bloques&lt;br /&gt;
* se puede (&amp;quot;debe&amp;quot;) comentar con : &lt;br /&gt;
 &amp;lt;code&amp;gt; # para que lo resto de la linea sea considerado como comentario &amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
 Eso permite&lt;br /&gt;
 Comentar sobre varias lineas&lt;br /&gt;
 &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* Si queremos cortar una linea de codigo en varias se puede usar &amp;lt;code&amp;gt; \ &amp;lt;/code&amp;gt;  y empezando la linea siguiente a un nivel màs alto (recuerdan que los espacios a principio de linea cuentan)&lt;br /&gt;
* Para imprimir en pantalla una o más variable se usa la función &amp;lt;code&amp;gt; print(variable) &amp;lt;/code&amp;gt; se pueden imprimir en pantalla varias variables con una sola función &amp;lt;code&amp;gt; print(variable1, variable2) &amp;lt;/code&amp;gt; &lt;br /&gt;
* Cada tipo de elemento tiene sus propias caracteristicas y metodos.&lt;br /&gt;
* Se puede escribir varios comandos en una sola linea gracias al simbolo &amp;lt;code&amp;gt; ;&amp;lt;/code&amp;gt; &lt;br /&gt;
* Cuando se usa un comando como un for, ir while etc. la linea se termina por : y los comandos utilizados adentro de esta condicion se definen por más espacio a principio de linea (recuerdan que esto define los bloques), para que quede más claro esta noción de bloque siguen dos ejemplos : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
     i = i+1 # bloque del while&lt;br /&gt;
 print(i) # Después del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 i = 0&lt;br /&gt;
 while i &amp;lt; 3:&lt;br /&gt;
    i = i+1 # bloque del while&lt;br /&gt;
    print(i) # Adentro del bloque del while&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;out:&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 &amp;gt; 3&#039;&#039; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Otra noción importante, la diferencia entre función y métodos, las dos pueden retornar o no números, listas etc. pero : &lt;br /&gt;
** Una función puede tener entre 0 y lo que se desea de variables / parametros en input :&lt;br /&gt;
*:-&amp;lt;code&amp;gt;  sum(a,b) # función retornando la suma de a y b &amp;lt;/code&amp;gt;&lt;br /&gt;
** Un método se aplica a un objeto, mismo si puede tener parametros en input&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Lista = []      # creo una lista vacía&lt;br /&gt;
 Lista.append(1) # agrego 1 a la Lista&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Como usarlo ==&lt;br /&gt;
=== En un terminal ===&lt;br /&gt;
Se puede llamar a python desde la terminal&lt;br /&gt;
 &amp;lt;code&amp;gt; user@cima:~$ python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
Para después hacer las operaciones que queremos : &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt; &amp;gt;&amp;gt;&amp;gt; 1+2 &lt;br /&gt;
  3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y para salir basta con un &lt;br /&gt;
 &amp;lt;code&amp;gt;exit()&lt;br /&gt;
 o un &lt;br /&gt;
 quit() &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trabajar en la terminal permite probar algunas lineas de codigos, funciones ... Pero para poder trabajar de manera màs eficiente podemos usar los scripts.&lt;br /&gt;
&lt;br /&gt;
=== En script ===&lt;br /&gt;
Un script de python es un documento texto con el formato : &amp;lt;code&amp;gt; name_script.py &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Es importante empezar el documento especificando con que entorno python lo queremos leer : &lt;br /&gt;
 &amp;lt;code&amp;gt; #!/usr/bin/env python3 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede especificar el formato de codificación de caracteres, por ejemplo&lt;br /&gt;
 &amp;lt;code&amp;gt; # -*- coding: utf-8 -*- &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Después se tienen que importar las librerias que usamos en el script (si es que usamos): &lt;br /&gt;
&amp;lt;code&amp;gt; import this &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y finalmente viene el código ! &lt;br /&gt;
&lt;br /&gt;
Se puede agregar al final del documento lo siguiente&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;: &lt;br /&gt;
     Codigo a interpretar si este script es el script principal, no un script importado&lt;br /&gt;
     # Sirve para dar un ejemplo de uso, probar las funciones (debug)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ayudandose de un IDE ===&lt;br /&gt;
Los IDE (Integrated Development Environment aka Entorno de desarollo integrado) son muy útiles para facilitarse el desarollo de un script, contienen en general:&lt;br /&gt;
* una parte con multiples pestañas para poder navigar entre los diferentes scripts&lt;br /&gt;
* un terminal para ir probando comandos&lt;br /&gt;
* la posibilidad de leer todo o parte del script, visualizando los output en el terminal&lt;br /&gt;
* Opciones para visualizar ciertas variables, tablas etc.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de IDE son :&lt;br /&gt;
* Spyder&lt;br /&gt;
* Jupyter&lt;br /&gt;
&lt;br /&gt;
== En los servidores ==&lt;br /&gt;
Se puede usar en los servidores, se recomienda instalar Python y a las librerías que les interesan desde anaconda, para más detalles se recomiende ver a la pagina siguiente de la Wiki : &lt;br /&gt;
&lt;br /&gt;
[[anaconda]]&lt;br /&gt;
&lt;br /&gt;
Por otro lado, si quieren usar diferentes configuraciones de las versiones de librerías utilizadas con linux pueden fijarse en el articulo siguiente tratando de los entornos Python :&lt;br /&gt;
&lt;br /&gt;
[[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
= Basic Python = &lt;br /&gt;
== Tipos de variables == &lt;br /&gt;
&lt;br /&gt;
Existen varios tipos de variables pre-existentes en python, cada tipo de variable es una clase con su propio tipo de data, sus propios métodos, funciones y operaciones para inter-actuar entre diferentes objetos de la misma clase.&lt;br /&gt;
&lt;br /&gt;
Para conocer la clase de un objeto python, se puede utilizar la función siguiente que retorna la informacion deseada : &lt;br /&gt;
&amp;lt;code&amp;gt; type(objeto) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Números ===&lt;br /&gt;
&lt;br /&gt;
Python considera dos tipos de números : &lt;br /&gt;
&lt;br /&gt;
* los números enteros (&#039;&#039;int&#039;&#039;) que se pueden definir utilizando el numero directamente sin &amp;quot;.&amp;quot;&lt;br /&gt;
* los números flotantes (&#039;&#039;float&#039;&#039;) que se pueden definir poniendo un &amp;quot;.&amp;quot; entre enteros y decimales, si el numero no tiene decimales, se puede definirlo como float agragandole un &amp;quot;.&amp;quot; al final.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 5    # a es un entero&lt;br /&gt;
 b = 2.   # b es un flotante&lt;br /&gt;
 c = 4.5  # c es claramente un flotante&lt;br /&gt;
&lt;br /&gt;
 # Para convertir los numeros&lt;br /&gt;
 float(a) # retorna un numero flotante valiendo a&lt;br /&gt;
 int(c)   # retorna la parte entera de c, en este caso 4&lt;br /&gt;
&lt;br /&gt;
 # Operaciones entre flotante y enteros&lt;br /&gt;
 a+b&lt;br /&gt;
 &amp;gt; 7.&lt;br /&gt;
 a-b&lt;br /&gt;
 &amp;gt; 3.&lt;br /&gt;
 a*b&lt;br /&gt;
 &amp;gt; 10.&lt;br /&gt;
 a/b&lt;br /&gt;
 &amp;gt; 2.5&lt;br /&gt;
 a//b # parte entera de la división&lt;br /&gt;
 &amp;gt; 2&lt;br /&gt;
 a%b # resto de la división&lt;br /&gt;
 &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
 # Para facilitar la impresión en pantalla&lt;br /&gt;
 round(4.5578945, 3) # reduce a 3 numero decimales el flotante&lt;br /&gt;
 &amp;gt; 4.557&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condiciones y Boolean ===&lt;br /&gt;
Los boolean son &#039;&#039;True&#039;&#039; y &#039;&#039;False&#039;, también pueden ser referenciados respectivamente como 1 y 0.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar una expresión gracias a diferentes símbolos de comparación, lo que nos retorna un boolean :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;lt;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 ==&lt;br /&gt;
 !=&lt;br /&gt;
 in / not in &lt;br /&gt;
 is / is not&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Otras funciones pueden retornar un boolean.&lt;br /&gt;
&lt;br /&gt;
Se puede evaluar matrices gracias a numpy (mas detalles en otra parte), lo que nos devuelve una matrice de boolean, o un solo boolean si especificamos : &#039;&#039;.any()&#039;&#039; o &#039;&#039;.all()&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 A = np.array([1,2,3,4,5,6])&lt;br /&gt;
 c = A &amp;lt; 3&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt;[True, True, False, False, False, False]&lt;br /&gt;
 print(c.any())&lt;br /&gt;
 &amp;gt;True&lt;br /&gt;
 print(c.all())&lt;br /&gt;
 &amp;gt;False&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== String : Cadenas de caracteres ===&lt;br /&gt;
El formato de datos que contiene caracteres se llama &#039;&#039;&#039;String&#039;&#039;&#039;.&lt;br /&gt;
Se puede definir un string de dos maneras : &amp;lt;code&amp;gt;&#039;string&#039;&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;&amp;quot;string&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para trabajar con un ejemplo&lt;br /&gt;
 word1 = &amp;quot;Hola&amp;quot;&lt;br /&gt;
 word2 = &amp;quot;Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden agregar varios string gracias al &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1 + &amp;quot;_&amp;quot; + word2)&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pueden ser visto como una lista de caracteres simples&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(word1[0])&lt;br /&gt;
 &amp;gt; output : &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;word.upper()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;word.lower()&amp;lt;/code&amp;gt; devuelven una copia de word en mayuscula / minuscula&lt;br /&gt;
* Varios métodos permiten verificar ciertas caracteristicas del string, devuelven un boolean:&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalnum()&amp;lt;/code&amp;gt; : True si solamente caracteres son alphanumericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isalpha()&amp;lt;/code&amp;gt;	: True si solo caracteres alphabeticos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.islower()&amp;lt;/code&amp;gt;	: True si todo en minuscula&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isnumeric()&amp;lt;/code&amp;gt; : True si todos son caracteres numericos&lt;br /&gt;
** &amp;lt;code&amp;gt;word1.isupper()&amp;lt;/code&amp;gt; : True si todo en mayuscula&lt;br /&gt;
** ...&lt;br /&gt;
* separador.join(Lista_de-string) : devuelve un string con los elementos de las lista separado por el separador&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;-&amp;quot;.joint([word1, word2]))&lt;br /&gt;
 &amp;gt; output : &amp;quot;Hola-Mundo&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;string.split(separador)&amp;lt;/code&amp;gt; : devuelve una lista con los elementos de string entre cada separador, &amp;quot; &amp;quot; es utilizado si no hay separador especificado: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(&amp;quot;Ahora-podemos-probar&amp;quot;.split(&amp;quot;-&amp;quot;))&lt;br /&gt;
 &amp;gt; output : [&amp;quot;Ahora&amp;quot;, &amp;quot;podemos&amp;quot;, &amp;quot;probar&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;frase.replace(str1, str2) &amp;lt;/code&amp;gt; : devuelve un string que corresponde a frase en el cual str2 replaza a str1&lt;br /&gt;
&lt;br /&gt;
Los otros tipos de variables pueden ser convertido en string gracias a la función &amp;lt;code&amp;gt;str()&amp;lt;/code&amp;gt; : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 a = 2+3&lt;br /&gt;
 Resultado = &amp;quot;La suma es &amp;quot; + str(a)+&amp;quot;.&amp;quot;&lt;br /&gt;
 print(Resultado)&lt;br /&gt;
 &amp;gt; output : La suma es 5.&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Containers : Listas, Tuples, Diccionarios ===&lt;br /&gt;
&lt;br /&gt;
Los containers (&amp;quot;contenedores&amp;quot;) son objetos muy importantes, pueden contener otros objetos y así facilitan su uso. Básicamente, existen 3 grandes tipos de containers : &lt;br /&gt;
&lt;br /&gt;
* las listas&lt;br /&gt;
* los tuple&lt;br /&gt;
* los diccionarios&lt;br /&gt;
&lt;br /&gt;
==== Listas ==== &lt;br /&gt;
Las listas se definen gracias a los símbolos &amp;quot;[&amp;quot; y &amp;quot;]&amp;quot;.&lt;br /&gt;
La listas son contenedores referenciado gracias a un indice numérico.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para definir una lista vacía&lt;br /&gt;
 L = []&lt;br /&gt;
&lt;br /&gt;
 # para inicializar una lista, los elementos son separados por &amp;quot;,&amp;quot;&lt;br /&gt;
 L0 = [1, 2, 3]&lt;br /&gt;
 # puede ser hecho con diferentes tipos de objetos, mismo otras listas&lt;br /&gt;
 L = [1, 1.2, &amp;quot;Ritmo&amp;quot;, L0]&lt;br /&gt;
&lt;br /&gt;
 # para agregar un objeto se utiliza el método append&lt;br /&gt;
 L= [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;]&lt;br /&gt;
 L.append(&amp;quot;C&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función list permite facilitar la generación de lista : &lt;br /&gt;
 L = list(&amp;quot;abcdef&amp;quot;)&lt;br /&gt;
 print(L)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;, &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
 # la función len permite conocer el número de elementos&lt;br /&gt;
 print(len(L))&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   6&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede hacer fácilmente loop con las listas : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 L = [&amp;quot;file1&amp;quot;, &amp;quot;file2&amp;quot;, &amp;quot;file3&amp;quot;]&lt;br /&gt;
 for element in L:&lt;br /&gt;
    print(f)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;file1&amp;quot;&lt;br /&gt;
  &amp;quot;file2&amp;quot;&lt;br /&gt;
  &amp;quot;file3&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede acortar una lista a una o más elementos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # L1 una lista 1D&lt;br /&gt;
 L1[0] # primer elemento de L1&lt;br /&gt;
 L1[-1] # Ultimo elemento de L1&lt;br /&gt;
 L1[1] # secundo elemento de L1&lt;br /&gt;
 L1[:4] # todos los elementos hasta el cuarto (python empieza a contar a 0)&lt;br /&gt;
 L1[2:] # todos los elementos a partir del tercero&lt;br /&gt;
 L1[0::2] # todos los elementos a partir del 1ero, cada 2 elementos&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recuerden que un &#039;&#039;string&#039;&#039; puede ser considerado como una lista.&lt;br /&gt;
&lt;br /&gt;
==== Tuple ====&lt;br /&gt;
&lt;br /&gt;
Los &#039;&#039;&#039;tuples&#039;&#039;&#039; son unas listas que no pueden ser modificadas, se definen entre paréntesis.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 t = ()&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;)&lt;br /&gt;
 t = (&amp;quot;hola&amp;quot;, &amp;quot;mundo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 # Extraer la información en t&lt;br /&gt;
 word1, word2 = t&lt;br /&gt;
&lt;br /&gt;
 # Mismo acceso con índice como las listas&lt;br /&gt;
 print(t[0])&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;hola&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La principal diferencia es que los elementos no pueden ser cambiado ni agregado, hay que redefinir la lista si se quiere cambiar los elementos.&lt;br /&gt;
&lt;br /&gt;
==== Diccionarios ====&lt;br /&gt;
&lt;br /&gt;
En los diccionarios, los elementos no son referenciados por su indice sino por un identificante, no es un contenedor ordenado como las listas o los tuples.&lt;br /&gt;
Los diccionarios se crean con los simbolos &amp;quot;{&amp;quot; y &amp;quot;}&amp;quot;. Los identificante pueden ser diferentes tipos de objetos, por ejemplo string o enteros.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Diccionario vacío&lt;br /&gt;
 D = {}&lt;br /&gt;
&lt;br /&gt;
 # Inicialización de un diccionarios&lt;br /&gt;
 # se pone id : valor&lt;br /&gt;
 D = {&#039;Manzana&#039;: 3, &#039;Naranja&#039;: 10}&lt;br /&gt;
&lt;br /&gt;
 # se pueden definir uno a uno&lt;br /&gt;
 D[&amp;quot;Palta&amp;quot;] = 4&lt;br /&gt;
&lt;br /&gt;
 # Suprimir un elemento del diccionario&lt;br /&gt;
 del D[&amp;quot;Manzana&amp;quot;]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D.keys() devuelve la lista de los identificante&lt;br /&gt;
D.values() devuelve la lista de los diferentes valores&lt;br /&gt;
D.items() devuelve un tuples con los diferentes items&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 for cle, value in D.items():&lt;br /&gt;
    print(cle, value)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;Manzana&amp;quot; 3&lt;br /&gt;
  &amp;quot;Naranja&amp;quot; 10&lt;br /&gt;
&lt;br /&gt;
== Loops ==&lt;br /&gt;
&lt;br /&gt;
=== for x in ===&lt;br /&gt;
Para recorrer una lista de elementos se puede usar el &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for x in List:&lt;br /&gt;
    instrucciones utilizando x&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
El loop va a recorrer la lista utilizando sus elementos uno a uno refiriendose a ellos como x.&lt;br /&gt;
&lt;br /&gt;
Construyendo lista de enteros facilmente con la función range podemos escribir : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i in range(0,10,2): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  0&lt;br /&gt;
  2&lt;br /&gt;
  4&lt;br /&gt;
  6&lt;br /&gt;
  8&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
También se puede recorrer dos listas en simultaneo utilizando la función &amp;lt;code&amp;gt; zip &amp;lt;/code&amp;gt; : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 for i, name in zip(range(3), [&amp;quot;To&amp;quot;, &amp;quot;Ti&amp;quot;, &amp;quot;To&amp;quot;]): # para los enteros i entre 0 y 10 (excluido), cada 2&lt;br /&gt;
    print(i, name)&lt;br /&gt;
 &amp;gt; output :&lt;br /&gt;
  0, &amp;quot;To&amp;quot;&lt;br /&gt;
  1, &amp;quot;Ti&amp;quot;&lt;br /&gt;
  2, &amp;quot;To&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== while ===&lt;br /&gt;
&lt;br /&gt;
Se puede también utilizar una condición para hacer una loop, mientras está la condición se corre de nuevo la loop : &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 while &#039;condition&#039;:&lt;br /&gt;
     instrucción&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuidado a poder siempre salir de la loop, sino el script seguira corriendo sin fin.&lt;br /&gt;
Hay que verificar que a lo menos un elemento de la función llega a cambiar y que llega a no cumplir la condición&lt;br /&gt;
&lt;br /&gt;
=== Parar una loop ===&lt;br /&gt;
&lt;br /&gt;
Se puede parar una loop con el uso de &amp;lt;code&amp;gt; break &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 while &#039;condición&#039;:&lt;br /&gt;
    instrucciones&lt;br /&gt;
    if &#039;condición de no se pasa como quiero&#039;:&lt;br /&gt;
        break&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Más herramientas ==&lt;br /&gt;
&lt;br /&gt;
=== Funciones ===&lt;br /&gt;
&lt;br /&gt;
Las funciones son una herramienta indispensable para trabajar con Python. Permiten no repetir partes del código y además permiten gestionar mejor la memoria en Python.&lt;br /&gt;
&lt;br /&gt;
Python guarda todas las variables, informaciones en memoria, pero cuando utilizamos una función solo los elementos retornados están guardado en memoria una vez que termina corriendo, las variables locales están borradas.&lt;br /&gt;
&lt;br /&gt;
La estructura básica de una función es : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def nombre_funcion(variable_entrantes):&lt;br /&gt;
    # Noten que termino la linea anterior con &amp;quot;:&amp;quot;&lt;br /&gt;
    # Noten que paso a otro nivél de código&lt;br /&gt;
    código&lt;br /&gt;
    return output &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se pueden retornar entre entre ninguna y varias variables, si no retornamos variables, el &#039;&#039;return&#039;&#039; es opcional.&lt;br /&gt;
Se pueden entrar entre ninguna y varias variables, es posible dar un valor por defecto a las variables entrantes : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 def mi_funcion(a, b=1):&lt;br /&gt;
    c = a+b&lt;br /&gt;
    return c&lt;br /&gt;
 c = mi_funcion(2)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 3&lt;br /&gt;
&lt;br /&gt;
 # Se puede indicar las variables entrantes si queremos ser más detallosos : &lt;br /&gt;
 c = mi_funcion(a = 1, b = 3)&lt;br /&gt;
 print(c)&lt;br /&gt;
 &amp;gt; 4 &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clases ===&lt;br /&gt;
También es posible gestionar sus propias clases de datos de la manera siguiente : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 class name_class:&lt;br /&gt;
    def __init__(self, input):&lt;br /&gt;
        #Initialization method&lt;br /&gt;
        self.parameter_a = &amp;quot;hola&amp;quot;&lt;br /&gt;
        self.additional_method_1()&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_1(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
 &lt;br /&gt;
    def additional_method_2(self, input):&lt;br /&gt;
        operations&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mejorar sus scripts ==&lt;br /&gt;
&lt;br /&gt;
Para mejorar sus scripts y mejor gestionar los errores se puede usar &#039;try&#039; y &#039;except&#039;.&lt;br /&gt;
&lt;br /&gt;
Funciona de la manera siguiente : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    &#039;Codigo&#039;&lt;br /&gt;
 except:&lt;br /&gt;
    &#039;En cualquier caso de error, corro estas instrucciones&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 print(a)&lt;br /&gt;
 &amp;gt; output : Error porque no defini a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 try:&lt;br /&gt;
    print(a)&lt;br /&gt;
 except:&lt;br /&gt;
    print(&amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;)&lt;br /&gt;
    print(&amp;quot;verificar si esta definida&amp;quot;)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
  &amp;quot;imposible de imprimir la variable en la pantalla&amp;quot;&lt;br /&gt;
  &amp;quot;verificar si esta definida&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Permitió correr el codigo sin que este parado por el error.&lt;br /&gt;
&lt;br /&gt;
= Librerias = &lt;br /&gt;
&lt;br /&gt;
== Instalar Librerías ==&lt;br /&gt;
* En debian : en general las librerías se encuentran con el nombre &#039;&#039;python3-nombre&#039;&#039;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 su root&lt;br /&gt;
 &#039;&#039;Entrar contraseña para acceder al modo superuser&#039;&#039;&lt;br /&gt;
 apt-get search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 &#039;&#039;Encontrar el nombre exacto de la librería buscada&#039;&#039;&lt;br /&gt;
 apt-get install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* En anaconda : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 conda search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 conda install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Con pip :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 pip3 search &#039;&#039;LIBRARY&#039;&#039;&lt;br /&gt;
 pip3 install &#039;&#039;LIBRARY_NAME&#039;&#039;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CUIDADO !! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Debian no tiene siempre las últimas versiones, pero siempre son compatibles.&lt;br /&gt;
&lt;br /&gt;
Anaconda puede tener problemas de compatibilidad entre versiones, se resuelve buscando versiones compatible especificando numero de versiones, puede convenir utilizar diferentes [[entornos_python]]&lt;br /&gt;
&lt;br /&gt;
En general instalan las librerías necesarias al funcionamiento de lo que queremos instalar, pero a veces hay que instalarlo aparte.&lt;br /&gt;
&lt;br /&gt;
== numpy ==&lt;br /&gt;
Numpy es la librería gestionando matrices.&lt;br /&gt;
Un elemento de numpy es una matriz que contiene elementos del mismo tipo, contrariamente a las listas en las cuales se pueden mezclar los tipos de datos. En función del tipo de dato y del número de dimensiones diferentes métodos y funciones estarán disponibles.&lt;br /&gt;
&lt;br /&gt;
En vez de recorrer los elementos de las matrices uno a uno para hacer una operaciones, las funciones están optimizadas para que todo se haga más rápido, por eso antes de hacer una operación sobre matrices por si solo, mejor verificar si no existe en numpy.&lt;br /&gt;
&lt;br /&gt;
=== Básico ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
&lt;br /&gt;
 # Convertir una lista en numpy array, los elementos tienen que ser del mismo tipo&lt;br /&gt;
 A = np.array(List)&lt;br /&gt;
&lt;br /&gt;
 # Crear una matriz llena de 0 con una cierta estructura&lt;br /&gt;
 shape = (10,5) # en este caso una matriz 10*5&lt;br /&gt;
 A = np.zeros(shape)&lt;br /&gt;
 # full permite crear una matriz llena del número que indicamos, en esta caso 5 &lt;br /&gt;
 A = np.full(shape, 5) &lt;br /&gt;
&lt;br /&gt;
 # Obtener la estructura de una matriz &lt;br /&gt;
 A.shape&lt;br /&gt;
 # Obtener el número de elementos&lt;br /&gt;
 A.size&lt;br /&gt;
&lt;br /&gt;
=== Funciones === &lt;br /&gt;
&lt;br /&gt;
Existen numerosas funciones, si buscan algo en particular ver : &lt;br /&gt;
https://docs.scipy.org/doc/numpy/reference/&lt;br /&gt;
&lt;br /&gt;
Entre otras : &lt;br /&gt;
* mean&lt;br /&gt;
* multiply&lt;br /&gt;
* true_divide&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
=== matrices enmascaradas ===&lt;br /&gt;
&lt;br /&gt;
Otro aspecto interesante de las matrices en numpy son las matrices &amp;quot;enmascaradas&amp;quot;. &lt;br /&gt;
Permiten gestionar elementos enmascarados y realizar las operaciones ignorando estos elementos.&lt;br /&gt;
Una matriz enmascarada se define por una matriz numpy con los valores no enmascarados y una matriz numpy de boolean indicando cuales son los elementos enmascarados&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import numpy.ma as ma&lt;br /&gt;
 A = np.random((4,3))&lt;br /&gt;
 A_masked = ma.masked_where(A &amp;lt;0.5, A)&lt;br /&gt;
&lt;br /&gt;
 # ver el promedio de los elementos de A que son superiores a 0.5 : &lt;br /&gt;
 print(ma.mean(A))&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== pandas ==&lt;br /&gt;
Pandas es una libreria que facilita el trabajo con datos.&lt;br /&gt;
&lt;br /&gt;
=== Series === &lt;br /&gt;
&lt;br /&gt;
Un tipo de datos en pandas son las series, indexada por numeros interos por defecto.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import numpy as np&lt;br /&gt;
 import pandas as pd&lt;br /&gt;
 s = pd.Series([1, 3, 5, np.nan, 6, 8])&lt;br /&gt;
&lt;br /&gt;
 print(s) &lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
   0    1.0&lt;br /&gt;
   1    3.0&lt;br /&gt;
   2    5.0&lt;br /&gt;
   3    NaN&lt;br /&gt;
   4    6.0&lt;br /&gt;
   5    8.0&lt;br /&gt;
   dtype: float64&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dataframe ===&lt;br /&gt;
Otro tipo de datos son los dataframe, se pueden considerar como una tabla con diferentes columnas (datos) y distintos &#039;&#039;&#039;index&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 # Por si queremos un index siendo fechas &lt;br /&gt;
 dates = pd.date_range(start=&amp;quot;1/1/2018&amp;quot;, periods=8, freq=&amp;quot;D&amp;quot;)&lt;br /&gt;
 var = [&amp;quot;ET&amp;quot;, &amp;quot;T&amp;quot;, &amp;quot;Q&amp;quot;, &amp;quot;W&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 # Creación de un dataset con numeros aleatorios, con las fechas entre el 01/01/2018 y el 08/01/2018 y con las variables de var en columnas&lt;br /&gt;
 df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=var)&lt;br /&gt;
&lt;br /&gt;
 print(df)&lt;br /&gt;
 &amp;gt; output : &lt;br /&gt;
                     ET         T         Q         W&lt;br /&gt;
   2018-01-01 -0.303859  1.541625 -0.158655 -0.106934&lt;br /&gt;
   2018-01-02 -0.614769 -1.461621 -0.516678 -0.239503&lt;br /&gt;
   2018-01-03 -0.678116  1.538130 -0.799381  0.610648&lt;br /&gt;
   2018-01-04  0.356464  0.320538  0.941156  0.303474&lt;br /&gt;
   2018-01-05 -1.138584 -0.001179  0.386963 -0.882730&lt;br /&gt;
   2018-01-06  0.318615  0.743327  0.401269  2.555924&lt;br /&gt;
   2018-01-07 -0.659930  0.925570 -1.514493  0.709833&lt;br /&gt;
   2018-01-08 -0.231210  1.592285 -0.055710 -1.201247&lt;br /&gt;
&lt;br /&gt;
* Las columnas pueden tener diferentes tipos de data (string, date, enteros..)&lt;br /&gt;
* Para definir un dataframe manualmente se usa diccionarios &lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
 df2 =  pd.DataFrame({&amp;quot;A&amp;quot; : [1.], &amp;quot;B&amp;quot;: [&amp;quot;hola&amp;quot;]})&lt;br /&gt;
 print(df2)&lt;br /&gt;
 &amp;gt; output:&lt;br /&gt;
        A  B&lt;br /&gt;
   0  1.0  a&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Visualización ===&lt;br /&gt;
* Para ver las primeras lineas : &amp;lt;code&amp;gt; df.head() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las ultimas : &amp;lt;code&amp;gt; df.tail() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para el index : &amp;lt;code&amp;gt; df.index &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para las columnas : &amp;lt;code&amp;gt; df.columns &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para convertir en un array numpy (se pierde el index y las columnas): &amp;lt;code&amp;gt; df.to_numpy() &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para tener un resumen estadisticos rapido : &amp;lt;code&amp;gt; df.describe() &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
               A         B         C         D&lt;br /&gt;
 count  6.000000  6.000000  6.000000  6.000000&lt;br /&gt;
 mean   0.073711 -0.431125 -0.687758 -0.233103&lt;br /&gt;
 std    0.843157  0.922818  0.779887  0.973118&lt;br /&gt;
 min   -0.861849 -2.104569 -1.509059 -1.135632&lt;br /&gt;
 25%   -0.611510 -0.600794 -1.368714 -1.076610&lt;br /&gt;
 50%    0.022070 -0.228039 -0.767252 -0.386188&lt;br /&gt;
 75%    0.658444  0.041933 -0.034326  0.461706&lt;br /&gt;
 max    1.212112  0.567020  0.276232  1.071804&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Para transponer datos : &amp;lt;code&amp;gt; df.T &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar según las valores de un axis (index) : &amp;lt;code&amp;gt; df.sort_index(axis = 1, ascending = False ) &amp;lt;/code&amp;gt;&lt;br /&gt;
* Para ordenar por valores de una columna, por ejemplo si quiero ordenar por los valores de la columna denombrada &amp;quot;B&amp;quot; : &amp;lt;code&amp;gt; df.sort_values(by=&amp;quot;B&amp;quot;) &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Selección : &lt;br /&gt;
** Para seleccionar la columna &amp;quot;A&amp;quot; : df[&amp;quot;A&amp;quot;]&lt;br /&gt;
** Para el axis (index) número 1 : &amp;lt;code&amp;gt; df.loc[0] &amp;lt;/code&amp;gt;, si los index son fechas, tengo que poner a la fecha en indice.&lt;br /&gt;
** &amp;lt;code&amp;gt; df.loc[0, &amp;quot;A&amp;quot;] &amp;lt;/code&amp;gt; : devuelve el valor de la columna &amp;quot;A&amp;quot; para el axis.&lt;br /&gt;
&lt;br /&gt;
*Datos faltantes&lt;br /&gt;
** Para dejar las lineas con datos faltantes : &amp;lt;code&amp;gt; df. &amp;lt;/code&amp;gt;&lt;br /&gt;
** Para rellenar los datos faltantes : &lt;br /&gt;
&lt;br /&gt;
*Operaciones&lt;br /&gt;
** Existen todo tipo de operaciones matematicas y estadisticas (promedio, standard desviation) que se pueden aplicar sobre una o varias columas/lineas.&lt;br /&gt;
&lt;br /&gt;
=== Graficar ===&lt;br /&gt;
* Time Series&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Se puede realizar el time serie simple via : &lt;br /&gt;
 ts.plot() # Para una serie de datos&lt;br /&gt;
 df.plot() # Para un dataframe&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Se pueden explicitar en la función plot el tipo de gráfico que queremos realizar via &#039;&#039;&#039;kind&#039;&#039;&#039; : el valor puede ser ‘bar’,’barh’,’pie’,’scatter’,’kde’ etc&lt;br /&gt;
* &#039;&#039;&#039;color&#039;&#039;&#039; para definir los colores&lt;br /&gt;
*  &#039;&#039;&#039;linestyle&#039;&#039;&#039; para definir el estilo de linea ‘solid’, ‘dotted’, ‘dashed’&lt;br /&gt;
* &#039;&#039;&#039;xlim&#039;&#039;&#039;, &#039;&#039;&#039;ylim&#039;&#039;&#039; son tuple para definir los limites del axis x y del axis y&lt;br /&gt;
* &#039;&#039;&#039;legend&#039;&#039;&#039; Boolean para mostrar o no la leyenda (nombre de cada columna con el color correspondiente)&lt;br /&gt;
* &#039;&#039;&#039;title&#039;&#039;&#039; Titulo del gráfico&lt;br /&gt;
&lt;br /&gt;
Se combina también con funciones de matplotlib porque está baseado en matplotlib.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Importar/Exportar ===&lt;br /&gt;
*CSV&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un CSV&lt;br /&gt;
 df = pandas.read_csv(&amp;quot;/home/direccion/documento.csv&amp;quot;)&lt;br /&gt;
 # para guardar el dataframe df como un csv, definiendo el separador&lt;br /&gt;
 df.to_csv(&#039;foo.csv&#039;, sep = &amp;quot;;&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Excel&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Para leer un Excel&lt;br /&gt;
 pandas.read_excel(&amp;quot;/home/direccion/documento.xlsx&amp;quot;)&lt;br /&gt;
 # Para guardar un dataframe df como documento excel&lt;br /&gt;
 df.to_excel(&#039;foo.xlsx&#039;, sheet_name=&#039;Sheet1&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== netcdf ==&lt;br /&gt;
NetCDF es un formato de almacenamiento de datos muy común en ciencias de la Tierra. Para más detalle ver : LINK&lt;br /&gt;
&lt;br /&gt;
En python se puede trabajar directamente con los archivos netcdf, para leerlos, escribirlos, o modificarlos gracias a esta librería.&lt;br /&gt;
&lt;br /&gt;
=== Leer un NetCDF desde python ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Importar la clase Dataset de netCDF4 bajo el nombre de NetCDFFile&lt;br /&gt;
 from netCDF4 import Dataset as NetCDFFile&lt;br /&gt;
&lt;br /&gt;
 # Abrir el arquivo foo.nc, r de &amp;quot;reading&amp;quot;&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 # Este archivo contiene varios diccionarios: un para las variable, otro para las dimensiones, y también los atributos generales &lt;br /&gt;
 ncfile.dimensions.keys() # permite ver las dimensiones&lt;br /&gt;
 ncfile.variables.keys()&lt;br /&gt;
&lt;br /&gt;
 # si temp es una variable: &lt;br /&gt;
 temp = ncfile.variables[&amp;quot;temp&amp;quot;] #me permite acceder a esta variable y visualizar sus atributos y datos&lt;br /&gt;
 # Pero sus datos no están cargados en la memoria&lt;br /&gt;
 # Pero para acceder a sus datos necesito utilizar, por ejemplo si temp tiene dos dimensiones : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][:,:]&lt;br /&gt;
&lt;br /&gt;
 # Para ahorar memoria puedo decidir cargar unicamente la informacion que me es util : &lt;br /&gt;
 temp_data = ncfile.variables[&amp;quot;temp&amp;quot;][3:10,:]&lt;br /&gt;
&lt;br /&gt;
 # Para leer los atributos de una variable : &lt;br /&gt;
 print dataset.variables[&#039;tcc&#039;]&lt;br /&gt;
  &amp;gt; output : &lt;br /&gt;
    &amp;lt;type &#039;netCDF4.Variable&#039;&amp;gt;&lt;br /&gt;
    float32 tcc(time, latitude, longitude&lt;br /&gt;
       missing_value: 9.999e+20&lt;br /&gt;
       name: tcc&lt;br /&gt;
       title: Total cloud cover ((0-1))&lt;br /&gt;
    unlimited dimensions: time&lt;br /&gt;
    current shape = (1, 181, 360)&lt;br /&gt;
    filling off&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente para cerrar el archivo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para modificar un NetCDF ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Cargo el archivo en modo r+ que lee y abre la posibilidad a hacer modificaciones&lt;br /&gt;
 ncfile = NetCDFFile(&amp;quot;/home/anthony/foo.nc&amp;quot;, &amp;quot;r+&amp;quot;)&lt;br /&gt;
 # Cargo la variable (no sus datos)&lt;br /&gt;
 ncvar = ncfile.variables[&amp;quot;var&amp;quot;]&lt;br /&gt;
 # Cambio las valores que me interesan&lt;br /&gt;
 ncvar[0,2] = 10.&lt;br /&gt;
 # Sincronizo&lt;br /&gt;
 ncfile.sync()&lt;br /&gt;
 # Cierro&lt;br /&gt;
 ncfile.close()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Para escribir un NetCDF ===&lt;br /&gt;
&lt;br /&gt;
== xarray ==&lt;br /&gt;
Numpy mejorado para ciencias de la tierra, integra informaciones spacio-temporales y métodos de calculo simplificado que toma en cuenta estas informaciones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matplotlib ==&lt;br /&gt;
Es &#039;&#039;&#039;LA&#039;&#039;&#039; librería gráfica de python, indispensable para graficar. Otras librerias integran funciones de graficos (seaborn, numpy..) pero en general están baseadas en matplotlib.&lt;br /&gt;
&lt;br /&gt;
=== Empezar una figura ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # para importar la librería&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
 # Para empezar la figura definiendo su tamaño, largo y alto en inches&lt;br /&gt;
 plt.figure(figsize=(20,10))&lt;br /&gt;
 &lt;br /&gt;
 # Se puede hacer subplot (poner varios gráfico en una sola figura)&lt;br /&gt;
 # Por ejemplo ahí es el subplot 2 de una grilla de 2x2&lt;br /&gt;
 # los números de los subplot van aumentando de la izquierda a la derecha y de arriba hacia abajo, aca el número dos sería el subplot arriba a la derecha&lt;br /&gt;
 plt.subplot(2, 2, 1)  &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Este comando me ubica en este subplot para después graficar lo que especificare después.&lt;br /&gt;
&lt;br /&gt;
=== Para graficar ===&lt;br /&gt;
&#039;&#039;&#039;Gráficos 1D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar una serie de punto, x son los valores del eje horizontal y y del eje vertical :&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
x = np.arange(10)&lt;br /&gt;
y = x**2&lt;br /&gt;
# (Opcional) Se pueden especificar varios parametros, como el color, el estilo de linea ...&lt;br /&gt;
plt.plot(x, y, color = ‘green’ , linewidth = 2, linestyle = “-”)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para graficar una nube de puntos : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.scatter(x, y, marker = ‘o’, color = ‘red’)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gráficos 2D&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Para graficar datos 2D, existen varias funciones : &#039;&#039;contour&#039;&#039;, &#039;&#039;contourf&#039;&#039;, &#039;&#039;scatterplot&#039;&#039;, &#039;&#039;imshow&#039;&#039;...&lt;br /&gt;
Estas funciones toman por parámetro X, Y y C : &lt;br /&gt;
* X y Y son array 2D con las diferentes coordenadas horizontal y vertical&lt;br /&gt;
* C es un array 2D que contiene los datos correspondiente&lt;br /&gt;
&lt;br /&gt;
Si solo se usa C, matplotlib puede dar una previsualización del gráfico en el cual consideró una grilla regular.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Colormap es para especificar la mapa de color&lt;br /&gt;
cs = plt.contourf(X, Y, C, colormap = &amp;quot;rainbow&amp;quot;)&lt;br /&gt;
# Se puede después mostrar la escala de color con &lt;br /&gt;
plt.colorbar(cs)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Personalización&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si se especifica en la función que usé para graficar un parametro &#039;&#039;&#039;label&#039;&#039;&#039;, puedo mostrar la leyenda del gráfico con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.legend()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir un label para los diferentes axis con : &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.ylabel(&#039;Precipitación&#039;, fontsize = 15) #for y label&lt;br /&gt;
plt.xlabel(&#039;Time&#039;, fontsize = 15) #for x label&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se puede definir los diferentes xticks, y hasta cambiar sus nombres&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # Definición de los yticks&lt;br /&gt;
 plt.yticks([0,2,4,6,7,10])&lt;br /&gt;
 # Definición de los xticks y cambio de nombre&lt;br /&gt;
 plt.xticks([0,1,2,3,4,5], [“0”, “1oz”, &amp;quot;2oz”, “3oz”, “4oz”])&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 # definir los limites de los axis &#039;&#039;y&#039;&#039; y &#039;&#039;x&#039;&#039;&lt;br /&gt;
 plt.ylim(-1.0,1.0) #for y axis&lt;br /&gt;
 plt.xlim(0, 50) #for x axis&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para guardar la figura &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
plt.savefig(&#039;plot1.jpg&#039;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Para más ===&lt;br /&gt;
Ejemplo de código python disponible para todo tipo de gráficos en : &lt;br /&gt;
https://www.data-to-viz.com/&lt;br /&gt;
&lt;br /&gt;
También se puede ver la págino oficial de la libreria : &lt;br /&gt;
https://matplotlib.org/examples/&lt;br /&gt;
&lt;br /&gt;
Otras librerias basadas en Matplotlib están disponible, como seaborn.&lt;br /&gt;
&lt;br /&gt;
== cartopy ==&lt;br /&gt;
Cartopy es la libreria para trabajar con cartas. La libreria anterior es basemap, utilizada en muchos scripts, pero ya no será actualizada, entonces porque no pasarte directamente a cartopy??&lt;br /&gt;
&lt;br /&gt;
Cartopy funciona con Matplotlib pero agrega la posibilidad de trabajar con datos geospaciales.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Para ir más lejo = &lt;br /&gt;
Para desarollar funciones con más potencial se puede trabajar en languaje de más bajo nivel (se recuerdan que python es de alto nivel, es bastante flexible con la estructura de los codigos) como Fortran o Cython.&lt;br /&gt;
Es muy útil a la hora de recorrer indices, cosa por la cual python es bastante lento (terminado los loops &amp;lt;code&amp;gt;for i in range(1000)&amp;lt;/code&amp;gt; que duran una eternidad).&lt;br /&gt;
&lt;br /&gt;
== f2py3 ==&lt;br /&gt;
f2py3 es la libreria para utilizar funciones de fortran en python.&lt;br /&gt;
&lt;br /&gt;
== cython ==&lt;br /&gt;
cython es la librería para utilizar funciones de C en python.&lt;br /&gt;
&lt;br /&gt;
= Algunos tips = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ejercicios =&lt;/div&gt;</summary>
		<author><name>Anthony.schrapffer</name></author>
	</entry>
</feed>