我想模拟一个系统,包括:

  • 一个发射器,它产生 n 个随机间隔在 [0, 1000) ms 内的事件
  • 一个消费者,它以 f ms 的间隔对事件流进行采样
  • 一个消费者,它以 g ms 的间隔对事件流进行采样

  • 例如,f 采样为 5ms,g 采样为 10ms,序列可能如下所示:
  • 0ms: f samples, g samples
  • 5ms: f samples
  • 10ms: f samples, g samples
  • 12ms: event arrives
  • 13ms: event arrives
  • 15ms: f samples
  • 20ms: f samples, g samples
  • 25ms f samples
  • 27ms: event arrives
  • 30ms f samples, g samples
  • 35ms f samples
  • 37ms: event arrives

  • 对于每次发射,最接近(但在事件时间之后)采样的消费者“获胜”。如果出现平局,则应随机选择获胜者。例如,f 的 15ms 样本赢得了 12ms 和 13ms 事件。

    我试图通过将时间线合并到一个索引来实现这一点:
    import numpy as np
    import pandas as pd
    
    f = np.arange(0, 40, 5)
    g = np.arange(0, 40, 10)
    events = [12, 13, 27, 37]
    
    df = pd.concat([pd.Series(f, f), pd.Series(g, g), pd.Series(events, events)], axis=1)
    

    这会产生一个像这样的数据帧:
         f   g  events
    0    0   0     NaN
    5    5 NaN     NaN
    10  10  10     NaN
    12 NaN NaN      12
    13 NaN NaN      13
    15  15 NaN     NaN
    20  20  20     NaN
    25  25 NaN     NaN
    27 NaN NaN      27
    30  30  30     NaN
    35  35 NaN     NaN
    37 NaN NaN      37
    

    我一直在四处寻找针对以下汇总的各种操作的获胜者:
    In [103]: pd.expanding_max(df)
         f   g  events
    0    0   0     NaN
    5    5   0     NaN
    10  10  10     NaN
    12  10  10      12
    13  10  10      13
    15  15  10      13
    20  20  20      13
    25  25  20      13
    27  25  20      27
    30  30  30      27
    35  35  30      27
    37  35  30      37
    

    ...但是一直很难找到一种 Pandas 式的方法来做到这一点。

    我觉得很接近以下几点:
    In [141]: x = pd.expanding_min(df.sort(ascending=False))
              gx = x.groupby('events')
              print gx.max()
    events
    12      15  20
    13      15  20
    27      30  30
    37      35  30
    

    有任何想法吗?

    最佳答案

    使用 bfill 在 "f"和 "g"列中向后填充 NaN:

    import numpy as np
    import pandas as pd
    
    f = np.arange(0, 40, 5)
    g = np.arange(0, 40, 10)
    events = [12, 13, 27, 37]
    
    df = pd.concat([pd.Series(f, f), pd.Series(g, g), pd.Series(events, events)], axis=1)
    df.columns = "f", "g", "event"
    df[["f", "g"]] = df[["f", "g"]].bfill()
    df2 = df.dropna()
    print df2
    

    这是输出:
         f   g  event
    12  15  20     12
    13  15  20     13
    27  30  30     27
    

    然后我们可以比较f&g:
    print np.sign(df2.f - df2.g).replace({-1:"f", 1:"g", 0:"fg"})
    

    输出是:
    12     f
    13     f
    27    fg
    dtype: object
    

    这意味着 12 和 13 处的事件由“f”选取,而 27 处的事件应随机选择。

    关于python - 使用 Pandas 模拟事件系统,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22210284/

    10-12 22:00