Cuando la Comunidad Científica notó que las computadoras podían facilitar su trabajo, sus integrantes se convirtieron posiblemente en los adoptantes tempranos más entusiastas de la tecnología. Aunque el uso y la potencia de las computadoras crece continuamente en el ámbito científico, poco se ha avanzado en la formación y desarrollo de habilidades en Desarrollo de Software.
El cálculo científico requiere realizar combinaciones de múltiples tareas de diversa clase. Por ejemplo, es necesario registrar automáticamente datos de un experimento y visualizarlos, realizar cálculos numéricos o simbólicos, ordenar, clasificar, simular, etc. Muchas veces podemos utilizar paquetes de software que realizan esas tareas por nosotros, pero muchas otras ocurre que nadie ha implementado un determinado cómputo en la forma que necesitamos, o simplemente queremos probar ideas nuevas. Cualquiera sea la naturaleza de nuestra actividad en la ciencia o en la tecnología, no resulta infrecuente la necesidad de interactuar con computadoras a través de programas propios.
El uso de Python en aplicaciones científicas ha aumentado sostenidamente en los últimos años, sin embargo es difícil encontrar libros o manuales en castellano de Python que no estén pensados para programadores.
Este libro nace con la idea primaria de acercar Python al mundo científico, en un libro pensado para científiques, a partir de nuestra experiencia en el dictado del curso "Herramientas Computacionales para Científicos" que ofrecemos en la Universidad Nacional de La Plata y la Universidad Tecnológica Nacional, desde 2007. De la misma manera, la elección del castellano como idioma de escritura es un factor crítico, porque aunque sabemos que el inglés es una herramienta fundamental tanto para programar como para hacer ciencia, estamos convencidos que no debería ser una barrera de entrada.
Más allá de las secciones básicas de un libro (índice, bibliografía, etc.), el libro tiene dos grandes partes. La primera habla de Python, algunas bibliotecas importantes y otros temas que son fundamentales. En la segunda, mostramos cómo abordar temas científicos básicos utilizando Python, de forma teórica y práctica.
En ambos casos este libro esquiva la pretensión de ser una referencia absoluta, sino que tiene el propósito de allanar el camino de les científiques para dar los primeros pasos en el lenguaje y solucionar los problemas básicos (pero no por eso menos importantes) de la ciencia y la tecnología.
Tanto los textos como el código fuente, ejemplos e imágenes son Copyright de Facundo Batista y Manuel Carlevaro y están compartidos bajo la licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0), salvo que se especifique puntualmente lo contrario.
Este sitio es parte del soporte de construcción del libro.
Todavía en desarrollo, aquí se irán publicando capítulos por separado (en distintos grados de finalización) con la idea de poder compartir el contenido y en lo posible ir recibiendo feedback.
Cada capítulo es un PDF diferente, y en este directorio del proyecto en Github, bajo el directorio correspondiente a ese capítulo, estarán los programas en Python que se mencionan o usan en el texto.
Qué es Python. Propiedades del lenguaje, multiparadigma, interpretado. Biblioteca estándar, módulos externos, integrado en Python. Editando y ejecutando, usando módulos. El intérprete interactivo, Jupyter Notebooks, explorando. Tipos de datos: números, cadenas, listas, tuplas. Pensando como un Pythonista. Más tipos: conjuntos y diccionarios. Iteradores. Controles de flujo: if, while, for. Excepciones. Encapsulando código: funciones, espacios de nombres, generadores, clases, módulos. Cómo pedir ayuda.
Introducción. Solución analítica. Métodos numéricos. Ecuación diferencial con valores iniciales.
Introducción y conceptos. El array. Multidimensionalidad. Slices. Indización avanzada, máscaras, arreglos correlacionados. Broadcasting.
Clasificación. Método de las diferencias finitas. Ecuación 1D con método explícito. Solución con método implícito. Implementación con matriz rala. Método de elementos finitos. Ecuación de Poisson. Formulación variacional. Implementación en FEniCS.
Introducción. La necesidad del punto flotante. La estructura y sus partes. Valores especiales.Binario y decimal. Errores, comparaciones. Uso en aplicaciones científicas.
Sistemas de ecuaciones lineales. Condicionamiento. Factorización LU. Problema de autovalores. Ecuaciones no lineales de una y varias dimensiones.
Control de versiones, utilidad, necesidad, casos de uso. Ramas. Git. Flujo de traajo, ciclo de vida de una rama, ejemplo práctico. Lecturas recomendadas.
Integración simbólica. Transformaciones integrales. Integración numérica en una dimensión: métodos de Newton-Cotes, cuadraturas gaussianas, integración Monte Carlo. Integración numérica con SciPy. Integración múltiple.
Introducción a la problemática. Descripción de la necesidad de múltiples entornos. Repetibilidad y aislamiento. Entornos virtuales, creación y activación, instalación de paquetes. Herramientas: virtualenv, virtualenvwrapper, fades, pipenv. Ejemplos prácticos. Contenedores, conceptos, distinción con imágenes. El Dockerfile. Creando imágenes. Ejecutando contenedores. Copiando resultados desde el contenedor. Valor de los contenedores a nivel sistema. Compartiendo imágenes.
Números aleatorios. Distribuciones: medidas de centralidad y dispersión. Test de hipótesis. Estimación no paramétrica.
Introducción. Qué es la concurrencia. Threading. Usando hilos. Modificando estructuras en sistemas multithreading, condiciones de carrera, locks. Sistemas asincrónicos, ventajas y desventajas. Usando async. Procesamiento en múltiples procesadores, compartiendo datos. Trabajando con números. Ejemplo práctico.
Introducción. Coeficiente de correlación. Definición de modelos estadísticos con patsy. Regresión lineal y discreta. Series temporales.
Concepto de interfaz gráfica. Qt. PyQt. Documentación. Una aplicación mínima. Widgets. Diseño. Señales. Una aplicación real. La ventana principal. Menús y barra de tareas, acciones. Diálogos. Tablas: vista y modelo. Ejecución en otro hilo para no bloquear la interfaz.
Optimización unidimensional. Optimización multidimensional sin restricciones. Optimización multidimensional con restrcciones. Programación lineal y no lineal. Algoritmo genético.
Leyendo archivos, formas de apertura. Trabajando con datos en formato textual, tres formatos comunes: CSV, JSON y XML. Trabajando con datos binarios, un formato muy usado: HDF5. Pandas, carga de datos, estructuras básicas, operaciones.
Introducción. Nodos, pesos y funciones de activación. Aprendizaje. Ejemplo de red usando Numpy. Ejemplo con Keras.
Introducción. Profiling. Encontrando dónde un programa es lento. Midiendo pequeñas partes de código. Usando Python de forma más eficiente. Planes alternativos cuando Python puro sigue siendo lento: Mypyc, Cythin, Numba, conclusiones. Usando código compilado: extendiendo Python con C o C++, aprovechar código previamente compilado.
Generadores. Administradores de contexto: uso, construcción clásica y abreviada. Acercándonos a la programación funcional: funciones lambda, map, filter y reduce, alternativas. Pruebas de unidad: conceptos, estados de salida, construcción de caso ejemplo. Decoradores: uso y conceptos, construcción.
Introducción. Arquitectura de una GPU. Kernels y threads en CUDA. Organización de threads. Producto de matrices en GPU con PyCUDA y PyOpenCL.