AWK语言第二版 3.4 Unicode数据 3.5 基本图表 3.6 总结

news2024/11/25 0:44:25

3.4 Unicode数据

啤酒是不分国界的饮料,与之相称的是,啤酒的名字中也使用了很多非ASCII字符。下面的 Awk 程序 charfreq 统计了输入中每个不同的 Unicode 代码点(code point)的出现次数。(代码点通常是一个字符,但有些字符是由多个代码点组成的)

# charfreq - count frequency of characters in input

awk '
{ n = split($0, ch, "")
  for (i = 1; i <= n; i++)
    tab[ch[i]]++
}

END {
  for (i in tab)
    print i "\t" tab[i]
} ' $* | sort -k2 -nr

用空字符串作为域分隔符来拆分每行,把每个字符都存成数组 ch 的一个元素,然后用 tab 来计算这些字符数量;最后以倒序显示累加的数量。

这程序在啤酒数据(见3.2节)上跑得不快,在2015年的 MacBook Air上就花了250秒钟。下面这个版本快了两倍多,正好不超过105秒:

# charfreq2 - alternate version of charfreq

awk '
{ n = length($0)
  for (i = 1; i <= n; i++)
    tab[substr($0, i, 1)]++
}

END {
  for (i in tab)
    print i "\t" tab[i]
} ' $* | sort -k2 -nr

这个版本没有使用 split,而是用 substr 每次提取一个字符。函数 substr(s, m, n) 返回字符串 s 从位置 m 开始(m从1开始)且长度为 n 的子串,若 m 和 n 表示的范围超过了字符串的范围,则返回空字符串。如果不指定 n,则子串一直延续到 s 的末尾。完整的细节见参考手册 A.2.1节。

Gawk,即Awk的GNU版本,再次遥遥领先:第一个版本跑了72秒,第二个版本跑了42秒。

其他语言怎么样?为了比较,我们写了一个简单的Python版本的 charfreq:

# charfreq - count frequency of characters in input

freq = {}
with open('../beer/reviews.csv', encoding='utf-8') as f:
  for ch in f.read():
    if ch == '\n':
      continue
    if ch in freq:
      freq[ch] += 1
    else:
      freq[ch] = 1
for ch in freq:
  print(ch, freq[ch])

Python 版本花了45秒,和Gawk差不多,不过代价是还得写文件处理的代码。(本书作者不是Pythonistas,所以这个程序肯定是还能改进的)

除去每行末尾的换行符之外,啤酒评级文件中有 195 个不同的字符。出现最频繁的是空格,其次是可打印字符:

        10586176
,       19094985
e       12308925
r       8311408
4       7269630
a       7014111
5       6993858
...

还有不少来自欧洲语言的字符,比如德语的变音符号,以及一定量的日语和汉语字符:

ル        1
サ        1
ケ        1
ア        1

山        1

葉        1

黑        229

最后一个字符是黑(hei, black),出现在一种被简单命名为“Black”(对应汉字为 黑)的烈性 Imperial stout 酒名中。

Mikkeller ApS,2, American Double / Imperial Stout, Black (黑), 17.5

3.5 基本图表

可视化是探索性数据分析的重要组成部分,而幸运的是有不少非常不错的绘制库,使制作图表变得相当轻松。对 Python 来说更是如此,它有 Matplotlib 和 Seaborn 等包,不过在 Unix 和 macOS 上用 Gnuplot 进行快速绘图也不错。当然 Excel 和其他电子表格程序也能创建不错的图表。这里我们只会对绘制数据给出最少量的建议,读者们应该自己做实验(来找到自己喜欢的方式)。

在ABV和评分之间存在关联吗?打分人更偏爱高酒精度啤酒吗?可以用散点图来得到一个快速的印象,不过绘制150万个点有困难。我们用Awk取出 0.1%的样本(大概1500个点),并进行绘制:

$ awk -F'\t' 'NR%1000 == 500 {print $2, $5}' rev.tsv >temp
$ gnuplot
plot 'temp'
$

结果见下图 3-1。看来在评分和ABV之间最多存在弱关联。

图3-1

Tukey的可视化箱线图(boxplot)能显示数据集的中位数、四分位数和其他属性。箱线图有时称为箱须图,因为从箱体两段延伸出的两条“晶须”(whiskers)的范围,通常是下四分位数和上四分位数之间范围的1.5倍。晶须之外的点是异常值。

下面这个简短的Python程序生成前面所述样本数据的箱线图。 temp 文件是前面的程序生成的,每行都包含了评分和ABV,中间用空格隔开,且不带表头。

import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv('temp', sep=' ', header=None)
plt.boxplot(df[0])
plt.show()

得到图3-2所示的箱线图,显示评分的中位数是4,而一半的评分介于3.5和4.5这两个四分位数之间。晶须最多延伸到四分位数间距的 1.5 倍,另外在 1.5 和 1.0 处存在异常值。

图 3-2

也许通过与大众市场的美国啤酒相比,可以看看任意特定的啤酒或酒厂的表现如何。

$ awk -F'\t' '/Budweiser/ { s += $2; n++ }
      END {print s/n, n }' rev.tsv
3.15159 3958

$ awk -F'\t' '/Coors/ { s += $2; n++ }
      END {print s/n, n }' rev.tsv
3.1044 9291

$ awk -F'\t' '/Hill Farmstead/ { s += $2; n++ }
      END {print s/n, n }' rev.tsv
4.29486 1555

这表明在大规模生产的啤酒与小规模生产的精酿啤酒之间,存在明显的评分差距。

3.6 总结

探索性数据分析的目的是为了在对结果做出假设之前,去了解数据,寻找模式和异常。如 John Tukey所说:

一些数据,结合上对答案的渴望,并不能确保从给定的数据体中提取出合理的答案。

宁可要近似正确,而不要完全错误。

正确问题的近似答案(通常是模糊的)比错误问题的确切答案(总是能做成精确的)要好得多。

作为探索性数据分析的核心工具,Awk是非常值得学习的,因为你能用它来快速地统计、汇总、查找。当然Awk不能做所有的事,但和其他工具,特别是电子表格和绘图库,结合起来,就能非常好地对数据集所包含的内容有一个快速的了解。

其中的很大一部分在于识别异常和怪异。正如很久以前贝尔实验室的一位同事所说:“三分之一的数据是坏的”。尽管他可能为了达到修辞效果而有所夸大,但我们已经看到了很多这样的例子:数据集中很大一部分真是古怪且不可信的。如果你构建了一套用于查看数据的工具和技术,就能更容易找到需要清理(至少是谨慎对待)的地方。

(第三章完)

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

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

相关文章

Deep Freeze冰点还原2024中文免费版恢电脑数据恢复工具

相信大家都认同更新日志&#xff1a;支持Win 10功能更新&#xff0c;Win更新的恢复升级&#xff0c;将系统驱动器从深度冻结保护中排除&#xff0c;全支持NVME驱动器&#xff0c;支持ISCSI驱动器。人所共知的是集成性和兼容性&#xff1a;Deep Freeze 冰点可兼容多种硬盘驱动器…

vulnhub打靶日记:接口和传参的信息收集技巧

目录 总结 边界突破 信息收集 主机发现 端口扫描&#xff0c;服务探测 web渗透 目录扫描 参数爆破 php封装器写入文件尝试 ssh爆破 内网渗透 提权 免费领取安全学习资料包&#xff01; 靶机&#xff1a;https://download.vulnhub.com/evilbox/EvilBox---One.ova 攻…

Vue路由重定向

一、Vue路由-重定向 1.问题 网页打开时&#xff0c; url 默认是 / 路径&#xff0c;如果未匹配到组件时&#xff0c;会出现空白 2.解决方案 重定向 → 匹配 / 后, 强制跳转 /home 路径 3.语法 { path: 匹配路径, redirect: 重定向到的路径 }, 比如&#xff1a; { path:/ …

idea 2023 设置启动参数、单元测试启动参数

找到上方的editconfigration&#xff0c; 如下图&#xff0c;如果想在启动类上加&#xff0c;就选择springboot&#xff0c;如果想在单元测试加&#xff0c;就选择junit 在参数栏设置参数&#xff0c;多个参数以空格隔开 如果没有这一栏&#xff0c;就选择就可以了。 然后&…

JavaScript爬虫程序爬取游戏平台数据

这次我用一个JavaScript爬虫程序&#xff0c;来爬取游戏平台采集数据和分析的内容。爬虫使用了爬虫IP信息&#xff0c;爬虫IP主机为duoip&#xff0c;爬虫IP端口为8000。以下是每行代码和步骤的解释&#xff1a; // 导入所需的库 const axios require(axios); const cheerio …

为什么说亚马逊、Lazada、虾皮等跨境平台测评很重要?

在亚马逊、shopee、Lazada的生态系统中&#xff0c;给店铺测评是一个重要的环节&#xff0c;优质的评论可以给潜在的买家对于产品质量更加信任&#xff0c;其次对于提高产品的销售跟排名也可以起到关键的作用 为什么测评重要&#xff1f; 1. 提高页面权重 一般页面有三个部分…

fmx windows 下 制作无边框窗口最小化最大化并鼠标可拖移窗口

1,最顶端 放一个rectangle 置顶 ,此区域后面实现鼠标拖动 移动窗口,可在上面放置最大,最小,关闭按钮 2,窗口边框模式 设置 none 3,rectangel mousemove事件 uses Winapi.Windows,Winapi.Messages,FMX.Platform.Winprocedure TfrmMain.Rectangle1MouseMove(Sender: TObje…

今天分享5的款软件,你曾经用过几款?

​ 分享是一种博爱的心境&#xff0c;学会分享&#xff0c;就学会了生活&#xff0c;今天分享的五款软件&#xff0c;是否有你曾经使用过的软件呢&#xff1f; 1.虚拟桌面——Dexpot ​ Dexpot是一款免费的虚拟桌面软件&#xff0c;可以让您在Windows系统上创建和管理多个桌面…

C++容器—— set 和 multiset

一、set 1.介绍 1. 与map/multimap不同&#xff0c;map/multimap中存储的是真正的键值对&#xff0c;set中只放value&#xff0c;但在底层实际存放的是由构成的键值对。 2. set中插入元素时&#xff0c;只需要插入value即可&#xff0c;不需要构造键值对。 3. set中的元素不…

STM32 堆栈空间分布

参考 运行时访问__initial_sp和__heap_base 无RTOS时的情况 在以上配置的情况下&#xff0c;生成工程。在工程的startup.s文件中&#xff0c;由如下代码&#xff1a; Stack_Size EQU 0x400AREA STACK, NOINIT, READWRITE, ALIGN3 __Stack_top ; 自己添加 Stack_Mem…

Mysql数据库 10.SQL语言 储存过程 中 流程控制

存储过程中的流程控制 在存储过程中支持流程控制语句用于实现逻辑的控制 一、分支语句 语法&#xff1a;if-then-else 1.单分支语句 语法 if conditions then ——SQL end if; if conditions then——SQLend if; ——如果参数a的值为1&#xff0c;则添加一条班级信息 …

windows系统远程桌面连接centos7系统

1. 安装 GNOME 桌面环境&#xff08;如果尚未安装&#xff09; yum groupinstall "GNOME Desktop" 2. 安装 VNC Server yum install tigervnc-server 3. 设置 vnc 账号密码 vncpasswd root root 是账号&#xff0c;接下会提示两次输入密码 4. 安装 xrdp 检查…

Java智慧工地云平台监控管理系统源码

随着科技的发展&#xff0c;让人们也愈发了解可视化操作所带来的优势。智慧工地的诞生&#xff0c;相当于为建筑施工带来了一套较为完整的数字化流程&#xff0c;能够完善施工环节中的各部分内容。 智慧工地是指利用先进的信息技术&#xff0c;将传感器、互联网、人工智能等技术…

<a>标签的download属性部分浏览器无法自动识别文件后缀

问题 最近开发中遇到的问题&#xff0c;文件名中含有点和逗号字符&#xff0c;当使用a标签的download属性下载内容时&#xff0c;如果不指定后缀&#xff0c;部分浏览器无法自动识别文件后缀。如下图所示&#xff1a; 定义用法 download 属性定义了下载链接的地址。 href 属性…

注册虾皮买家号需要哪些资料?

注册虾皮买家号其实是很简单的&#xff0c;使用相应国家的手机号及对应的环境就可以注册了的&#xff0c;如果想要账号更方便使用&#xff0c;也可以绑定邮箱进行认证。 而如果想要使用shopee买家通系统进行自动化的注册&#xff0c;那么对于资料就有一定的要求了。 1、手机号…

vue上传宝塔退出页面404

当我们将vue上传到服务器上点击退出时出现页面404时。 如何解决&#xff1a; 1.如果是element plus框架时&#xff1a; 找到layouts文件里面的components文件下Avatar中的index.vue. 2.添加重新加载&#xff1a;location.reload(); 如果是其他的框架同上 。

Spring Boot中使用Spring Data JPA访问MySQL

Spring Data JPA是Spring框架提供的用于简化JPA&#xff08;Java Persistence API&#xff09;开发的数据访问层框架。它通过提供一组便捷的API和工具&#xff0c;简化了对JPA数据访问的操作&#xff0c;同时也提供了一些额外的功能&#xff0c;比如动态查询、分页、排序等。 …

C#,数值计算——偏微分方程,谱方法的微分矩阵的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 谱方法的微分矩阵 /// Differentiation matrix for spectral methods /// </summary> public class Weights { public Weights() { …

单调栈及其应用

1. 单调栈 应用场景&#xff1a;求解下一个更大/小的数原理&#xff1a;空间换时间&#xff0c;暴力解法O&#xff08;n&#xff09;单调栈作用&#xff1a;记录遍历过的元素&#xff0c;与当前元素进行对比 模板:求解左边比它更小的元素 单调递增的栈&#xff08;底——》顶…

Python的asyncio库:掌握异步编程的利器

目录 一、引言 二、异步编程概述 三、asyncio库的使用方法 1、导入asyncio库 2、创建异步函数 3、创建事件循环 4、运行异步任务 5、关闭事件循环 四、asyncio库的高级用法 1、异步上下文管理器 2、协程函数和协程变量的共享状态 五、注意事项 六、总结 一、引言 …