- GLOSARIO
- CURSOS
- TUTORIALES
- LENGUAJE - PECULIARIDADES
- Variables
- Estilo
- Formateo texto
- Bucles
- Modismos (idioms)
- Context manager & with
- List comprehension
- Zip - iteracion paralela
- Funcion lambda
- Decorador funciones
- Operador ternario (condicional)
- Generadores (yield)
- args y kwargs
- Redondeo
- Excepciones
- Clases
- Break, continue y pass
- Encadenamiento operadores comparacion
- Underscore - uso sintactico
- Acceso a variables de forma dinámica
- LIBRERIAS
- HERRAMIENTAS PARA DATOS
- APP HOSTING
- GRAPHING (Matplotlib)
- HERRAMIENTAS PARA CODIGO
- PACKAGING (crear librerías)
- Archivo README
- API
Table of contents generated with markdown-toc
El presente repositorio [https://github.com/isi-ies-group/python-info] contiene documentos útiles. Ver listados de fichero arriba.
Breve explicación de nombres relacionados con los proyectos que sostienen el mundo Científico-Python (SciPy) desde un punto de vista de una persona que realiza computación y/o conoce Matlab.
Python [cheatsheet 1] [cheatsheet 2]
Es el lenguaje, a diferencia de otros conceptos del entorno Python que se detallan más adelante.
- Es un lenguaje multiplataforma, más compacto, más legible, más fácil de depurar pero menos rápido, menos voluminoso y con menos control de la máquina respecto a C/C++.
- El lenguaje y las librerías son libres y gratuitas. Las más importantes son ya estándares de facto y se actualizan rápido.
- Es un lenguaje interpretado, basado en scripts. No se tiene que compilar para que se ejecute el código.
- Se puede ejecutar un script en otro PC muy fácilmente y editarlo de forma instantánea. Especialmente conveniente para controlar tareas automáticas.
- Se puede ejecutar de forma interactiva, lanzando
python
desde la línea de comandocmd
sin ningún parámetro. - Se pueden crear ejecutables mediante librerías.
Python en 100 segundos (video)
https://realpython.com/lessons/scripts-modules-packages-and-libraries/#description
- Un script es un archivo de Python destinado a ser ejecutado directamente. Cuando se ejecuta, debe hacer algo. Esto significa que los scripts contendrán a menudo código escrito fuera del ámbito de cualquier clase o función.
- Un módulo es un archivo de Python destinado a ser importado en scripts u otros módulos. A menudo define miembros como clases, funciones y variables destinadas a ser utilizadas en otros archivos que lo importan.
- Un paquete es una colección de módulos relacionados que trabajan juntos para proporcionar cierta funcionalidad. Estos módulos están contenidos en una carpeta y pueden ser importados como cualquier otro módulo. Esta carpeta contendrá a menudo un archivo especial init que indica a Python que es un paquete, que puede contener más módulos anidados en subcarpetas
- Una biblioteca es un término paraguas que significa vagamente "un paquete de código". Estos pueden tener decenas o incluso cientos de módulos individuales que pueden proporcionar una amplia gama de funcionalidad.
-
https://numpy.org/doc/stable/user/numpy-for-matlab-users.html
-
Python es un lenguaje de propósito general, mientras que Matlab está enfocado a ingeniería.
-
Ambas sintaxis son muy parecidas.
-
Ambos se pueden usar en entornos REPL (https://elpythonista.com/python-shell-repl) muy útiles para prototipar.
-
Python es mucho más potente, capaz de realizar más cosas y en general más rápido que Matlab.
-
Python aun tiene partes que no están tan maduras como Matlab (IDE, algunas librerías vs toolkits), pero suficiente como para trabajar sin problemas. Otras partes (potencia lenguaje, librerías) superan con creces a Matlab.
-
Pyton no tiene una alternativa madura a Simulink.
-
Son interoperables: https://es.mathworks.com/matlabcentral/fileexchange/72852-using-matlab-with-python?s_tid=FX_rc1_behav
Es un IDE (Integrated Development Environment), el programa para escribir/ejecutar scripts, manipular datos y depurar código.
- Es el que hay que EJECUTAR para trabajar! - https://www.spyder-ide.org/
- Instalación recomendada [2021-04], usar instalador individual. No recomiendan instalarlo como paquete de conda dentro del environment de trabajo por defecto, usando
conda install spyder
.- Hay que apuntar Spyder al environment de conda que usemos por defecto con todos los paquetes que usemos de forma explícita: http://docs.spyder-ide.org/current/faq.html#using-existing-environment
- Thonny
- IDE àra Python muy sencillo, ideal para principiantes
- PyCharm
- Muy interesante la version "Community" gratuita
- Visual Studio Code
- Gitpod
- VSCode online y la versión para GitHub (se abre desde cada repo en <>Code - Codespaces)
- Jupyter, ver sección Jupyter
Es una versión mejorada de la terminal de Python.
- Básicamente aparece en Spyder como terminal por defecto, aunque se puede lanzar desde
cmd
con el comandoipython
. - Permite autocompletado, sugiere nombres de funciones, lleva control de historial, número de líneas...
- https://ipython.readthedocs.io/en/stable/interactive/tutorial.html
Gestor de librerías. Permite instalar, quitar, actualizar, listar.
Mediante el comando conda install <libreria>
desde cmd
se instalan las librerías necesarias.
Es la fuente de donde vienen los paquetes. Existe un canal default
que se toma por defecto y pertenece/actualiza Anaconda, pero que no siempre está actualizado al 100%.
Es un canal estándar de facto mantenido por la comunidad que es actualizado por los propios desarrolladores de las librerías.
- Usar este canal por defecto ejecutando estos comnados:
conda config --add channels conda-forge
conda config --set channel_priority strict
OPCIÓN RECOMENDADA
Conda vs Miniconda vs Anaconda https://ichi.pro/assets/images/max/724/1*O5Jgl-KFuvUyujAZhXHYlQ.png
Es una distribución de Python mínima, que solo instala Python + conda (gestor de librerias).
https://docs.conda.io/en/latest/miniconda.html
- Ver la última versión en la web!
- Hay que elegir Python 2 o 3. Elegir 3, ya que la v. 2 está sin soporte.
Es una distribución de Python adecuada al mundo científico con muchas librerías. Resulta muy pesada, mejor usar miniconda. https://www.anaconda.com/distribution/
- Es también el nombre de la empresa que crea y mantiene esta distribución.
- Curso muy ameno, para aprender el lenguaje Python haciendo, hay app https://www.sololearn.com/Course/Python/
- Software Carpentry realiza talleres sobre programación y publican el material https://software-carpentry.org/lessons/index.html
- Clean code (libro referente) basado en Python https://github.com/zedr/clean-code-python
-
Buen tutorial general https://docs.python-guide.org/
-
Libro con énfasis en pensar a programar que usa notebooks "The aim of this book is to teach you coding in Python while developing computational thinking" https://learnpythonwithjupyter.com/
-
Python 101 (en un Jupyter Notebook) https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas-2nd-edition/blob/master/ch_01/python_101.ipynb
-
Tutoriales temáticos para (casi) todas las características/opciones/librerias del lenguaje https://realpython.com/
-
Guia Python Científico http://scipy-lectures.org/
-
Transitioning from MATLAB to Python
- https://leportella.com/english/2018/07/22/10-tips-matlab-to-python.html
- https://hub.gke.mybinder.org/user/gestaltrevision-thon_for_visres-ones2sck/notebooks/Part3/Part3_Scientific_Python.ipynb
- https://www.enthought.com/wp-content/uploads/Enthought-MATLAB-to-Python-White-Paper.pdf
- Tutorial variables https://realpython.com/python-variables/
- Nombres y referencias https://nedbatchelder.com/text/names.html
- Tipos de datos https://pynative.com/wp-content/uploads/2021/02/python-data-types.jpg
- Mapa mental tipos de datos https://devopedia.org/images/article/41/4737.1513052765.jpg
- Paso a funciones https://stackoverflow.com/questions/986006/how-do-i-pass-a-variable-by-reference
PEP 8
- Ver sección linter
- Guia https://docs.python-guide.org/writing/style
- Guia https://realpython.com/python-pep8/
- Cheatsheet https://cheatography.com/jmds/cheat-sheets/python-pep8-style-guide/
Pythonic loops (olvídate de los loops con índice!)
- Idiomatic Python https://jerry-git.github.io/learn-python3/#idiomatic-python
- Consejos con idioms https://hackernoon.com/going-beyond-the-idiomatic-python-a321b6c6a5e6
- Ejemplos peor->mejor https://gist.github.com/0x4D31/f0b633548d8e0cfb66ee3bea6a0deff9
sentencia = "el rápido zorro marrón salta sobre el perro perezoso"
palabras = sentencia.split()
longitud_palabra = []
for palabra in palabras:
if palabra != "el":
longitud_palabra.append(len(palabra))
vs
longitud_palabras = [len(palabra) for palabra in palabras if palabra != "el"]
- https://realpython.com/python-rounding/
- Python redondea según el convenio tipico en computación según el IEEE 754: por proximidad unbiased, prefiriendo en el caso límite los resultados pares.
>>> round(7.5)
8
>>> round(8.5)
8
- https://realpython.com/python3-object-oriented-programming/
- Data classes: https://realpython.com/python-data-classes/
Para procesar, visualizar y representar datos existen librerías "científicas", como las de Matlab, aunque algunas son para obtener funcionalidades que vienen por defecto en Matlab.
- Hay que importar al principio de cada script cada libreria explícitamente, para mantener un control de los nombres de cada librería (espacio de nombres).
No usar
import *
https://www.geeksforgeeks.org/why-import-star-in-python-is-a-bad-idea/
- Si no están ya instaladas, se tienen que instalar desde la linea de comandos de Windows
cmd
con el comandoconda install "nombre_libreria"
. Si no estuviera en los repositorios de Anaconda, habría que instalarlas medianteconda install conda-forge::"nombre_libreria"
o finalmente conpip install "nombre_libreria"
. Si no existe como librería, se debería usar directamente como paquete de Python, en un fichero *.py - ACTUALIZACION! Usar canal
conda-forge
por defecto (ver Conda) - Control de librerias: Se pueden actualizar, instalar, desinstalar desde linea de comandos: 'cmd'.p. ej. 'conda update spyder'
Las más usuales son:
Funciones de cálculo numérico, muchas tienen la misma sintáxis que en Matlab p. ej. trapz()
Numpy [cheatsheet]
Implementa tipo de dato 'array' que permite operaciones vectoriales, tipo Matlab. No necesita la sintaxis con punto típica de Matlab (.*, ...). Una vez creado (o leido) el objeto Numpy la sintaxis es transparente. p. ej. a = b * c, donde b y c son vectores.
Matplotlib [cheatsheet]
Objetos y funciones para graficar, tiene sintaxis similar a Matlab. Aunque similar, algunas cosas son más claras.
Pandas [cheatsheet 1][cheatsheet 2]
Objetos tipo hoja_cálculo y métodos anexos. Especialmente útil para datos tipo tabla y aun más interesante para Series Temporales. Tiene una sintaxis muy intuitiva y simplificada, especialmente interesante para leer datos. p. ej.
- Lee fichero .csv, delimitado por tabs, toma como índice de tabla las dos primeras columnas (fecha y hora) y los valores '-' son tomados como 'NaN'
mad11 = pd.read_csv(path + 'madrid2011.txt', delimiter='\t', date_parser=parserdatetime, parse_dates=[[0, 1]], index_col=0, na_values='-')
- Lee varios ficheros y los concatena (one-liner)
pd.concat([pd.read_csv(name) for name in glob.glob("*.csv")])
- Toma la variable B y Bmj de mad11 (valores minutales) y devuelve la suma resampleada a frecuencia mensual.
eff_esp11_men = mad11.Bmj.resample('M', how='sum') / mad11.B.resample('M', how='sum')
- Introducción: https://realpython.com/pandas-python-explore-dataset/
- Libro de Wes McKinney (creador): https://wesmckinney.com/book/
- OJO copia DataFrames: https://stackoverflow.com/questions/27673231/why-should-i-make-a-copy-of-a-data-frame-in-pandas
- Tricks & Features You May Not Know: https://realpython.com/python-pandas-tricks/
Manipulación de imágenes.
- Nature - Programming: Pick up Python - A powerful programming language with huge community support https://www.nature.com/news/programming-pick-up-python-1.16833
- Presentar datos+código en vivo.
- IDE en web. Dos versiones: classic y lab
- Basado en ficheros notebook (.ipynb)
- Conceptos básicos https://github.com/jupyter/notebook/blob/main/docs/source/examples/Notebook/Notebook%20Basics.ipynb
- https://jupyter.org/
- https://mybinder.org/v2/gh/bloomberg/bqplot/1da9ae2fffcbe317b6b27f6ed4f6d6c8db283452 - Ejemplo en acción
- https://github.com/losc-tutorial/quickview - Repositorio con Jupyter notebook sobre gravitational waves
- https://github.com/jupyter/jupyter/wiki - Repositorio general
- Existen varias alternativas para la ejecución en entorno web: https://www.dataschool.io/cloud-services-for-jupyter-notebook/
- Crea espacio de trabajo en un servidor remoto para ejectuar en vivo Jupyter notebooks, sin necesidad de instalación local.
- Un repositorio tipo GitHub se puede convertir en un espacio de trabajo ejecutable.
- https://jupyter.org/binder - Información
- https://mybinder.org/ - Web app para lanzarlo
- Similar a Binder. La carga del servicio es notablemente más rápida.
- Orientado y con recursos de Google para ejecutar Machine/Deep Learning
- https://colab.research.google.com/
- Ejemplo tutorial https://colab.research.google.com/github/tensorflow/examples/blob/master/courses/udacity_intro_to_tensorflow_for_deep_learning/l01c01_introduction_to_colab_and_python.ipynb
- Permite crear tu propia nube para servir notebooks, como Binder en privado.
- Muy interesante para clase, evita que los estudiantes se tengan que instalar nada.
- Se puede alojar en recursos propios de nube o físicos: The Littlest JupyterHub
- https://jupyter.org/hub
- https://github.com/jupyterlite/jupyterlite
- Corre totalmente en el navegador: no requiere servidor!
- Se puede alojar directamente en p. ej. GitHub Pages
Servidor web para generar un dashboard: permite presentar datos interactivamente (by Plot.ly) https://dash-gallery.plotly.host/Portal/ (Galería)
Similar a Dash pero más sencillo aunque menos complejo. https://streamlit.io/
- Ofrece un servicio de repositorio y ejecución de apps creadas con esta tecnología: https://streamlit.io/sharing
Similar a Streamlit, de los creadores de RStudio https://shiny.posit.co/py/
Framework que permite a los usuarios crear aplicaciones ricas de Python en el navegador utilizando la interfaz de HTML (como PHP)
- https://www.genbeta.com/actualidad/ano-python-navegador-este-nuevo-proyecto-permite-ejecutar-python-tu-html
- https://github.com/pyscript/pyscript/blob/main/GETTING-STARTED.md
Permite correr las apps en la web. Streamlit Sharing lo permite para sus propias apps
La librería más potente y que permite crear gráficas bien acabadas para publicaciones es MATPLOTLIB (MPL):
- Tutorial básico (rápido) https://towardsdatascience.com/matplotlib-tutorial-learn-basics-of-pythons-powerful-plotting-library-b5d1b8f67596
- Guía (más completa y clara) https://realpython.com/python-matplotlib-guide/
- Guía oficial (más densa) https://matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py
- MPL Cheatsheets (interesante el de Tips&Tricks) https://github.com/matplotlib/cheatsheets
PANDAS de hecho implementa métodos .plot() que llaman a MPL para visualizaciones rápidas de DF/Series. Para pulir la gráfica hay que llamar a métodos directamente de MPL.
- Tutorial básico (rápido) http://queirozf.com/entries/pandas-dataframe-plot-examples-with-matplotlib-pyplot
- Guía oficial (más densa) https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html
- (Breve) Listado herramientas https://opensource.com/article/18/7/7-python-libraries-more-maintainable-code
- Sitio con cursos https://software-carpentry.org/lessons/index.html
- Tutorial con plantilla para empaquetar, probar, documentar y publicar código Python científico Bootstrap a Scientific Python Library
- Tutorial gestión proyecto Python https://jacobtomlinson.dev/series/creating-an-open-source-python-project-from-scratch/
PEP8
-
Ejemplo: pycodestyle/flake8 (comprueba código), autopep8 (formatea código)
Desde consola spyder:
!autopep8 -i file.py
o!autopep8 -i .
- Comprobación nombres objetos: variables, clases,... https://github.com/PyCQA/pep8-naming
PEP 257
-
Ejemplo: pydocstyle (comprueba docstring), docformatter (formatea docstring)
-
Info sobre documentar https://realpython.com/documenting-python-code/
-
Ejemplo docstrings (Sphinx extension) 1 Numpy-style https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_numpy.html
-
Ejemplo docstrings (Sphinx extension) 2 Numpydoc https://numpydoc.readthedocs.io/en/latest/format.html
Desde consola spyder:
!pytest .
No es realmente una herramienta si no una buena práctica. La idea es limpiar y mejorar la legibilidad del código, muchas veces reordenándolo.
https://realpython.com/python-refactoring/
Repositorio distribuido para código y datos usando protocolo git
. Utilizar herramienta GitHub Desktop
para sincronizar repositorio local y remoto.
- 10 min tutorial https://guides.github.com/activities/hello-world/
- Tutorial https://www.edureka.co/blog/how-to-use-github/
- Tutorial [Real Python] https://realpython.com/python-git-github-intro/
- Introdución a GitHub https://github.com/oscarperpinan/intro_github
- A successful Git branching model https://nvie.com/posts/a-successful-git-branching-model/
- How to Write a Git Commit Message https://chris.beams.io/posts/git-commit/
Antes de formalizar un
commit
pre-commit ejecuta automáticamente tareas tales como un linter para formatear el código.
Para evitar sincronizar ciertos archivos hay que rellenar el fichero
.gitignore
. Ver https://swcarpentry.github.io/git-novice-es/06-ignore/ Si ya se han sincronizado previamente, usargit rm -r --cached [file]
Permite automatizar eventos dentro de GH. Ver https://www.adictosaltrabajo.com/2020/10/28/introduccion-a-github-actions-sintaxis-basica/
Librería estándar para crear CLI (Command Line Interface)
- Tutorial https://realpython.com/command-line-interfaces-python-argparse
- Ejemplo código ISI https://github.com/isi-ies-group/scripts-servidor_helios/blob/master/genera_fichero_meteo.py
Archivo externo adicional que incluye información de configuración a leer (parsear) por una librería.
- Vistazo a varios tipos https://hackersandslackers.com/simplify-your-python-projects-configuration/
configparser
librería estándar para ficheros.ini
pyaml
librería externa para ficheros.yaml
Generar paquetes de Python, para instalar desde pip
- Tutorial https://python-packaging.readthedocs.io/
- https://www.blog.pythonlibrary.org/2021/09/23/python-101-how-to-create-a-python-package
- Incluso se puede instalar desde un repositorio:
pip install --upgrade git+https://github.com/isi-ies-group/cpvlib.git
Cookicutter
es una herramienta para generar el andamio de una librería: https://towardsdatascience.com/cookiecutter-creating-custom-reusable-project-templates-fc85c8627b07- https://semver.org/ Semantic Versioning: control del número de versión
- Estructurar y nombrar paquetes http://blog.nicholdav.info/four-tips-structuring-research-python/
Consejos https://dbader.org/blog/write-a-great-readme-for-your-github-project
- Info general: https://realpython.com/python-api/
- Crear API: https://realpython.com/fastapi-python-web-apis/
- REST API: https://realpython.com/flask-connexion-rest-api/
- Listado APIs: https://realpython.com/python-api/#further-reading