使用pandas模拟事件系统

3
我希望模拟一个包含以下组成部分的系统:
  • 一个发射器,在 [0, 1000) 毫秒内随机产生 n 个事件
  • 一个消费者,以 f 毫秒间隔均匀采样事件流
  • 一个消费者,以 g 毫秒间隔均匀采样事件流
例如,当 f 以 5ms 采样,g 以 10ms 采样时,序列可能如下所示:
  • 0ms:f 采样,g 采样
  • 5ms:f 采样
  • 10ms:f 采样,g 采样
  • 12ms:事件到达
  • 13ms:事件到达
  • 15ms:f 采样
  • 20ms:f 采样,g 采样
  • 25ms:f 采样
  • 27ms:事件到达
  • 30ms:f 采样,g 采样
  • 35ms:f 采样
  • 37ms:事件到达
对于每个发射,最接近(但在之后)事件时间的消费者“获胜”。如果存在平局,则随机选择获胜者。例如,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)

这将产生一个类似于以下的DataFrame:

     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

有什么想法吗?


“样本时间与事件时间最接近的消费者‘获胜’”。我们是讨论价格正确规则还是最小化abs(event_time - consumer_time) - wflynny
抱歉,那句话表达不清楚。我的意思是:消费者样本发生时间最接近事件时间但在其之后的消费者。 - jdc
1个回答

2
使用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应随机选择。

比我想出来的 expanding_min/sort/groupby 等模糊方法要好得多。感谢您的帮助! - jdc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接