Notas del científico de datos: las herramientas pequeñas son grandes



La mayoría de las veces, en el trabajo de un científico de datos, tengo que transferir datos de una vista a otra, agregar, llevar a la misma granularidad y limpiar los datos, cargar, descargar, analizar, formatear y enviar los resultados (que, en general, también son datos de alguna forma). Siempre hay algo mal con los datos y es necesario moverlos rápidamente de un lado a otro; sobre todo, las utilidades clásicas de Unix y las herramientas pequeñas pero orgullosas me ayudan con esto: hablaremos de ellas hoy.



Y hoy habrá una selección con ejemplos y situaciones en las que tengo que utilizarlos. Todo lo que se describe aquí y a continuación es una experiencia subjetiva real y por supuesto es diferente para todos, pero quizás sea útil para alguien.



Herramientas - aprende las herramientas - todo lo escrito es subjetivo y se basa únicamente en la experiencia personal: me ayudó, tal vez te ayude.



Antes de que empieces a leer, te recordamos que ahora estamos jugando nuestro juego para kulkhackers , en el que puedes tener tiempo para ganar dinero ...


Zsh y oh-my-zsh, ¡después de todos estos años en Bash!



Como recuerdo ahora, tenía 17 años e instalé Linux. Terminal y Bash. Y de alguna manera, el bash siempre fue parte del proceso y personificó para mí el trabajo real en la terminal. 12 años después de mi doctorado, terminé en una empresa donde había un documento introductorio y por primera vez me encontré con una amapola y decidí seguirla.



¡Y he aquí! Navegación de carpetas conveniente, autocompletado humano, indicador de git, temas, complementos, soporte para un entorno virtual para Python, etc. - ¡ahora estoy sentado en la terminal y no estoy muy contento!





Ponemos zsh, como usualmente pones todo y vamos a oh-my-zsh (de hecho, este es un conjunto popular de recetas que funcionan de forma inmediata y que agregan soporte para complementos, temas, etc.). Puedes tomarlo aquí . Y también puedes poner un tema (bueno, por ejemplo). Aquí hay una buena demostración de las posibilidades. Tomado de este artículo aquí.



Oleoductos





Uno de los mejores diseños de terminales es la tubería. En pocas palabras, le permite conectar las salidas de un comando a las entradas de otro, un ejemplo de aplicación simple que se toma literalmente de una tarea que estaba haciendo hace dos días.



Era necesario simular un problema en un idioma para solucionar problemas combinatorios, todo se iniciaba desde el terminal y se mostraba de forma absolutamente ilegible desde el texto colocando un simple icono | - entradas salidas conectadas y soporte de formateo realizado:



| python.py format.py



Una tarea más interesante y cotidiana es evaluar algún parámetro o característica de los datos cargados; por regla general, se trata de una serie de comprobaciones rápidas de que los valores requeridos en algún lugar del servidor con los datos se comportan bien; por ejemplo, queremos entender qué tenemos con el analizador y vea cuántos grupos únicos se recopilan en todos los archivos json; este parámetro naturalmente debería crecer adecuadamente con el tiempo:



cat data/*groups* | jq .group | uniq | wc -l


Hablaremos más de cada uno de ellos, pero la idea general ya está clara:



  • cat - (abreviatura de concatenar) imprime el contenido de los archivos con la palabra "grupo" en el nombre de los datos / carpeta
  • jq - arranca el campo "grupo" de json
  • uniq - deja solo grupos únicos
  • wc - con el interruptor -l cuenta las líneas, es decir, el número de grupos 


Y ahora echaremos un vistazo más de cerca a wc.



WC es una pequeña pero orgullosa utilidad para contar líneas, palabras y más.



wc: puede leer rápidamente palabras, líneas, letras, bytes y la longitud máxima de línea, todo usando teclas simples:



  • —bytes
  • —chars
  • —words
  • —lines
  • —max-line-length
     

Parece que esto es trivial, pero resulta increíblemente necesario y conveniente a menudo.



Uso diario, calculemos rápidamente cuántos datos hemos recopilado (aquí hay una línea, un registro):





Más detalles aquí .



Ack / grep



Se han escrito miles de manuales y artículos sobre ellos, pero no puedo evitar mencionarlos: arrancan el texto con los habituales y su propio lenguaje de consulta de acuerdo con el patrón. En general, me parece que ack es más amigable y más fácil de usar de inmediato, por lo que estará aquí:



Ejemplo: encuentre rápidamente la aparición de la palabra (clave "-w") ga2m (tipo de modelo), sin distinción entre mayúsculas y minúsculas (clave -i) en archivos fuente de Python :





JQ - analizar json en la línea de comandos



Documentación .



JQ es francamente grep / ack para json (aunque con un toque de sed y awk, sobre este último más adelante); de hecho, un analizador simple para la línea json y json en la línea de comando, pero a veces es extremadamente conveniente; de ​​alguna manera tuve que analizar el archivo wikidata en formato bz2, pesa aproximadamente 100 GB y aproximadamente 0,5 TB sin comprimir.



Fue necesario extraer una correspondencia entre varios campos, lo que resultó ser muy simple en una máquina sin prácticamente carga en la CPU y la memoria, aquí está el comando que usé: 



bzcat data/latest-all.json.bz2  | jq —stream 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' | python3 scripts/post_process.py "output.csv"


Fue esencialmente toda la canalización la que creó el mapeo requerido, ya que vemos que todo funcionó en modo de transmisión: 



  • bzcat leyó parte del archivo y le dio a jq
  • jq con la clave -stream produjo inmediatamente el resultado y lo pasó al postprocesador (al igual que con el primer ejemplo) en Python
  • internamente, un postprocesador es una máquina de estado simple


En total, un pipeline complejo que trabaja en modo de flujo en big data (0,5 TB), sin recursos importantes y compuesto por un pipeline simple y un par de herramientas. Definitivamente recomendaría hacer el check out en su tiempo libre.



fzf - buscador difuso



Lo más conveniente (especialmente dentro de un wim): busca rápidamente en los archivos, lo cual es conveniente para un proyecto grande, especialmente cuando tiene varios de ellos. Como regla general, debe buscar rápidamente archivos por una determinada palabra en un proyecto grande: estaba inmerso en un nuevo proyecto, que incluye varios repositorios grandes y, como tarea introductoria, necesitaba agregar un modelo simple al surtido disponible en el sistema y necesitaba hacerlo rápidamente encuentre sus archivos usando la palabra clave ga2m y trabaje por analogía con otros "bloques de código" - edite rápidamente uno u otro - aquí fzf viene al rescate muy bien:





Enlace al repositorio .



AWK



El nombre proviene de las primeras letras de los creadores Aho, Weinberger y Kernighan: de hecho, un lenguaje de script para procesar datos de tablas de texto: aplica patrones de transformación a cada línea del archivo.Como



regla general, es ideal para transformaciones rápidas únicas , por ejemplo, teníamos un conjunto de datos ensamblado a mano en forma de tsv , y el procesador recibió jsonl como entrada y esperaba un campo de "tema" adicional que no estaba en el archivo de origen (necesario para algunas cosas que no eran críticas para los cálculos actuales); en total, se escribió una simple línea:



cat groups.tsv | awk '{ printf "{\"group\": \"%s\", \"theme\": \"manual\" }\n", $1  }' > group.jsonl




De hecho, tomó un archivo y envolvió cada línea en json con los campos necesarios.



Enlace del tutorial .



wget: descargador de línea de comandos versátil



Regularmente, los scripts y pipelines tienen que extraer y descargar algo de algún lugar, y wget no falla: puede descargar, iniciar sesión, proxies, cookies y, además de http (s), puede hacer ftp.



Navaja suiza en descarga.



HSTR: historial de comandos de búsqueda, con rostro humano



Historial de comandos: hstr



Regularmente tengo que buscar algo en el historial de comandos:



  • "Ya tenía que hacerlo"
  • "¿Con qué teclas empieza X?"
  • "Pero esta pieza se puede reutilizar"


Por lo tanto, es muy importante para mí tener una búsqueda buena y conveniente en el historial de comandos, mientras que hstr hace su trabajo completamente:







Útil pero no incluido



Al final, mencionaría que es útil, pero en un artículo separado del tema, es útil mirar: 



  • Ssh + tmux + vim (neo, complementos, etc.)
  • Conocimientos básicos de la línea de comandos git + git hooks
  • Data pipeline construction make/just
  • Python virtual environments
  • Docker





All Articles