- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一些日志分析并每隔几分钟检查一次队列的长度。我知道文件何时进入“队列”(一个简单的文件系统目录)以及何时离开。这样,我可以绘制给定时间间隔的队列长度。到目前为止一切顺利,尽管代码有点程序化:
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 窗口函数但收效甚微,因为无法访问已为前一个元素计算的结果。这是我尝试的第一件事,但这是致命的错误:
imagenes_min = 60 * imagenes_sec
def roll(window_vals):
return max(0.0, window_vals[-1] + window_vals[-2] - imagenes_min)
pd.rolling_apply(arg=imagenes_introducidas, func=roll , window = 2, min_periods=2)
真正的代码是这样的,我认为它太冗长和缓慢:
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()
这似乎是一项简单的任务,但我不知道如何正确完成。也许 pandas 不是工具,而是一些 numpy 或 scipy 魔法。
更新: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()
最佳答案
将入站和出站事件交错到单个帧中怎么样?
In [15]: df
Out[15]:
date_in aet date_out
0 2012-12-05 10:08:59.318600 Z2XG17 2012-12-05 10:09:37.172300
1 2012-12-05 10:08:59.451300 Z2XG17 2012-12-05 10:09:38.048800
2 2012-12-05 10:08:59.587400 Z2XG17 2012-12-05 10:09:39.044100
In [16]: inbnd = pd.DataFrame({'event': 1}, index=df.date_in)
In [17]: outbnd = pd.DataFrame({'event': -1}, index=df.date_out)
In [18]: real_stream = pd.concat([inbnd, outbnd]).sort()
In [19]: real_stream
Out[19]:
event
date
2012-12-05 10:08:59.318600 1
2012-12-05 10:08:59.451300 1
2012-12-05 10:08:59.587400 1
2012-12-05 10:09:37.172300 -1
2012-12-05 10:09:38.048800 -1
2012-12-05 10:09:39.044100 -1
在此格式中(每次增量减一),队列深度可以使用 cumsum() 轻松计算。
In [20]: real_stream['depth'] = real_stream.event.cumsum()
In [21]: real_stream
Out[21]:
event depth
date
2012-12-05 10:08:59.318600 1 1
2012-12-05 10:08:59.451300 1 2
2012-12-05 10:08:59.587400 1 3
2012-12-05 10:09:37.172300 -1 2
2012-12-05 10:09:38.048800 -1 1
2012-12-05 10:09:39.044100 -1 0
要模拟不同的消费率,请替换所有真实的出站时间戳具有一系列以固定频率制造的出站时间戳。由于 cumsum() 函数在这种情况下不起作用,因此我创建了一个计数函数这需要一个下限值。
In [53]: outbnd_1s = pd.DataFrame({'event': -1},
....: index=real_stream.event.resample("S").index)
In [54]: fixed_stream = pd.concat([inbnd, outbnd_1s]).sort()
In [55]: def make_floor_counter(floor):
....: count = [0]
....: def process(n):
....: count[0] += n
....: if count[0] < floor
....: count[0] = floor
....: return count[0]
....: return process
....:
In [56]: fixed_stream['depth'] = fixed_stream.event.map(make_floor_counter(0))
In [57]: fixed_stream.head(8)
Out[57]:
event depth
2012-12-05 10:08:59 -1 0
2012-12-05 10:08:59.318600 1 1
2012-12-05 10:08:59.451300 1 2
2012-12-05 10:08:59.587400 1 3
2012-12-05 10:09:00 -1 2
2012-12-05 10:09:01 -1 1
2012-12-05 10:09:02 -1 0
2012-12-05 10:09:03 -1 0
关于python - pandas窗口函数: accessing to intermediate results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956564/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!