清理数据直到计数相等

问题描述

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

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

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

时间戳 客户 ID '已过'
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 中的数据。我在上表中强调了这一点。我们不能简单地检查最高客户端 CID,因为 CID 可能没有排序,即 CID:5 可能出现在 CID:1 之前。
  2. 如果不是查看完全相同的时间戳来检查第 1 步,而是需要设置像 (+/-)5 点这样的敏感度,该怎么办?

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

提前感谢您的帮助!

解决方法

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

import pandas as pd
df = pd.DataFrame.from_dict({"timestamp" : [1,1,2,3,4,4],"y"         : [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

结果打印:

所有客户在线的第一个时间戳是 4

这里:

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

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

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

现在开始实际拆分数据:

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

地点:

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