2023年1月

Pandas 是一个十分流行的 Python 第三方库。本文介绍了 Pandas 库中的一些特性和函数,并且我们鼓励读者亲手使用 Pandas 库,来解决实际的业务问题。

Pandas 为 Python 中数据分析提供了基础和高级的构建组件。Pandas 库是用于数据分析与数据操作的最强大和最灵活的开源分析工具之一,并且它还提供了用于建模和操作表格数据(以行和列组织的数据)的数据结构

Pandas 库有两个主要的数据结构:第一个是 “ 系列 Series ”,该数据结构能够很方便地从 Python 数组或字典中按位置或指定的索引名称来检索数据;第二个是“ 数据帧 DataFrames ”,该数据结构将数据存储在行和列中。列可以通过列名访问,行通过索引访问。列可以有不同类型的数据,包括列表、字典、序列、数据帧、NumPy 数组等。

Pandas 库可以处理各种文件格式

有各种各样的文件格式。用于数据分析的工具必须能够提供处理各种文件格式的方法。

Pandas 可以读取各种文件格式,例如 CSV 文件、JSON 文件、XML 文件、Parquet 文件、SQL 文件,详见下表。

写入读取
CSV 文件to_csv 函数read_csv 函数
JSON 文件to_json 函数read_json 函数
Parquet 文件to_parquet 函数read_parquet 函数
SQL 文件to_sql 函数read_sql 函数,read_sql_query 函数,read_sql_table 函数
XML 文件to_xml 函数read_xml 函数

使用 Pandas 进行数据清理

在现实场景中,很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。此外,数据还会有需要 屏蔽 mask 的敏感和机密信息。接下来,Pandas 提供了清理、丢弃、替换、屏蔽等方法,来处理这些坏数据。

Pandas 清洗空值:

a. 空行可以使用 df.dropna(inplace=True) 方法来删除。

b. 空值可以使用 df.fillna(<value>, inplace=True) 方法来替换。还可以指定某一个列来替换该列的空数据。

Pandas 屏蔽数据:

c. 要屏蔽所有不满足条件 my_list.where(my_list < 5) 的敏感数据的值,可以使用 my_list.mask(my_list < 5)

Pandas 清洗重复数据:

d. 要删除重复数据,可以使用 drop_duplicates() 方法:

df.drop_duplicates(‘<column>’, keep = False)
df.drop_duplicates(‘<column>’, keep = ‘first’)
df.drop_duplicates(‘<column>’, keep = ‘last’)

使用 Pandas 进行数据分析

下面的表格列出了 Pandas 中进行数据分析的各种函数,以及其语法。(请注意:df 代表一个 数据帧 DataFrame 数据结构的实例。)

语法描述
df.head(x)head() 函数用于读取前面的 x 行,如果不填参数 x,默认返回 5 行
df.tail(x)tail() 函数用于读取尾部的 x 行,如果不填参数 x ,默认返回最后 5 行,空行各个字段的值返回 NaN
loc(x:y)Loc 函数返回指定行的数据,也可以对数据进行切片
groupby('<column>')对指定列的数据进行分组
df['column'].sum()计算指定列数据的总和
df['column']. mean()计算指定列数据的算术平均值
df['column'].min()计算指定列数据的最小值
df['column'].max()计算指定列数据的最大值
df.sort_values(['column'])在指定列上根据数值进行排序,默认升序
df.size返回元素的个数,即为行数 * 列数
df.describe返回对各列的统计汇总
pd.crosstab(df['column1'], df['column2'], margins = True)创建 column1column2 的交叉表
df.duplicated([column1, 'column2'])根据 column1column2 中的重复值,返回 TrueFalse

Pandas 的优点

  • 支持多索引(层次索引),方便分析多维数据。
  • 支持数据透视表的创建,堆栈和取消堆栈操作。
  • 可以使用 Pandas 处理有限值的分类数据。
  • 支持分组和聚合运算。
  • 可以禁用排序。
  • 支持行级过滤(获取满足过滤条件的行)和列级过滤(只选择需要的列)。
  • 有助于重塑数据集(数组的维度变换)。还可以转置数组的值,并转换为列表。当你使用 Python 处理数据时,可以将 Pandas 数据帧转换为多维 NumPy 数组。
  • 支持面向标签的数据切片。

Pandas 的不足

Pandas 的代码和语法与 Python 不同,所以人们需要额外再学习 Pandas。此外,相较于 Pandas,像三维数据这样的高维数据会在 NumPy 等其他库有更好的处理。

总结

Pandas 能够大幅提升数据分析的效率。它与其他库的兼容性使它在其他 Python 库中都能有效地使用。


via: https://www.opensourceforu.com/2022/08/pandas-the-popular-python-library-for-data-analysis-and-data-science/

作者:Phani Kiran 选题:lkxed 译者:chai001125 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我们都知道如何从键盘输入文字,不是吗?

那么,请允许我挑战你在你最爱的文本编辑器中输入这段文字:

«Ayumi moved to Tokyo in 1993 to pursue her career» said Dmitrii

这段文字难以被输入因为它包含着:

  • 键盘上没有的印刷符号,
  • 平假名日文字符,
  • 为符合平文式罗马字标准,日本首都的名字中的两个字母 “o” 头顶带有长音符号,
  • 以及最后,用西里尔字母拼写的名字德米特里。

毫无疑问,想要在早期的电脑中输入这样的句子是不可能的。这是因为早期电脑所使用的字符集有限,无法兼容多种书写系统。而如今类似的限制已不复存在,马上我们就能在文中看到。

电脑是如何储存文字的?

计算机将字符作为数字储存。它们再通过表格将这些数字与含有意义的字形一一对应。

在很长一段时间里,计算机将每个字符作为 0 到 255 之间的数字储存(这正好是一个字节的长度)。但这用来代表人类书写所用到的全部字符是远远不够的。而解决这个问题的诀窍在于,取决于你住在地球上的哪一块区域,系统会分别使用不同的对照表。

这里有一张在法国常被广泛使用的对照表 ISO 8859-15

The ISO 8859-15 encoding

如果你住在俄罗斯,你的电脑大概会使用 KOI8-R 或是 Windows-1251 来进行编码。现在让我们假设我们在使用后者:

The Windows-1251 encoding is a popular choice to store text written using the Cyrillic alphabets

对于 128 之前的数字,两张表格是一样的。这个范围与 US-ASCII 相对应,这是不同字符表格之间的最低兼容性。而对于 128 之后的数字,这两张表格则完全不同了。

比如,依据 Windows-1251,字符串 “said Дмитрий” 会被储存为:

115 97 105 100 32 196 236 232 242 240 232 233

按照计算机科学的常规方法,这十二个数字可被写成更加紧凑的十六进制:

73 61 69 64 20 c4 ec e8 f2 f0 e8 e9

如果德米特里发给我这份文件,我在打开后可能会看到:

said Äìèòðèé

这份文件 看起来 被损坏了,实则不然。这些储存在文件里的数据,即数字,并没有发生改变。被显示出的字符与 另一张表格 中的数据相对应,而非文字最初被写出来时所用的编码表。

让我们来举一个例子,就以字符 “Д” 为例。按照 Windows-1251,“Д” 的数字编码为 196(c4)。储存在文件里的只有数字 196。而正是这同样的数字在 ISO8859-15 中与 “Ä” 相对应。这就是为什么我的电脑错误地认为字形 “Ä” 就是应该被显示的字形。

When the same text file is written then read again but using a different encoding

多提一句,你依然可以时不时地看到一些错误配置的网站展示,或由 用户邮箱代理 发出的对收件人电脑所使用的字符编码做出错误假设的邮件。这样的故障有时被称为乱码(LCTT 译注:原文用词为 mojibake, 源自日语 文字化け)。好在这种情况在今天已经越来越少见了。

Example of Mojibake on the website of a French movie distributor. The website name has been changed to preserve the innocent.

Unicode 拯救了世界

我解释了不同国家间交换文件时会遇到的编码问题。但事情还能更糟,同一个国家的不同生产商未必会使用相同的编码。如果你在 80 年代用 Mac 和 PC 互传过文件你就懂我是什么意思了。

也不知道是不是巧合,Unicode 项目始于 1987 年,主导者来自 施乐 Xerox 和…… 苹果 Apple

这个项目的目标是定义一套通用字符集来允许同一段文字中 同时 出现人类书写会用到的任何文字。最初的 Unicode 项目被限制在 65536 个不同字符(每个字符用 16 位表示,即每个字符两字节)。这个数字已被证实是远远不够的。

于是,在 1996 年 Unicode 被扩展以支持高达 100 万不同的 代码点 code point 。粗略来说,一个“代码点”可被用来识别字符表中的一个条目。Unicode 项目的一个核心工作就是将世界上正在被使用(或曾被使用)的字母、符号、标点符号以及其他文字仓管起来,并给每一项条目分配一个代码点用以准确分辨对应的字符。

这是一个庞大的项目:为了让你有个大致了解,发布于 2017 年的 Unicode 版本 10 定义了超过 136,000 个字符,覆盖了 139 种现代和历史上的语言文字。

随着如此庞大数量的可能性,一个基本的编码会需要每个字符 32 位(即 4 字节)。但对于主要使用 US-ASCII 范围内字符的文字,每个字符 4 字节意味着 4 倍多的储存需求以及 4 倍多的带宽用以传输这些文字。

Encoding text as UTF-32 requires 4 bytes per character

所以除了 UTF-32,Unicode 联盟还定义了更加节约空间的 UTF-16UTF-8 编码,分别使用了 16 位和 8 位。但只有 8 位该如何储存超过 100,000 个不同的值呢?事实是,你不能。但这其中窍门在于用一个代码值(UTF-8 中的 8 位以及 UTF-16 中的 16 位)来储存最常用的一些字符。再用几个代码值储存最不常用的一些字符。所以说 UTF-8 和 UTF-16 是 可变长度 编码。尽管这样也有缺陷,但 UTF-8 是空间与时间效率之间一个不错的折中。更不用提 UTF-8 可以向后兼容大部分 Unicode 之前的 1 字节编码,因为 UTF-8 经过了特别设计,任何有效的 US-ASCII 文件都是有效的 UTF-8 文件。你也可以说,UTF-8 是 US-ASCII 的超集。而在今天已经找不到不用 UTF-8 编码的理由了。当然除非你书写主要用的语言需要多字节编码,或是你不得不与一些残留的老旧系统打交道。

在下面两张图中,你可以亲自比较一下同一字符串的 UTF-16 和 UTF-8 编码。特别注意 UTF-8 使用了一字节来储存拉丁字母表中的字符,但它使用了两字节来存储西里尔字母表中的字符。这是 Windows-1251 西里尔编码储存同样字符所需空间的两倍。

UTF-16 is a variable length encoding requiring 2 bytes to encode most characters. Some character still requires 4 bytes though (for example

UTF-8 is a variable length encoding requiring 1, 2, 3 or 4 bytes per character

而这些对于打字有什么用呢?

啊……知道一些你的电脑的能力与局限以及其底层机制也不是什么坏事嘛。特别是我们马上就要说到 Unicode 和十六进制。现在……让我们再聊点历史。真的就一点,我保证……

……就说从 80 年代起,电脑键盘曾经有过 Compose(有时候也被标为 Multi 键)就在 Shift 键的下边。当按下这个键时,你会进入 “ 组合 Compose ” 模式。一旦在这个模式下,你便可以通过输入助记符来输入你键盘上没有的字符。比如说,在组合模式下,输入 RO 便可生成字符 ®(当作是 O 里面有一个 R 就能很容易记住)。

Compose key on lk201 keyboard

现在很难在现代键盘上看到 Compose 键了。这大概是因为占据主导地位的 PC 不再用它了。但是在 Linux 上(可能还有其他系统)你可以模拟 Compose 键。这项设置可以通过 GUI 开启,在大多数桌面环境下调用“键盘”控制面板:但具体的步骤取决于你的桌面环境以及版本。如果你成功启用了那项设置,不要犹豫,在评论区分享你在你电脑上所采取的具体步骤。

(LCTT 译注:如果有读者想要尝试,建议将 Compose 键设为大写锁定键,或是别的不常用的键,CtrlAlt 会被大部分 GUI 程序优先识别为功能键。还有一些我自己试验时遇到过的问题,在开启 Compose 键前要确认大写锁定是关闭的,输入法要切换成英文,组合模式下输入大小写敏感。我试验的系统是 Ubuntu 22.04 LTS。)

至于我自己嘛,我现在先假设你用的就是默认的 Shift+AltGr 组合来模拟 Compose 键。(LCTT 校注:AltGr 在欧洲键盘上是指右侧的 Alt 键,在国际键盘上等价于 Ctrl+Alt 组合键。)

那么,作为一个实际例子,尝试输入 “LEFT-POINTING DOUBLE ANGLE QUOTATION MARK(左双角引号)”(LCTT 译注:Guillemet,是法语和一些欧洲语言中的引号,与中文的书名号不同),你可以输入 Shift+AltGr <<(你在敲助记符时不需要一直按着 Shift+AltGr)。如果你成功输入了这个符号,你自己应该也能猜到要怎么输入 “RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK(右双角引号)” 了。

来看看另一个例子,试试 Shift+AltGr --- 来生成一个 “EM DASH(长破折号)”(LCTT 译注:中文输入法的长破折号由两个 “EM DASH” 组成)。要做到这个,你需要按下主键盘上的的 连字符减号 键而非数字键盘上的那个。

值得注意的是 Compose 键在非 GUI 环境下也能工作。但是取决于你使用的是 X11 控制台还是只显示文字的控制台,它们所支持的组合按键顺序并不相同。

在控制台上,你可以通过命令 dumpkeys 来查看支持的组合按键列表(LCTT 译注:可能需要 root 权限):

dumpkeys --compose-only

在 GUI 下,组合键是在 Gtk/X11 层被实现的。想要知道 Gtk 所支持的助记符,可以查看页面:https://help.ubuntu.com/community/GtkComposeTable

我们可以避免对 Gtk 字符组合的依赖吗?

或许我是个纯粹主义者,但是我为 Gtk 这种对 Compose 键进行硬编码的方式感到悲哀。毕竟,不是所有 GUI 应用都会使用 Gtk 库。而且我如果想要添加我自己的助记符的话就只能重新编译 Gtk 了。

幸好在 X11 层也有对字符组合的支持。在以前则是通过令人尊敬的 X 输入法(XIM)

这个方法在比起基于 Gtk 的字符组合能够在更加底层的地方工作,同时具备优秀的灵活性并兼容很多 X11 应用。

比如说,假设我只是想要添加 --> 组合来输入字符 (U+2192,RIGHTWARDS ARROW(朝右箭头)),我只需要新建 ~/.XCompose 文件并写入以下代码:

cat > ~/.XCompose << EOT
# Load default compose table for the current local
include "%L"

# Custom definitions
<Multi_key> <minus> <minus> <greater> : U2192 # RIGHTWARDS ARROW
EOT

然后你就可以启动一个新的 X11 应用,强制函数库使用 XIM 作为输入法,并开始测试:

GTK_IM_MODULE="xim" QT_IM_MODULE="xim" xterm

新的组合排序应该可以在你刚启动的应用里被输入了。我鼓励你通过 man 5 compose 来进一步学习组合文件格式。

在你的 ~/.profile 中加入以下两行来将 XIM 设为你所有应用的默认输入法。这些改动会在下一次你登录电脑时生效:

export GTK_IM_MODULE="xim"
export QT_IM_MODULE="xim"

这挺酷的,不是吗?这样你就可以随意的加入你想要的组合排序。而且在默认的 XIM 设置中已经有几个有意思的组合了。试一下输入组合键 LLAP

但我不得不提到两个缺陷。XIM 已经比较老了,而且只适合我们这些不太需要多字节输入法的人。其次,当你用 XIM 作为输入法的时候,你就不能利用 Ctrl+Shift+u 加上代码点来输入 Unicode 字符了。什么?等一下?我还没聊过那个?让我们现在来聊一下吧:

如果我需要的字符没有对应的组合键排序该怎么办?

组合键是一个不错的工具,它可以用来输入一些键盘上没有的字符。但默认的组合集有限,而切换 XIM 并为一个你一生仅用一次的字符来定义一个新的组合排序十分麻烦。

但这能阻止你在同一段文字里混用日语、拉丁语,还有西里尔字符吗?显然不能,这多亏了 Unicode。比如说,名字 “あゆみ” 由三个字母组成:

我在上文提及了 Unicode 字符的正式名称,并遵循了全部用大写拼写的规范。在它们的名字后面,你可以找到它们的 Unicode 代码点,位于括号之间并写作 16 位的十六进制数字。这让你想到什么了吗?

不管怎样,一旦你知道了的一个字符的代码点,你就可以按照以下组合输入:

  • Ctrl+Shift+u,然后是 XXXX(你想要的字符的 十六进制 代码点)然后回车。

作为一种简写方式,如果你在输入代码点时不松开 Ctrl+Shift,你就不用敲回车。

不幸的是,这项功能的实现是在软件库层而非 X11 层,所以对其支持在不同应用间并不统一。以 LibreOffice 为例,你必须使用主键盘来输入代码点。而在基于 Gtk 的应用则接受来自数字键盘的输入。

最后,当我和我的 Debian 系统上的控制台打交道时,我发现了一个类似的功能,但它需要你按下 Alt+XXXXXXXXXX 是你想要的字符的 十进制 的代码点。我很好奇这究竟是 Debian 独有的功能,还是因为我使用的语言环境(Locale) 是 en_US.UTF-8。如果你对此有更多信息,我会很愿意在评论区读到它们的!

GUI控制台字符
Ctrl+Shift+u 3042 EnterAlt+12354
Ctrl+Shift+u 3086 EnterAlt+12422
Ctrl+Shift+u 307F EnterAlt+12415

死键

最后值得一提的是,想要不(必须)依赖 Compose 键来输入键组合还有一个更简单的方法。

你的键盘上的某些键是专门用来创造字符组合的。这些键叫做 死键 Dead Key 。这是因为当你按下它们一次,看起来什么都没有发生,但它们会悄悄地改变你下一次按键所产生的字符。这个行为的灵感来自于机械打字机:在使用机械打字机时,按下一个死键会印下一个字符,但不会移动字盘。于是下一次按键则会在同一个地方印下另一个字符。视觉效果就是两次按键的组合。

我们在法语里经常用到这个。举例来说,想要输入字母 ë 我必须按下死键 ¨ 然后再按下 e 键。同样地,西班牙人的键盘上有着死键 ~。而在北欧语系下的键盘布局,你可以找到 ° 键。我可以念很久这份清单。

hungary dead keys

显然,不是所有键盘都有所有死键。实际上,你的键盘上是找不到大部分死键的。比如说,我猜在你们当中只有小部分人——如果真的有的话——有死键 ¯ 来输入 Tōkyō 所需要的长音符号(“平变音符”)。

对于那些你键盘上没有的死键,你需要寻找别的解决方案。好消息是,我们已经用过那些技术了。但这一次我们要用它们来模拟死键,而非“普通”键。

那么,我们的第一个选择是利用 Compose - 来生成长音符号(你键盘上有的连字符减号)。按下时屏幕上什么都不会出现,但当你接着按下 o 键你就能看到 ō

Gtk 在组合模式下可以生成的一系列死键都能在 这里 找到。

另一个解决方法则是利用 Unicode 字符 “COMBINING MACRON(组合长音符号)”(U+0304),然后字母 o。我把细节都留给你。但如果你好奇的话,你会发现你打出的结果有着微妙的不同,你并没有真地打出 “LATIN SMALL LETTER O WITH MACRON(小写拉丁字母 O 带长音符号)”。我在上一句话的结尾用了大写拼写,这就是一个提示,引导你寻找通过 Unicode 组合字符按更少的键输入 ō 的方法……现在我将这些留给你的聪明才智去解决了。

轮到你来练习了!

所以,你都学会了吗?这些在你的电脑上工作吗?现在轮到你来尝试了:根据上面提出的线索,加上一点练习,现在你可以完成文章开头给出的挑战了。挑战一下吧,然后把成果复制到评论区作为你成功的证明。

赢了也没有奖励,或许来自同伴的惊叹能够满足你!


via: https://itsfoss.com/unicode-linux/

作者:Sylvain Leroux 选题:lkxed 译者:yzuowei 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

《英雄联盟》源代码被窃,勒索 1000 万美元

开发《英雄联盟》的拳头游戏被入侵,入侵者说,“我们已经获得了你的宝贵数据,包括珍贵的反作弊源代码和整个《英雄联盟》的游戏代码及其工具,以及你的用户模式反作弊器 Packman。……要求交换 10,000,000 美元。”并只给了 12 个小时的期限。入侵者警告称,他们只花费了几个小时的业余水平的入侵。拳头游戏承认了被入侵,但表示不会支付赎金,没有提供更多信息。

消息来源:VICE
老王点评:1000 万美元对日进斗金的《英雄联盟》倒是不贵,问题是,支付了赎金怕是也没用。

自由软件基金会收紧对许可证的审批

自由软件基金会(FSF)董事会通过了下个月实施的更新章程,旨在进一步保护左版许可。更新后的附则收紧了起草和发布新的/更新的许可证的审批程序:现在需要绝对多数(66%)的赞成票。此规定适用于所有 FSF 许可证,包括任何 GNU 版权许可证。

消息来源:自由软件基金会
老王点评:看起来 FSF 在治理方面进一步完善了。

Wine 8.0 发布,完成 PE 转换

作为年度稳定版本,Wine 8.0 纳入了过去一年中的所有变化。在此版本中,完成了将所有 Wine 模块转换为 PE 格式的工作。这对于复制保护、64 位主机上的 32 位应用支持、Windows 调试器、Arm 上的 x86 应用等工作非常重要。此外,在 Wine 8.0 中还有如下变化:打印处理器架构已经实现;继续进行 WoW64 的开发;控制器的热插拔支持得到了极大的改善等等。

消息来源:Wine HQ
老王点评:虽然有越来越多的原生 Linux 应用和游戏,现在 Wine 并不如早期那么重要,但是 Wine 依然是 Linux 的重要基石之一。

InfluxData 是一个开源的时间序列数据库平台。下面介绍了它是如何被用于边缘应用案例的。

收集到的随时间变化的数据称为时间序列数据。今天,它已经成为每个行业和生态系统的一部分。它是不断增长的物联网行业的一大组成部分,将成为人们日常生活的重要部分。但时间序列数据及其需求很难处理。这是因为没有专门为处理时间序列数据而构建的工具。在这篇文章中,我将详细介绍这些问题,以及过去 10 年来 InfluxData 如何解决这些问题。

InfluxData

InfluxData 是一个开源的时间序列数据库平台。你可能通过 InfluxDB 了解该公司,但你可能不知道它专门从事时间序列数据库开发。这很重要,因为在管理时间序列数据时,你要处理两个问题:存储生命周期和查询。

在存储生命周期中,开发人员通常首先收集和分析非常详细的数据。但开发人员希望存储较小的、降低采样率的数据集,以描述其趋势,而不占用太多的存储空间。

查询数据库时,你不希望基于 ID 查询数据,而是希望基于时间范围进行查询。使用时间序列数据最常见的一件事是在一段时间内对其进行汇总。在典型的关系型数据库中存储数据时,这种查询是很慢的,这种数据库使用行和列来描述不同数据点的关系。专门为处理时间序列数据而设计的数据库可以更快地处理这类查询。InfluxDB 有自己的内置查询语言:Flux,这是专门为查询时间序列数据集而构建的。

Telegraf 如何工作的图像

数据采集

数据采集和数据处理都有一些很棒的工具。InfluxData 有 12 个以上的客户端库,允许你使用自己选择的编程语言编写和查询数据。这是自定义用法的一个很好的工具。开源摄取代理 Telegraf 包括 300 多个输入和输出插件。如果你是一个开发者,你也可以贡献自己的插件。

InfluxDB 还可以接受上传小体积历史数据集的 CSV 文件,以及大数据集的批量导入。

import math
bicycles3 = from(bucket: "smartcity")
    |> range(start:2021-03-01T00:00:00z, stop: 2021-04-01T00:00:00z)
    |> filter(fn: (r) => r._measurement == "city_IoT")
    |> filter(fn: (r) => r._field == "counter")
    |> filter(fn: (r) => r.source == "bicycle")
    |> filter(fn: (r) => r.neighborhood_id == "3")
    |> aggregateWindow(every: 1h, fn: mean, createEmpty:false)
bicycles4 = from(bucket: "smartcity")
    |> range(start:2021-03-01T00:00:00z, stop: 2021-04-01T00:00:00z)
    |> filter(fn: (r) => r._measurement == "city_IoT")
    |> filter(fn: (r) => r._field == "counter")
    |> filter(fn: (r) => r.source == "bicycle")
    |> filter(fn: (r) => r.neighborhood_id == "4")
    |> aggregateWindow(every: 1h, fn: mean, createEmpty:false)join(tables: {neighborhood_3: bicycles3, neighborhood_4: bicycles4}, on ["_time"], method: "inner")
    |> keep(columns: ["_time", "_value_neighborhood_3","_value_neighborhood_4"])
    |> map(fn: (r) => ({
        r with
        difference_value : math.abs(x: (r._value_neighborhood_3 - r._value_neighborhood_4))
    }))

Flux

Flux 是我们的内部查询语言,从零开始建立,用于处理时间序列数据。它也是我们一些工具的基础动力,包括 任务 task 警报 alert 通知 notification 。要剖析上面的 Flux 查询,需要定义一些东西。首先,“ bucket ”就是我们所说的数据库。你可以配置存储桶,然后将数据流添加到其中。查询会调用 smartcity 存储桶,其范围为特定的一天(准确地说是 24 小时)。你可以从存储桶中获取所有数据,但大多数用户都包含一个数据范围。这是你能做的最基本的 Flux 查询。

接下来,我添加过滤器,将数据过滤到更精确、更易于管理的地方。例如,我过滤分配给 id 为 3 的社区中的自行车数量。从那里,我使用 aggregateWindow 获取每小时的平均值。这意味着我希望收到一个包含 24 列的表,每小时一列。我也对 id 为 4 的社区进行同样的查询。最后,我将这两张表相叠加,得出这两个社区自行车使用量的差异。

如果你想知道什么时候是交通高峰,这是不错的选择。显然,这只是 Flux 查询功能的一个小例子。但它提供了一个很好的例子,使用了 Flux 附带的一些工具。我还有很多的数据分析和统计功能。但对于这一点,我建议查看 Flux 文档。

import "influxdata/influxdb/tasks"
option task = {name: PB_downsample, every: 1h, offset: 10s}
from(bucket: "plantbuddy")
    |>range(start: tasks.lastSuccess(orTime: -task.every))
    |>filter(fn: (r) => r["_measurement"] == "sensor_data")
    |>aggregateWindow(every: 10m, fn:last, createEmpty:false)
    |>yield(name: "last")
    |>to(bucket: "downsampled")

任务

InfluxDB 任务 task 是一个定时 Flux 脚本,它接收输入数据流并以某种方式修改或分析它。然后,它将修改后的数据存储在新的存储桶中或执行其他操作。将较小的数据集存储到新的存储桶中,称为“ 降采样 downsampling ”,这是数据库的核心功能,也是时间序列数据生命周期的核心部分。

你可以在当前任务示例中看到,我已经对数据进行了降采样。我得到每 10 分钟增量的最后一个值,并将该值存储在降采样桶中。原始数据集在这 10 分钟内可能有数千个数据点,但现在降采样桶只有 60 个新值。需要注意的一点是,我还使用了范围内的 lastSuccess 函数。这会告诉 InfluxDB 从上次成功运行的时间开始运行此任务,以防它在过去 2 小时内失败,在这种情况下,它可以追溯 3 个小时内的最后一次成功运行。这对于内置错误处理非常有用。

检查和警报通知系统的图像

检查和警报

InfluxDB 包含一个 警报 Alert 检查 Check 通知 notification 系统。这个系统非常简单直白。首先进行检查,定期查看数据以查找你定义的异常。通常,这是用阈值定义的。例如,任何低于 32°F 的温度值都被指定为“WARN”值,高于 32°F 都被分配为“OK”值,低于 0°F 都被赋予“CRITICAL”值。从那开始,你的检查可以按你认为必要的频率运行。你的检查以及每个检查的当前状态都有历史记录。在不需要的时候,你不需要设置通知。你可以根据需要参考你的警报历史记录。

许多人选择设置通知。为此,你需要定义一个 通知端点 notification endpoint 。例如,聊天应用程序可以进行 HTTP 调用以接收通知。然后你定义何时接收通知,例如,你可以每小时运行一次检查。你可以每 24 小时运行一次通知。你可以让通知响应值更改,例如,“WARN”更改为“CRITICAL”,或者当值为“CRITICAL”时,无论如何都从“OK”更改为“WARN”。这是一个高度可定制的系统。从这个系统创建的 Flux 代码也可以编辑。

新 Edge 功能的图像

边缘

最后,我想把所有的核心功能放在一起,包括最近发布的一个非常特别的新功能。“Edge to cloud” 是一个非常强大的工具,允许你运行开源 InfluxDB,并在出现连接问题时在本地存储数据。连接修复后,它会将数据流传输到 InfluxData 云平台。

这对于边缘设备和重要数据非常重要,因为任何数据丢失都是有害的。你定义一个要复制到云的存储桶,然后该存储桶有一个磁盘支持的队列来本地存储数据。然后定义云存储桶应该复制到的内容。在连接到云端之前,数据都存储在本地。

InfluxDB 和物联网边缘

假设你有一个项目,你想使用连接到植物上的物联网传感器 监测家里植物的健康状况。该项目是使用你的笔记本电脑作为边缘设备设置的。当你的笔记本电脑合上或关闭时,它会在本地存储数据,然后在重新连接时将数据流传到我的云存储桶。

图片展示了 Plant buddy 的工作方式

需要注意的一点是,在将数据存储到复制桶之前,这会对本地设备上的数据进行降采样。你的植物传感器每秒提供一个数据点。但它将数据压缩为一分钟的平均数,因此存储的数据更少了。在云账户中,你可以添加一些警报和通知,让你知道植物的水分何时低于某个水平,需要浇水。也可以在网站上使用视觉效果来告诉用户植物的健康状况。

数据库是许多应用程序的主干。在像 InfluxDB 的时间序列数据库平台中使用带有时间戳的数据可以节省开发人员的时间,并使他们能够访问各种工具和服务。InfluxDB 的维护者喜欢看到人们在我们的开源社区中构建什么,所以请与我们联系,并与其他人共享你的项目和代码!


via: https://opensource.com/article/23/1/time-series-data-edge-open-source-tools

作者:Zoe Steinkamp 选题:lkxed 译者:ZhangZhanhaoxiang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这个简单的指南演示了如何在 Windows 上下载和安装 Python。

这篇文章是用最新的 Python 3.11 稳定版测试的。

在学习如何在 Windows 上安装 Python 之前,你可能想看看如何在 Linux 发行版(如 Ubuntu)上轻松安装 Python。如果你打算成为一名开发者,最好在 Linux 中尝试 Python。那么,你可能想看看 如何在 Windows 之外安装 Linux(如 Ubuntu)

Python 是一种流行的通用编程语言,在过去十年中成为开发者的选择。而且它的受欢迎程度与日俱增。它被广泛用于网络开发、复杂系统、数据科学、机器学习和所有科学领域。

你可能遇到的 Python 有两个版本。Python2 目前已经不支持了。而 Python3 系列是持续支持的版本。

检查 Python 是否已经安装

在 Windows 上安装它之前,你应该检查它是否已经安装。一般来说,它应该没有安装,不像在 Ubuntu (和其他 Linux 发行版)中,Python 是预先安装的。

从开始菜单中,打开“命令提示符”。

并输入以下内容:

python --version

如果 Python 是可用的,它将显示一个包含版本细节的信息。

下载并安装 Python

打开下面的 Python 官方下载页面。

下载 Python

如何找到要安装的 Python

在顶部,你应该看到当前的稳定版本。点击下载链接。如果你正在寻找任何特定的版本,在这个页面上向下滚动,在 “Python releases by version number:” 的标签下下载特定的版本。

下载后,进入下载文件夹,运行安装程序。

按照屏幕上的指示进行安装。

安装 Python 第 1 步

安装 Python 第 2 步

安装完成后,验证 Python 的版本。

验证 Python 版本

从开始菜单,打开“命令提示符”,运行以下命令。

python --version

Windows 上的 Python 版本

你应该看到你的系统当前安装的 Python 包的版本。另外,你也可以运行下面的程序来获得一个 Python 交互式 shell。

python

你可以用 CTRL+Z 和回车键退出这个交互界面。

检查 PATH 变量

你应该检查系统变量 PATH,看看 Python 的可执行位置是否存在。这应该是使用安装程序自动更新的。

从开始菜单中,搜索“ 系统变量 system variables ”并打开它。

打开环境变量设置

在“系统属性”对话框中,点击“ 高级 Advanced > 环境变量 Environment Variables ”。在用户变量部分,对照路径变量,检查 Python 的安装位置是否存在。请参考下面的图片作为指导。

如果你看到所有的路径都存在,你就可以运行你的 Python 项目了。

检查 Windows 中的 Python 环境 PATH 值

创建并运行你的第一个 Python 程序

一个额外的步骤,这里是你如何编码和运行你的第一个 Python 程序。你可以使用任意 推荐的 Python 编辑器 来编写你的程序。

下面是一个简单的程序,它在控制台中输出文本 debugpoint.com

# Sample Python program
print("debugpoint.com")

用任意名字保存文件。这里我把它保存为 hello.py,放在 E 盘。.py 是 Python 源码的扩展名。

要运行这个程序,请打开命令提示符,在 E 盘中执行以下内容。

python hello.py

输出:

在 Windows 中运行一个简单的 Python 程序

结束语

我希望这个简单的初学者指南能够帮助你在 Windows 中安装 Python,验证安装并运行你的第一个程序。

如果你遇到问题,请在下面的评论栏中告诉我。


via: https://www.debugpoint.com/install-python-windows/

作者:Arindam 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

JavaScript 比 Java 和 .NET 缺陷更少,修复更快

对数百万个商业应用程序的研究显示,近 75% 的应用程序存在安全缺陷,并随着时间的增长而变得不那么安全。其中,82.2% 的.NET 应用程序存在缺陷,而 Java 的缺陷为 77.7%,JavaScript的缺陷为 55.8%。只有 9.5% 的 JavaScript 应用程序存在较严重的安全漏洞,而 Java 和 .NET 的比例分别为 19.9% 和 21.9%。此外,JavaScript 缺陷的修复速度也更快,其一半的缺陷平均在 116天内修复,而 .NET 为 158 天,Java 为 243 天。

消息来源:Dev Class
老王点评:这个结果有点出乎意料,专门为企业应用而设计的 Java 和 .NET 反而不如 JavaScript。

微软通过补丁检查过期的 Office 套件

微软打算通过更新推送一个补丁,来了解知道在 Windows PC 上安装了多少个超出支持范围的 Office 应用副本。该补丁主要检查的是已经停止支持的 Office 2007 和 2010,也包括今年 4 月将停止支持的 Office 2013。微软称,“这个更新将默默地运行一次,不会在用户的设备上安装任何东西”。微软没有提到它打算如何处理从更新中收集的数据。

消息来源:The Register
老王点评:微软这手未免伸的有的过长了,难道支持过期的 Office 就不能用了么?

Linux 基金会发起新的“开放元宇宙基金会”

Linux 基金会称,开放元宇宙基金会(OMF)的使命是培养一个由开发者、工程师、学者和思想领袖组成的强大社区,希望联合各行业,“致力于开发开源软件和标准,以建立一个包容的、全球性的、供应商中立的、可扩展的元宇宙”。他们认为元宇宙“可以在数字空间创造新的就业机会和产业。它可以弥合物理世界和数字世界之间的差距,同时提供一个任何人都可以创造自己机会的奇妙世界。……所有这些的未来市场价值可能超过任何单一的媒体市场。”

消息来源:Linux 基金会
老王点评:我倒是觉得成立这个开放元宇宙基金会有的太早了。