代码之家  ›  专栏  ›  技术社区  ›  OopsUser

计算数据帧中相同的连续值的百分比

  •  0
  • OopsUser  · 技术社区  · 7 年前

    动机

    我有一个数据帧,其中包含来自各种传感器的时间序列,这些传感器记录:温度、湿度、紫外线辐射等。

    有时传感器“卡住”,这意味着我一次又一次地得到相同的测量值。

    例如:

    temp    humidity
    36.4    20.2
    36.2    21.1
    37.1    22.0
    37.1    22.2
    37.1    22.1
    37.1    22.3
    37.1    22.2
    36.2    21.1
    36.3    21.1
    36.1    21.1
    36.4    21.1
    36.4    21.1
    36.2    21.1
    
    • 您可以看到,在第3行中,温度传感器卡在37.1上5行,湿度传感器卡在21.1上6行。
    • 让我们将“卡住”定义为值在x时间内重复的次数更多(在5-20之间,还不确定)。

    如何计算每行“卡住”数据的百分比?

    例如,上一个示例中的输出应为:

    temp = 5/13 * 100 = 38%
    humidity = 6/13 * 100 = 46%
    

    我可以用2个for循环来“手动”完成,我相信有更好的方法来使用pandas。

    谢谢

    3 回复  |  直到 7 年前
        1
  •  1
  •   jpp    7 年前

    可以使用 itertools.groupby 计算相同的连续项目数。然后按给定的最小计数过滤。

    这样做是因为 itertools.groupby网站 是一个o(n)解决方案,它将连续的项分组,而不是在最后形成整体的组。

    from itertools import groupby
    
    def get_stuck_count(x, n):
        lens = (len(list(j)) for _, j in groupby(x))
        return sum(i for i in lens if i >= n)
    
    df_len = len(df.index)
    temp_stuck_pct = get_stuck_count(df['temp'], 5) / df_len
    humidity_stuck_pct = get_stuck_count(df['humidity'], 5) / df_len
    
    print(temp_stuck_pct)      # 0.38461538461538464
    print(humidity_stuck_pct)  # 0.46153846153846156
    
        2
  •  1
  •   RomanPerekhrest    7 年前
    In [582]: def get_stuck_pct(df, col, r=range(5,20)):
         ...:     max_cnt = df.groupby((df[col] != df[col].shift()).cumsum()).size().max()
         ...:     if max_cnt in r:
         ...:         return '{}%'.format(int(max_cnt / df[col].size * 100))
         ...:     return '0%'
         ...: 
         ...: 
    
    In [583]: get_stuck_pct(df, 'temp')
    Out[583]: '38%'
    
    In [584]: get_stuck_pct(df, 'humidity')
    Out[584]: '46%'
    
        3
  •  0
  •   ajsp    7 年前

    在这里,您需要获取所有重复项,然后平均序列中最大出现次数的总和。

    dup  = df.temp.duplicated().astype(int) 
    lst  = dup.groupby(dup.eq(0).cumsum()).cumsum().tolist()
    
    print max(lst) / float(len(lst))
    >>>0.384615384615