Flux Joins 与 Pandas Joins 的用户体验评估

导航到


InfluxData 最近发布了 Chronograf 和 InfluxDB 的最新版本。随着这些版本的发布,Flux 的技术预览也随之推出。Flux 是一种新的时序数据处理查询语言和引擎。Flux 的文档可以在这里找到。

一篇之前的博客文章中,我分享了如何使用 Flux Joins 在测量之间执行数学运算来计算换热器的效率。请阅读“InfluxDB:如何在测量之间执行连接和数学运算”,以了解我尝试复制的数据集和连接的上下文。该博客系列代码库可以在这里找到。

随着我对 Flux 的学习,我将其与我已熟悉的语言或库进行比较。我决定分享我的学习和使用 Flux 的经验,因为我惊讶地发现,我比 Pandas 更喜欢 Flux 用于时序数据。我之所以感到惊讶,是因为一开始我对 Flux 非常怀疑。例如,我不是特别喜欢  |> 管道符号。我几乎从不使用管道,而且我不确定是否需要学习新的操作符。现在,我发现它们大大提高了可读性。每个管道符号都会返回一个结果。阅读 Flux 查询就像阅读项目符号。

在我解释我的语言偏好为何改变之前,我想先分享我对 Pandas 在 Flux 之前的评价。

Flux 之前 Pandas Joins 的评价

“我爱 Pandas。DataFrame 真是太棒了。它太简单了。我无法想象会喜欢任何东西比 Pandas Joins 或 Merge 更多。它们的行为完全符合预期。”

现在,您已经知道我进入 Flux 之前对 Pandas 的感觉,让我们从查看之前博客中第一次连接的开始进行比较。

Flux 中的连接

Th1 = from(bucket: "sensors")
  |> range(start: dashboardTime)
  |> filter(fn: (r) => r._measurement == "Tc1")
  |> drop(columns:["_start", "_stop", "_measurement", "position", "_field"])

Tc2 = from(bucket: "sensors")
  |> range(start: dashboardTime)
  |> filter(fn: (r) => r._measurement == "Tc2")
  |> drop(columns:["_start", "_stop", "_measurement", "position", "_field"])

TC = join(tables: {Tc1: Tc1, Tc2: Tc2}, on: ["_time"]])

其中 Tc1 看起来像这样

其中 Tc2 看起来像这样

连接看起来像这样

Pandas 中的连接

我的数据集作为一个 DataFrame 看起来像这样。

为了复制连接,我将数据分离成 4 个不同的 DataFrame,以反映 InfluxDB 中的 4 个不同的测量。

现在,如果我想复制我之前做的 Flux 连接,我必须重置较小 DataFrame 的索引。这是因为 Pandas 中的连接是在索引上操作的。

现在我可以执行连接操作了。

如果我想清理我的 DataFrame,使其与我的 Flux 连接完全一致,我必须删除很多列(特别是, df.drop(["measurement_Tc1, "position_Tc1", "measurement_Tc2", "position_Tc2").

这就是 Pandas 连接的整体样子

Tc1 = df.loc[df['measurement']=='Tc1'
Tc2 = df.loc[df['measurement']=='Tc2'
Tc1 = Tc1.set_index("Timestamp")
Tc2 = Tc2.set_index("Timestamp")
df = Tc1.join(Tc2, how="left", lsuffix='_Tc1', rsuffix='_Tc2')
df.drop(["measurement_Tc1, "position_Tc1", "measurement_Tc2", "position_Tc2"

与Flux Join相比,这个连接在几个方面显得笨拙。首先,我必须重置索引。其次,我必须指定左右后缀。我喜欢Flux的方式,我可以直接将我的表存储在变量中,然后只需用冒号将表与我的选择后缀关联起来。 join(tables: {Th1: Th1, Th2: Th2}, on: ["_time", "_field"]) 简单明了。我无需跟踪左右两边。第三,如果我想删除列以使我的Pandas Join与Flux Join相同,我必须:a) 首先复制我的DataFrames,以免丢失数据或b) 在新DataFrame中存储连接并删除列。选项a)意味着需要编写更多的代码。选项b)效率较低。

Flux Join实际上与Pandas合并非常相似,所以让我们看看一个例子。

这很好,但Flux Join还有一些好处。同样,我更喜欢Flux的冒号语法,而不是像Pandas那样指定“left_index”和“right_index”。此外,我很喜欢Flux允许我在多个列上连接。不幸的是,我无法用Pandas做到这一点。当这些列的内容相同时,在多个列上连接非常有用。想象一下,只有一个值用于标签键“position”的位置=x。我的Pandas Join看起来与上面的相同,但“position_x”列和“position_y”列将是相同的。然而,在Flux中,我可以连接“time”和“position”。 我的结果表将只有一个位置列。通过Flux在多个列上连接,我可以轻松有效地消除重复或冗余的列。这个特性对于时间序列数据特别有用,因为在时间序列数据中,重复的标签值、时间戳或字段键是正常且频繁的。

我对Pandas有了新的印象。

Flux之后对Pandas Joins的回顾

“我仍然喜欢Pandas。然而,我开始理解为什么Flux是为时间序列数据专门设计的。将Pandas与Flux进行比较并不公平,因为Pandas并不是专门为时间序列数据编写的。”

当我继续比较和对比Flux与其他数据处理方式时,我总是回到同一个想法。时间序列数据具有独特的属性,时间序列数据探索体验需要针对这些属性进行专门定制。很明显,Flux正是考虑到这一点而编写的。