数据科学家笔记:小型工具很大



通常,在数据科学家的工作中,我必须将数据从一个视图转移到另一个视图,进行汇总,得到相同的粒度,然后清理数据,加载,卸载,分析,格式化和发送结果(通常也是某种形式的数据)。数据总是有问题,需要快速地来回驱动它们-最重要的是,经典的Unix实用程序和小型但引以为傲的工具可以帮助我实现这一点:今天我们将讨论它们。



今天将有一些示例和需要我使用它们的情况。此处和下文所述的一切都是真实的主观体验,当然每个人的情况都不同,但也许对某人有用。



工具-学习工具-编写的所有内容都是主观的,并且完全基于个人经验:它帮助了我,也许也将对您有所帮助。



在您开始阅读之前,我们提醒您,现在我们正在为kulkhackers玩我们的游戏,在其中您可以有时间赢钱...


Zsh和oh-my-zsh-在Bash工作了这么多年之后!



我现在记得,我17岁,安装了Linux。终端和重击。无论如何,bash始终是过程的一部分,并且对我来说是终端中实际工作的代表。博士学位毕业后的12年,我进入了一家有介绍性文件的公司,这是我第一次遇到罂粟花,因此我决定遵循它。



瞧!方便的文件夹导航,人工自动完成,git指示器,主题,插件,对python虚拟环境的支持等-现在我坐在终端机上,我并不为之高兴!





我们将zsh放到您通常放的所有东西上,然后转到oh-my-zsh(实际上,这是一个民间的食谱集,可以直接使用,并增加了对插件,主题等的支持)。你可以在这里拿走您还可以放置一个主题(例如,嗯)。这是一个很好的可能性演示。来自这个文章在这里。



流水线





最好的终端设计之一是管道。简而言之,它允许您将一个命令的输出连接到另一个命令的输入,这是一个简单的应用程序示例,该示例实际上取自我两天前所做的任务。



有必要用一种语言模拟一个问题来解决组合问题,一切都从终端启动,并通过放置一个简单的图标|以绝对不可读的形式显示在文本中。 -连接的输入输出端和由格式支持:



| python.py format.py



一项更有趣且日常的任务是根据上传的数据评估一些参数或特征,通常这是一系列快速检查,以确保数据在服务器上某处的所需值表现良好-例如,我们想了解解析器的功能以及查看所有json文件中收集了多少个唯一组-该参数自然会随着时间的推移而适当增长:



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


我们将进一步讨论它们中的每一个,但是总体思路已经很清楚了:



  • cat-(连接的缩写)从数据/文件夹中打印名称中带有“ group”字样的文件的内容
  • jq-从json中删除“ group”字段
  • uniq-仅保留唯一组
  • wc-使用-l开关来计算行数,即组数 


现在,我们将仔细研究wc。



WC是一个小巧但引以为傲的实用程序,用于计算行,单词等。



wc-可以使用简单的按键快速读取单词,行,字母,字节和最大行长:



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

看来这是微不足道的,但事实证明这常常是必需和方便的。



每天使用时,让我们快速估算一下我们收集了多少数据(这里是一行,一条记录):





更多细节在这里



Ack / grep



已经写了成千上万的关于它们的手册和文章,但是我不禁提及-他们根据模式使用常规和自己的查询语言来提取文本。通常,在我看来,ack更友好,更易于使用,因此就在这里:



示例:在python源文件中快速找到单词(键“ -w”)ga2m(模型类型),不区分大小写(键-i) :





JQ-在命令行上解析json



文件资料



JQ对于json来说是彻头彻尾的grep / ack(尽管稍加sed和awk-稍后再介绍)-实际上,命令行上有一个用于json和json行的简单解析器,但是有时它非常方便-以某种方式我必须解析wikidata档案在bz2格式中,它的重量约为100GB,未压缩的重量约为0.5TB。



有必要从中删除几个字段之间的对应关系,事实证明,这非常简单地在一台实际上没有CPU和内存负载的机器上完成,这是我使用的命令: 



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"


本质上,整个管道创建了必要的映射,因为我们看到一切都在流模式下工作: 



  • bzcat阅读了档案的一部分并给了jq
  • 带有-stream键的jq立即产生结果并将其传递给python中的后处理器(就像第一个示例一样)
  • 在内部,后处理器是一个简单的状态机


总体而言,复杂的管道以流模式处理大数据(0.5TB),而没有大量资源,由一个简单的管道和几个工具组成。绝对会建议您在休闲时退房。



fzf-模糊查找器



最方便的事情(尤其是在wim中):快速搜索文件,这对于大型项目很方便-尤其是当您有多个文件时。通常,您需要在一个大型项目中按某个单词快速搜索文件:我沉浸在一个新项目中,该项目包含多个大型存储库,并且作为入门任务,我需要向系统中可用的分类中添加一个简单模型,我需要快速使用ga2m关键字查找文件,然后与其他“代码块”进行类比-快速编辑其中一个-在这里fzf非常有用:





链接到存储库



AWK



该名称来自Aho,Weinberger和Kernighan的创建者的首字母:实际上,一种用于处理文本表数据的脚本语言-将转换模式应用于文件的每一行。



通常,它是快速一次性转换的理想选择,例如,我们以tsv的形式手工组装了一个数据集,并且处理器接收jsonl作为输入,并期望源文件中没有其他的“主题”字段(某些对当前计算不重要的事情是必需的)-总的来说,编写了一条简单的单行代码:



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




实际上,他拿了一个文件,并在每行中用必要的字段包装了json。



教程链接



wget-多功能命令行下载器



定期,脚本和管道必须从某个地方提取并下载某些内容-wget不会失败:它可以下载,登录,代理,Cookie,除了http(s)外,它还可以执行ftp。下载中的



瑞士刀



HSTR-具有人脸的搜索命令历史记录



命令历史:hstr



定期我必须在命令历史中搜索某些内容:



  • “我已经必须这样做了”
  • “ X以什么键开头?”
  • “但是这块可以重复使用”


因此,对我来说,在命令的历史记录中进行良好而便捷的搜索非常重要,而hstr完全可以完成其工作:







有用但不包括在内



在最后,我会提到有用的东西-但在该主题的另一篇文章中-看起来很有用: 



  • SSH + tmux + vim(neo,插件等)
  • 命令行git + git hooks的基本知识
  • Data pipeline construction make/just
  • Python virtual environments
  • Docker





All Articles