Notes du Data Scientist: les petits outils sont gros



Le plus souvent, dans le travail d'un datascientist, je dois transférer des données d'une vue à une autre, agréger, conduire à la même granularité et nettoyer les données, charger, décharger, analyser, formater et envoyer les résultats (qui, en général, sont également des données sous une forme ou une autre). Il y a toujours quelque chose qui ne va pas avec les données et elles doivent être rapidement entraînées dans les deux sens - surtout, les utilitaires Unix classiques et les petits outils fiers m'aident: nous en parlerons aujourd'hui.



Et aujourd'hui, il y aura une sélection d'exemples et de situations dans lesquelles je dois les utiliser. Tout ce qui est décrit ici et ci-dessous est une véritable expérience subjective et bien sûr c'est différent pour tout le monde, mais peut-être sera-t-il utile à quelqu'un.



Outils - apprenez les outils - tout ce qui est écrit est subjectif et basé uniquement sur l'expérience personnelle: cela m'a aidé, peut-être que cela vous aidera.



Avant de commencer à lire, nous vous rappelons que nous jouons maintenant à notre jeu pour les kulkhackers , dans lequel vous pouvez avoir le temps de gagner de l'argent ...


Zsh et oh-my-zsh - après toutes ces années à Bash!



Si je me souviens maintenant, j'avais 17 ans et j'avais installé Linux. Terminal et Bash. Et d'une manière ou d'une autre, la bash faisait toujours partie du processus et personnifiait pour moi le travail réel dans le terminal. 12 ans après mon doctorat, je me suis retrouvé dans une entreprise où il y avait un document d'introduction et pour la première fois je suis tombé sur un coquelicot et j'ai décidé de le suivre.



Et voilà! Navigation pratique dans les dossiers, autocomplétion humaine, indicateur git, thèmes, plugins, prise en charge d'un environnement virtuel pour python, etc. - maintenant je suis assis dans le terminal et je ne suis pas ravi!





Nous mettons zsh, comme vous mettez généralement tout et allez dans oh-my-zsh (en fait, il s'agit d'un assemblage folklorique de recettes qui fonctionnent hors de la boîte et d'un support supplémentaire pour les plugins, les thèmes, etc.). Vous pouvez le prendre ici . Et vous pouvez également mettre un thème (enfin, par exemple). Voici une bonne démonstration des possibilités. Tiré de cet article ici.



Pipelines





L'un des meilleurs designs de terminaux est le pipeline. Pour faire simple, cela vous permet de câbler les sorties d'une commande aux entrées d'une autre, un exemple d'application simple qui est littéralement tiré d'une tâche que je faisais il y a deux jours.



Il était nécessaire de simuler un problème dans une langue pour résoudre des problèmes combinatoires, tout était démarré depuis le terminal et affiché sous une forme absolument illisible à partir du texte en plaçant une simple icône | - entrées sorties sorties et prise en charge du formatage:



| python.py format.py



Une tâche plus intéressante et quotidienne consiste à évaluer un paramètre ou une caractéristique en fonction des données téléchargées, en règle générale, il s'agit d'une série de vérifications rapides que les valeurs requises quelque part sur le serveur avec les données se comportent bien - par exemple, nous voulons comprendre ce que nous avons avec l'analyseur et voir combien de groupes uniques sont collectés dans tous les fichiers json - ce paramètre devrait naturellement croître de manière adéquate avec le temps:



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


Nous parlerons plus en détail de chacun d'eux, mais l'idée générale est déjà claire:



  • cat - (abréviation de concatenate) imprime le contenu des fichiers avec le mot "group" dans le nom du data / folder
  • jq - arrache le champ "group" de json
  • uniq - ne laisse que des groupes uniques
  • wc - avec le commutateur -l compte les lignes, c'est-à-dire le nombre de groupes 


Et maintenant, nous allons examiner de plus près wc.



WC est un petit mais fier utilitaire pour compter les lignes, les mots, etc.



wc - peut lire rapidement des mots, des lignes, des lettres, des octets et la longueur maximale de la ligne, le tout à l'aide de touches simples:



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

Il semble que cela soit trivial, mais cela s'avère incroyablement souvent nécessaire et pratique.



Utilisation quotidienne, estimons rapidement la quantité de données que nous avons collectées (voici une ligne, un enregistrement):





Plus de détails ici .



Ack / grep



Des milliers de manuels et d'articles ont été écrits à leur sujet, mais je ne peux m'empêcher de mentionner - ils déchirent le texte avec des habitués et leur propre langage de requête selon le modèle. En général, il me semble que ack est plus convivial et plus facile à utiliser dès la sortie de la boîte, donc ce sera ici:



Exemple: trouver rapidement l'occurrence du mot (clé «-w») ga2m (type de modèle), insensible à la casse (commutateur -i) dans les fichiers source python :





JQ - analyse json en ligne de commande



Documentation .



JQ est carrément grep / ack pour json (bien qu'avec une touche de sed et awk - à propos de ce dernier plus tard) - en fait, un simple analyseur pour json et json en ligne de commande, mais parfois c'est extrêmement pratique - en quelque sorte, j'ai dû analyser l'archive wikidata au format bz2, il pèse environ 100 Go et environ 0,5 To non compressé.



Il a fallu en extraire une correspondance entre plusieurs champs, ce qui s'est avéré être fait très simplement sur une machine avec pratiquement aucune charge sur le processeur et la mémoire, voici la commande même que j'ai utilisée: 



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"


C'est essentiellement l'ensemble du pipeline qui a créé le mappage requis, car nous voyons que tout fonctionnait en mode flux: 



  • bzcat a lu une partie de l'archive et a donné à jq
  • jq avec la clé -stream a immédiatement produit le résultat et l'a passé au postprocesseur (comme avec le tout premier exemple) en python
  • en interne, un post-processeur est une simple machine à états


Au total, un pipeline complexe fonctionnant en mode flux sur du big data (0,5 To), sans ressources importantes et constitué d'un simple pipeline et de quelques outils. Je recommanderais certainement de partir à votre guise.



fzf - recherche floue



La chose la plus pratique (surtout dans un wim): recherche rapidement dans les fichiers, ce qui est pratique pour un grand projet - surtout lorsque vous en avez plusieurs. En règle générale, vous devez rechercher rapidement des fichiers par un certain mot dans un grand projet: j'étais immergé dans un nouveau projet, qui comprend plusieurs grands référentiels et en guise de tâche d'introduction, j'avais besoin d'ajouter un modèle simple à l'assortiment disponible dans le système et je devais rapidement trouvez vos fichiers en utilisant le mot-clé ga2m et travaillez par analogie avec d'autres "blocs de code" - éditez rapidement l'un ou l'autre - ici fzf vient très bien à la rescousse:





Lien vers le référentiel .



AWK



Le nom vient des premières lettres des créateurs d'Aho, Weinberger et Kernighan: en fait, un langage de script pour le traitement des données de table de texte - il applique des modèles de transformation à chaque ligne du fichier.En



règle générale, il est idéal pour les transformations rapides et ponctuelles, par exemple, nous avions un ensemble de données assemblé à la main sous la forme de tsv , et le processeur a reçu jsonl comme entrée et attendait un champ "thème" supplémentaire qui n'était pas dans le fichier source (nécessaire pour certaines choses qui n'étaient pas critiques pour les calculs actuels) - au total, une simple ligne a été écrite:



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




En fait, il a pris un fichier et a enveloppé chaque ligne dans json avec les champs nécessaires.



Lien du tutoriel .



wget - téléchargeur de ligne de commande polyvalent



Régulièrement, les scripts et les pipelines doivent extraire et télécharger quelque chose de quelque part - et wget n'échoue pas: il peut télécharger, se connecter, des proxies, des cookies et en plus de http (s), il peut faire du ftp.



Couteau suisse en téléchargement.



HSTR - historique des commandes de recherche, avec un visage humain



ommand history: hstr



Je dois régulièrement rechercher quelque chose dans l'historique des commandes:



  • "Je devais déjà le faire"
  • "Avec quelles clés X commence-t-il?"
  • "Mais cette pièce peut être réutilisée"


Par conséquent, il est très important pour moi d'avoir une bonne et pratique recherche dans l'historique des commandes, tandis que hstr fait complètement son travail:







Utile mais non inclus



En fin de compte, je mentionnerais utile - mais en tirant sur des sujets d'article séparés - il est utile de regarder: 



  • Ssh + tmux + vim (neo, plugins, etc.)
  • Connaissance de base des hooks git + git en ligne de commande
  • Data pipeline construction make/just
  • Python virtual environments
  • Docker





All Articles