我做一些日志分析,每隔几分钟检查一次队列的长度。我知道文件何时进入“队列”(一个简单的文件系统目录)以及何时离开。这样,我就可以在给定的时间间隔内绘制出队列的长度。到目前为止还不错,尽管代码有点程序化:
ts = pd.date_range(start='2012-12-05 10:15:00', end='2012-12-05 15:45', freq='5t')
tmpdf = df.copy()
for d in ts:
tmpdf[d] = (tmpdf.date_in < d)&(tmpdf.date_out > d)
queue_length = tmpdf[list(ts)].apply(func=np.sum)
但是,我想将实际长度与给定消耗率下的长度(例如每秒1次,等等)进行比较。我不能只减去一个常数,因为队列不能超过零。在
我已经做过了,不过是程序化的。我尝试使用pandas窗口函数,但收效甚微,因为无法访问已经为前一个元素计算的结果。我做的第一件事是大错特错的:
^{pr2}$真正的代码是这样的,我认为它太冗长、太慢了:
imagenes_sec = 1.05
imagenes_min = imagenes_sec * 60 *5
imagenes_introducidas = df3.aet.resample(rule='5t',how='count')
imagenes_introducidas.head()
def accum_minus(serie, rate):
acc = 0
retval = np.zeros(len(serie))
for i,a in enumerate(serie.values):
acc = max(0, a + acc - rate)
retval[i] = acc
return Series(data=retval, index=serie.index)
est_1 = accum_minus(imagenes_introducidas, imagenes_min)
comparativa = DataFrame(data = { 'real': queue_length, 'est_1_sec': est_1 })
comparativa.plot()
这似乎是一项容易的任务,但我不知道如何正确地做。也许熊猫不是工具,而是一些小精灵或小精灵的魔法。在
更新:df3是这样的(一些列被省略):
aet date_out
date_in
2012-12-05 10:08:59.318600 Z2XG17 2012-12-05 10:09:37.172300
2012-12-05 10:08:59.451300 Z2XG17 2012-12-05 10:09:38.048800
2012-12-05 10:08:59.587400 Z2XG17 2012-12-05 10:09:39.044100
更新2:这似乎更快,仍然不是很优雅
imagenes_sec = 1.05
imagenes_min = imagenes_sec * 60 *5
imagenes_introducidas = df3.aet.resample(rule='5t',how='count')
def add_or_zero(x, y):
return max(0.0, x + y - imagenes_min)
v_add_or_zero = np.frompyfunc(add_or_zero, 2,1)
xx = v_add_or_zero.accumulate(imagenes_introducidas.values, dtype=np.object)
dd = DataFrame(data = {'est_1_sec' : xx, 'real': queue_length}, index=imagenes_introducidas.index)
dd.plot()
如何将入站和出站事件交叉放入单个帧中?在
在这种格式中(每增加一个减量),队列深度 可以使用cumsum()轻松计算。在
^{pr2}$要模拟不同的消耗率,请替换所有实际的出站时间戳 以固定的频率制造一系列出站时间戳。由于cumsum()函数在这种情况下不起作用,所以我创建了一个计数函数 这需要一个下限值。在
相关问题 更多 >
编程相关推荐