AWK语言第二版 3.2啤酒评级

3.2 啤酒评级

我们的下一个数据集是大约160万种啤酒的评级,数据来源于 ratebeer.com,一个啤酒爱好者的网站。数据集太大,通过逐行研究来确认它的特性是不可行的,所以我们要依赖像Awk这样的工具来探索并验证数据。

数据来自Kaggle,一个用于试验机器学习算法的网站。你可以通过链接https://www.kaggle.com/datasets/rdoume/beerreviews 找到原文件;我们感谢RateBeer,Kaggle 和数据集的创建者提供了这么一个有趣的数据集。

首先从一些基本的参数开始:文件有多大,看起来怎么样?做粗略统计的话,没有工具能比 wc 命令更好用:

$ time wc reviews.csv1586615 12171013 180174429 reviews.csv
real    0m0.629s
user    0m0.585s
sys     0m0.037s

不出所料,wc 很快,但如我们之前所说,可以很容易用 Awk 写一个与 wc 等效的程序:

$ time awk '{ nc += length($0) + 1; nw += NF }
END { print NR, nw, nc, FILENAME }' reviews.csv
1586615 12170527 179963813 reviews.csv
real    0m9.402s
user    0m9.159s
sys     0m0.125s

在这个特定的测试中Awk慢了一个数量级。在大多数使用场景下Awk是足够快的,不过也有其他程序更适合的时候。有点出人意料的是,Gawk快了5倍,只用了1.9秒。

然而还有更让人意外的:wc 和 Awk 统计出来的单词数和字符数不一样。我们晚点再来研究这个,不过预先说一下,wc 是计算字节的(因此隐含假定输入全是ASCII),而Awk是计算Unicode UTF-8字符的。例如对下面这条评级,两个程序就会得到不同的结果:

95,Löwenbräu AG,1257106630,4,4,3,atis,Munich Helles Lager,4,4,Löwenbräu Urtyp,5.4,33038

UTF-8是一种变长编码:ASCII字符占一个字节,而其他语言的字符占2到3个字节。有变音符号的字符在UTF-8中占两个字节。数据集里有些记录还包含亚洲字符,会占3个字节。在此情况下,wc 会比 Awk 多统计出一些字符数。

原始数据有13个属性,而我们这里只用其中的5个:酒厂名称,总体评价,啤酒风格,啤酒名称,酒精度数(酒精所占容量的百分比,简称ABV)。我们提取这五个属性来创建一个新文件,并通过设置输出域的分隔符OFS,把文件格式从CSV转换成TSV。得到如下这些行(太长的行在这里拆成两行来展示,行末有斜杠表示续行,实际文件中是一行)

Amstel Brouwerij B. V.  3.5 Light Lager Amstel Light   3.5
Bluegrass Brewing Co.   4   American Pale Ale (APA) American \Pale Ale   5.79
Hoppin' Frog Brewery    2.5 Winter Warmer   Frosted Frog \Christmas Ale  8.6

这么做之后文件从180M缩小到 113M,虽然还是很大,但更好处理了。

在上面的样本行中,我们看到酒精度ABV变化范围比较大,这让我们有个疑问:这些啤酒里面最烈的是什么,酒精度有多高?下面这个程序可以轻松解答:

NR > 1 && $5 > maxabv { maxabv = $5; brewery = $1; name = $4 }
END { print maxabv, brewery, name }

得到的结果是【注意:FS要设为\t】

57.7 Schorschbräu Schorschbräu Schorschbock 57%

这数值惊人地高,大概是平常啤酒度数的10倍了,所以表面上看这像是数据错误。但上网查一下,能确认数据没错。这就带来另一个问题:这么高的酒精度是奇异值吗,或者仅仅只是冰山一角?如果我们找下高酒精度,比如大于10%的啤酒:

$5 >= 10 { print $1, $4, $5 }

会得到超过195000条评级记录【实际194359条,没超过】,这暗示着高酒精度的啤酒更流行,至少在上RateBeer网站参与评级的人之中更流行。

当然这会带来更多问题,这回看看低酒精度的啤酒。比如酒精度低于【不高于】0.5%(这是美国——至少美国部分地区——法律定义的无酒精饮料)的啤酒怎么样?

$5 <= 0.5 { print $1, $4, $5 }

结果只有 68808 条评级,这说明低酒精度啤酒远没有那么受欢迎。

评级和酒精度的高低有什么关联吗?

$ awk -F'\t' '$5 >= 10 {rate += $2; nrate++}END {print rate/nrate, nrate}' rev.tsv
3.93702 194359$ awk -F'\t' '$5 <= 0.5 {rate += $2; nrate++}END {print rate/nrate, nrate}' rev.tsv
3.61408 68808
$ awk -F'\t' '{rate += $2; nrate++}END {print rate/nrate, nrate}' rev.tsv
3.81558 1586615

高酒精度啤酒的平均评级,高于所有啤酒的平均评级,后者又高于低酒精度啤酒的评级。这可能有统计学意义,也可能没有。(不过和三位作者中至少一位的个人偏好是一致的。)

且慢!进一步检查发现,有67800条评级里面根本不带ABV,这个域是空的!我们再加上合适的检查,重跑这个低酒精度评级的计算:

$ awk -F'\t' '$5 != "" && $5 <= 0.5 {rate += $2; nrate++}END {print rate/nrate, nrate}' rev.tsv
2.58895 1023

看这个评分,即使不是啤酒爱好者也能猜到,无酒精的啤酒不那么受欢迎,评分也不高。

这些例子告诉我们,还是得仔细看看所有的数据。有多少域是空的,或者明确写出了无用值如 N/A?一个列里值的范围是多少?有哪些不同的值?应该在初始探索过程中回答这些问题,而投入点时间和精力,写一些简单的脚本将这个过程给自动化,会带来更多的回报。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/126177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Terraform 系列-使用Dynamic Blocks对Blocks进行迭代

系列文章 Terraform 系列文章Grafana 系列文章 概述 Terraform 系列文章 介绍了使用 Grafana Terraform Provider, 基于 Terraform 的 IaC 方法论, 来批量自动化创建 Grafana 的各类资源, 包括 Dashboard/Datasource 等. 现在有这么一个现实需求&#xff1a; 出于权限控制…

Ubuntu 22.04 安装 Terraform

Ubuntu 22.04 安装 Terraform 安装 Terraform 安装 Terraform sudo apt updatesudo apt install software-properties-common gnupg2 curlcurl https://apt.releases.hashicorp.com/gpg | gpg --dearmor > hashicorp.gpgsudo install -o root -g root -m 644 hashicorp.gpg…

shell_62.shell脚本生成一个标准的 SQL INSERT 语句

无论是将文件读入脚本&#xff0c;还是将数据从脚本输出到文件&#xff0c;都会用到文件重定向&#xff0c;这是一种很 常见的操作。本节中的示例脚本两种功能皆有。它会读取 CSV 格式的数据文件&#xff0c;输出 SQL INSERT 语句&#xff0c;并将数据插入数据库。 shell 脚本使…

数字展厅搭建平台要具备哪些功能,如何选择数字展厅搭建平台

引言: 数字展厅搭建平什台是现代营销中不可或缺的重要工具之一。它可以帮助企业打造个性化、多媒体、互动性强的展示空间&#xff0c;吸引、引导和留住目标用户。在选择数字展厅搭建平台时&#xff0c;我们需要考虑各方面的功能和性能&#xff0c;以确保能够满足企业的需求并取…

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…

全网公开电商数据的采集重点

数据的采集是根据需求而定的&#xff0c;品牌会做数据采集的原因&#xff0c;一般与内部营销、渠道管控有关&#xff0c;如需要做价格管控时&#xff0c;需要先采集价格&#xff0c;这就需要对数据进行采集&#xff0c;包括价格、促销信息&#xff0c;又或者是需要做行业分析、…

typing.Union` 标注一多种变量类型

typing.Union 标注一多种变量类型 typing.Union 是Python typing 模块中用于标注一个变量可以是多种类型之一的类型提示。在Python 3.10版本及以后&#xff0c;推荐使用 | 运算符代替 Union。不过&#xff0c;在详细介绍 Union 的用法前&#xff0c;值得注意的是在大多数情况下…

PHP连接SQLServer echo输出中文汉字显示乱码解决方法

1、查询结果有中文会显示乱码。 解决方法一&#xff08;较简单&#xff0c;建议使用&#xff09;&#xff1a; 在php文件最开头写上&#xff1a; header(Content-type: text/html; charsetUTF8); // UTF8不行改成GBK试试&#xff0c;与你保存的格式匹配 <?php header(&q…

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A转为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表…

波浪理论第3波anzo capital昂首资本3个方法3秒确认

要想通过波浪理论在交易中赚取最大利润&#xff0c;确认第三波必不可少&#xff0c;因为第三波通常是趋势中最大和最强的一波&#xff0c;今天anzo capital昂首资本3个方法3秒确认。 首先&#xff0c;第一个确认方法—斜率。 通常&#xff0c;第三波的斜率会比第一波更陡峭&a…

Linux内核是如何创建进程?

目录 1.Linux如何创建进程 2.fork函数原理 2.1 fork函数原型 2.2 fork函数实现原理 2.3 父子进程虚拟地址空间&#xff08;mm_struct&#xff09;之间的关系 2.4 写时拷贝&#xff08;copy-on-write&#xff09;技术 2.5 父子进程如何共享文件&#xff08;files_struct&…

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1

目录 问题&#xff1a;原因&#xff1a;解决方法&#xff1a; 问题&#xff1a; Caused by: java.nio.charset.MalformedInputException: Input length 1 原因&#xff1a; 应该是中文有哪些文字导致的。 yml 编码格式出错 解决方法&#xff1a; 直接这里把GBK改成 utf-8…

unordered系列关联式容器--哈希结构详细讲解及使用示例

目录 unordered系列关联式容器unordered_map 哈希哈希概念哈希函数直接定址法&#xff1a;除留余数法&#xff1a; 哈希冲突解决哈希冲突闭散列&#xff1a;开散列&#xff1a; unordered系列关联式容器 之前讲解在C98中STL提供了底层为红黑树结构的一系列关联式容器&#xff…

vue按需加载组件

写vue时候&#xff0c;通常会进行路由懒加载&#xff0c;如下&#xff1a; {path: /settlementCenter/offCompensationSettlement,name: XXX,component: () >import(/view/settlementCenter/settlement/offCompensationSettlement.vue),meta: {}},写vue代码页面时&#xff0…

Nginx域名重定向(如何访问的域名和实际的数据请求路径不同,可解决前端跨域)

感情需要被抑制&#xff0c;不能泛滥… 当需要将一个域名重定向到另一个域名并且用户仍然看到原始域名时&#xff0c;Nginx是一个强大的工具。这种场景通常涉及到反向代理或重写URL的技巧。在本篇博客中&#xff0c;我们将详细介绍如何使用Nginx来实现这个目标&#xff0c;以及…

Navicat安装和使用

获取安装包打开这个地址 https://wp.hellocode.name/?page_id1349 Navicat是一款功能强大的数据库管理工具,它可以让您更方便地管理MySQL、MariaDB、SQL Server、Oracle、PostgreSQL等数据库。下面我来给您简单介绍一下Navicat的主要功能和使用方法: 一、建立数据库连接 首先…

精品基于Python的考场考试分配规划系统

《[含文档PPT源码等]精品基于Python的考场分配规划系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技…

合肥工业大学离散数学总评报告

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :hfut实验课设 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少…

深入理解JVM虚拟机第十四篇:虚拟机栈的特点和详细介绍(一)

大神链接:作者有幸结识技术大神孙哥为好友,获益匪浅。现在把孙哥视频分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员 本专栏简介:话不多说,让我们一起干翻JavaScript 本文章简介:话不多说,让我们讲清楚JavaScript里边的Math 文章目…

非负的整型怎么定义字段类型?状态只有0和1?还有只有几个状态?几十个状态?

对于非负的整型数据&#xff1a; TINYINT UNSIGNED&#xff1a;MySQL中的一种整数数据类型&#xff0c;用于存储非负整数&#xff0c;取值范围为0到255。这个类型通常用于存储小范围的非负整数&#xff0c;如0到100之间的数值。SMALLINT UNSIGNED&#xff1a;MySQL中的另一种整…