¡Hola a todos! Ya hemos tenido el Functional February y el Mechanical March. Ahora es el turno del Analytical April, en el que nos vamos a centrar en lenguajes que son estupendos para la ciencia de datos.
Como ya te habrás acostumbrado tras los últimos meses, en este vídeo Erik y yo te damos un rápido resumen de en qué consiste el mes y de los distintos lenguajes que vamos a explorar.
Así que, como siempre, Erik te hablará un poco de los lenguajes dentro de un momento, pero yo voy a empezar contando algunos de los detalles prácticos del mes.
Empecemos por los lenguajes destacados de este mes. Este mes solo tenemos tres: Julia, Python y R. Cada uno de estos lenguajes es bastante distinto y, evidentemente, Python es un lenguaje muy polivalente, pero este mes vamos a animarte a que intentes usar estos lenguajes con una mentalidad de ciencia de datos.
Para conseguir la insignia de Analytical April necesitas completar cinco ejercicios en uno de esos lenguajes. Enseguida exploraremos las diferencias entre ellos, pero en términos de Exercism, nuestro track de Python tiene un temario fantástico, así que te recomiendo mucho que lo pruebes. También esperamos lanzar un temario de Julia durante el mes: gran parte del trabajo ya está hecho y solo necesita un último repaso. R no tiene temario, pero tiene un montón de ejercicios interesantes para que juegues con ellos.
Tenemos cinco ejercicios destacados para probar:
- etl: en el que puedes explorar cómo reestructurar datos en un formato diferente
- largest-series-product: donde puedes practicar formas eficientes de buscar patrones en un string de dígitos
- saddle-points: para explorar el trabajo con arrays/matrices multidimensionales
- sum-of-multiples: para practicar el filtrado y la suma de una secuencia de números
- word-count: convertir un string en palabras y contarlas
Te recuerdo que, además de la insignia de Analytical April, hay una insignia #12in23 que dura todo el año y que puedes conseguir resolviendo los distintos ejercicios destacados en cualquier momento del año. Así que tendrás que resolver esos 5 ejercicios en Python, R o Julia en algún momento de este año para conseguir esa insignia. Para ver la lista completa de ejercicios, hay una publicación del foro enlazada desde la página de Analytical April.
Por último, antes de meternos de lleno con los lenguajes, te recuerdo que durante marzo lanzamos nuestro nuevo servidor de Discord. Allí ha habido un montón de actividad divertida, así que asegúrate de echarle un vistazo. ¡El enlace está en la descripción que hay debajo!
Bien, vamos a explorar los lenguajes. Veamos primero un rápido resumen de cada uno y después profundizaremos en sus características y sus casos de uso. Empecemos por Python.
Python
- Concebido y desarrollado por Guido van Rossum a finales de la década de 1980 como sucesor del lenguaje de programación ABC. Se publicó por primera vez en 1991.
- Desarrollado en los Países Bajos, en el Centrum Wiskunde & Informatica (CWI) (famoso por ser el lugar donde Edsger Dijkstra hizo la mayor parte de su trabajo), un laboratorio de investigación financiado por el gobierno.
- Guido programaba con C y con scripts de shell, pero ambos tenían inconvenientes. Python pretende conseguir lo mejor de los dos mundos, sin sus inconvenientes.
- Lo gestiona la Python Software Foundation y los cambios en el lenguaje se hacen a través de las Python Enhancement Proposals (PEP), similares a los RFC.
R
- Creado por Ross Ihaka y Robert Gentleman en la Universidad de Auckland. R puede considerarse una implementación distinta del lenguaje S (con diferencias relativamente menores), al que sucedió S-plus, una implementación comercial (no abierta) de S. Aunque R comparte la mayor parte de la sintaxis con S, su semántica está inspirada en Scheme.
- Objetivo: crear un lenguaje más adecuado para la computación estadística y los gráficos, y más fácil de usar que el software comparable diseñado por informáticos.
Julia
- Desarrollado por Jeff Bezanson, Stefan Karpinski, Viral B. Shah y Alan Edelman de forma abierta; actualmente cuenta con más de mil colaboradores.
- Objetivo: construir un lenguaje libre y de alto nivel que tenga la velocidad de C, el dinamismo de Ruby, la metaprogramación de LISP, las capacidades de propósito general de Python, el soporte estadístico de R, el soporte de álgebra lineal de MatLab y la potencia de procesamiento de strings de Perl, todo ello siendo capaz de soportar ejecución masivamente paralela.
- Excelente para la computación científica, pero también un lenguaje de propósito general (el framework Genie para aplicaciones web).
Como ocurre con muchos lenguajes, los tres se crearon por insatisfacción :)
Vale, genial. Entonces, en cuanto a los casos de uso, ¿cuándo usarías cada uno de estos lenguajes en lugar de los demás?
Python
- Un verdadero lenguaje de propósito general (sitios web, scripts, computación científica)
- Se puede usar para muchísimos propósitos distintos: IA (TensorFlow), scripts de computación científica (NumPy), sitios web (Django), sistemas embebidos (MicroPython), interacción con hardware (por ejemplo, Raspberry Pi), juegos (EVE Online) e incluso Python llegó a Marte
- Estupendo para aprender a programar: una gran cantidad de recursos y una comunidad enorme. Hay muchísimas guías sobre cómo escribir código pythónico (es decir, cómo escribir código Python idiomático; por ejemplo, «Explícito es mejor que implícito» y «La legibilidad cuenta»). Muchos sistemas operativos lo traen instalado por defecto
- Uno de los lenguajes más usados en este momento, así que hay un montón de documentación, bibliotecas y una gran comunidad
R
- R se usa en una gran variedad de ámbitos: investigadores para analizar datos de experimentos, universidades para enseñar estadística y análisis de datos, el sector financiero, donde la estadística es clave (por ejemplo, en seguros), lo mismo en el comercio minorista (Amazon usa R para el análisis de datos) y en la industria manufacturera (John Deere calcula cuántas piezas de repuesto debe producir), el National Weather Service ayuda a predecir el tiempo y los desastres, el periodismo de datos (analizar datos del mundo real y darles sentido, a menudo con visualizaciones), y se usa muchísimo en el ámbito sanitario, por ejemplo para determinar la seguridad de un fármaco a partir de ensayos preclínicos
Julia:
- Excelente para la computación científica, la minería de datos, el aprendizaje automático, el álgebra lineal y la computación distribuida. Su notación resultará parecida a la notación matemática, por lo que pasar de la ecuación al código es relativamente fácil
- Computación distribuida: las tareas (= corrutinas) y los canales permiten ejecutar código en paralelo que se comunica entre sí, y hay soporte multiproceso mediante el paso de mensajes (estupendo para la computación de alto rendimiento)
- Se usa en el proyecto Celeste (un superordenador que ejecuta código Julia para analizar 178 terabytes de datos astronómicos) (lo que convierte a Julia en miembro del club de los petaflops, al que por aquel entonces solo pertenecían C, C++ y Fortran; Julia es el primer lenguaje dinámico en lograrlo, con mil billones de operaciones en coma flotante por segundo, es decir, 1 seguido de 15 ceros), en Clima (la alianza de modelización climática), donde hay gente del Caltech, el MIT y el Jet Propulsion Laboratory de la NASA que desarrolla un modelo de predicción del clima, y también en el CERN y ASML
Y desde el punto de vista de la programación, ¿en qué se diferencian? ¿Son funcionales, orientados a objetos, etc.?
Python:
- Dinámico y de tipado fuerte
- Multiparadigma: imperativo, funcional, pero en realidad un lenguaje orientado a objetos (todo es un objeto)
- El intérprete por defecto, CPython, compila a bytecode y luego este se interpreta en una máquina virtual. PyPy es un sustituto de CPython que compila a código máquina just-in-time
R:
- Dinámico y de tipado fuerte
- Multiparadigma: con un núcleo funcional, pero también admite estilos procedurales u orientados a objetos
Julia:
- Dinámico y de tipado fuerte, compilado just-in-time
- Multiparadigma: imperativo, orientado a objetos (sobrecarga mediante despacho múltiple), funcional (funciones de orden superior, aplicación parcial, operador de tubería)
- El código se compila just-in-time, de forma anticipada, en tiempo de ejecución
Y siguiendo con esta mirada desde el punto de vista de la programación, ¿tiene alguno de los lenguajes alguna característica que destaque especialmente?
Python:
- Sintaxis agradable: la sensibilidad a los espacios en blanco hace que el scope sea fácil de ver. El código suele ser fácil de leer, por ejemplo, condiciones booleanas legibles para humanos (and/or)
- Expresivo: se hace mucho con bastante poco código (list comprehensions, generadores, decoradores)
- Una enorme cantidad de bibliotecas disponibles para una amplia variedad de propósitos
- Como ya se ha dicho, es un verdadero lenguaje de propósito general, ya que se puede usar en muchísimos escenarios distintos
Julia
- Despacho múltiple. Decide qué función llamar en función de los tipos de todos los argumentos (como la sobrecarga de funciones)
- Dinámico pero con un rendimiento excelente. El rendimiento de Julia puede rivalizar con el de Fortran y acercarse al de C. El código «normal» suele ser eficiente (no hacen falta trucos locos; de hecho, se anima a usar funciones más pequeñas). Bibliotecas para ejecutar código en la GPU
- Computación distribuida: las tareas (= corrutinas) y los canales permiten ejecutar código en paralelo que se comunica entre sí, y hay soporte multiproceso mediante el paso de mensajes (estupendo para la computación de alto rendimiento)
- Excelente para la computación científica, la minería de datos, el aprendizaje automático, el álgebra lineal y la computación distribuida. Su notación resultará parecida a la notación matemática, por lo que pasar de la ecuación al código es relativamente fácil
R:
- Tipos de datos flexibles: el vector es el tipo central; incluso los escalares son vectores. Los vectores pueden tener metadatos asociados (por ejemplo, los nombres de sus elementos). Las listas son heterogéneas (pueden tener elementos de tipos distintos). Un tipo especial, el data frame, para una colección de vectores (todos de la misma longitud).
- Las operaciones vectorizadas permiten actualizar vectores de forma concisa, eficiente y legible
- R es un conjunto integrado de herramientas de software para la manipulación de datos, el cálculo y la representación gráfica. Explorar, visualizar y manipular datos es fácil con RStudio. Estupendo para la minería de datos
- Una gran comunidad, amable y diversa. La R for Data Science Online Learning Community es una comunidad de personas que aprenden R, de todos los niveles, que trabajan juntas para mejorar sus habilidades. Hay un grupo abierto de Slack donde sus miembros pueden mantenerse en contacto y ayudarse unos a otros con los problemas.
Si alguien no sabe cuál probar durante abril, ¿cómo le recomendarías que tomara la decisión?
Como todo en la informática: ¡depende! En este caso, yo diría que depende sobre todo de tus objetivos y de tu experiencia personal.
Si eres relativamente nuevo en la programación, te interesa la IA o el aprendizaje automático, o quieres aprender un lenguaje que puedas usar para muchas cosas distintas, probablemente te recomendaría empezar por Python: La cantidad de recursos disponibles para Python es gigantesca, e incluye muchos cursos gratuitos en línea Python se usa por todas partes con IA y aprendizaje automático Python se puede usar para un gran número de propósitos El track de Python tiene activado el modo de aprendizaje, que puede ayudarte a aprender los conceptos básicos del lenguaje de una forma divertida
Si te interesa el trabajo estadístico, quieres explorar y visualizar datos, o tienes curiosidad por una forma distinta de trabajar con datos, el lenguaje R es una gran elección: Los tipos de datos de R se basan en colecciones de datos (vectores/listas) y las operaciones se pueden aplicar a las colecciones con facilidad (sin necesidad de bucles) El IDE RStudio es estupendo para explorar y visualizar datos R tiene un soporte excelente para el análisis estadístico R permite representar datos gráficamente con facilidad
Si te interesa la computación científica, quieres ejecutar código de forma concurrente, te importa de verdad el rendimiento o quieres aprender un lenguaje moderno y elegante que ofrece algo distinto de la mayoría de los demás lenguajes, te recomendaría Julia:
- El despacho múltiple será nuevo para mucha gente y es increíblemente potente
- Julia es excelente para la computación científica
- El sistema de tipos de Julia es flexible y expresivo
- Julia tiene un rendimiento excelente
- Julia es ideal para la ejecución concurrente
Por supuesto, si tienes tiempo, te recomendaría probar los tres. Nunca sabes de verdad qué lenguaje vas a disfrutar hasta que lo pruebas.