清理数据直到计数相等

Sanitize Data Up to the Point Where Counts are Equal

我们有给定列 ['Timestamp','CID','API Elapsed','E2E Elapsed','Size (Byte)','Rows'] 的性能指标数据。

我们正在尝试在 Jupyter Notebook 中转换这些数据,到目前为止,获得正态分布、直方图等都是微不足道的。但我们的场景中有一个问题;想法是将 200 个客户端连接到我们的服务,然后测量 API 和 E2E 延迟,但是从 1 到 200 个客户端,登录增加需要时间。因此,我们需要在连接200个客户端之前清理数据。

因为,到那时为止,登录仍在进行中,并且由于内部发布队列,经过的时间相当长。例如,考虑这个简化的 table 有 5 个客户端;

Timestamp CID 'Elapsed'
1622047594 1 50
1622047595 1 55
1622047595 2 72
1622047596 1 63
1622047596 1 40
1622047596 2 64
1622047596 3 99
1622047596 4 116
1622047597 1 50
1622047597 2 58
1622047597 2 50
1622047597 2 42
1622047597 3 62
1622047597 3 39
1622047597 4 57
1622047597 5 129
1622047598 ... ...
1622047598 ... ...

我们要实现的是:

  1. 我们想把数据分成两部分;其中分离点是所有客户端第一次出现在同一个 Timesamp 中的数据。我在上面的 table 中强调了这一点。我们不能简单地检查最高的客户端 CID,因为 CID 可能没有排序,即 CID:5 可能出现在 CID:1.
  2. 之前
  3. 如果不是查看完全相同的时间戳来检查第 1 步,而是我们需要设置像 (+/-)5 点这样的灵敏度怎么办?

目标是使用数据的第一部分了解登录延迟和登录过程对整体数据延迟的影响,以及使用数据的第二部分完成所有登录后的整体延迟。

提前感谢您的帮助!

作为一个很好的基本示例,假设您的数据按时间戳排序:

import pandas as pd
df = pd.DataFrame.from_dict({"timestamp" : [1, 1, 2, 3, 3, 4, 4, 4], 
                             "y"         : [0, 0, 0, 0, 0, 0, 0, 0]})

threshold = 3
last_timestamp = -1 # no timestamp in your actual data is ever -1
for stamp in df["timestamp"]:
    if stamp != last_timestamp:
        count = 0
        last_timestamp = stamp
    count += 1
    # count won't ever exceed threshold, but using >= just to show that we want > cases
    if count >= threshold:
        print(f"The first timestamp where all customers are online is {stamp}")
        result = stamp
        break

结果打印:

The first timestamp where all customers are online is 4

这里:

  • threshold 是您拥有的客户总数。这是您将停止迭代的地方,因为您已经看到所有客户都在线

在这种情况下,我们只是逐行浏览数据。我们计算时间戳相同的所有行,如果我们的计数达到阈值,我们就会中断。如果您想要 +/- 的 5 个客户,您只需将阈值降低 5,因为 + 案例由此阈值处理(如果您的在线人数超过阈值,它仍会将其报告为所有时间戳客户在线。

只有 1000 万行,这对于您的目的来说已经足够快了,在我的计算机上 运行 在 0.0005 秒内。

现在开始实际拆分数据:

df_less = df[df["timestamp"] < result]
df_geq = df[df["timestamp"] >= result]

其中:

  • df_less是在所有客户都在线之前
  • df_geq 在所有客户在线的初始时间戳之后