我想模拟一个系统,包括:
例如,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/