python - 实时统计分析

标签 python numpy

我需要进行一些实时数据分析以监控操作错误。更具体地说,我正在控制浮标上的绞车,该浮标正在将仪器包降低到水中。我需要检测它是否触底,如果触底则停止。我有以下数据:传感器的深度,绞车脱线的速度。我以 1Hz 的频率获得更新,整个过程持续大约 5 分钟。如果传感器触及底部,深度值通常会急剧减慢并最终停止 可以假设在理想情况下下降率是线性的,但由于波浪,可能会有相当多的噪音。

我想到了这个方法:

'''
The variables sensor_depth, winch_velocity and sample_time are assumed to be updated in the background
by another thread.
'''
import numpy as np
from time import sleep
x_data = []
y_data = []
running_size = 10
while winch_is_running():
    if new_sample():
        x_data.append(sample_time)
        y_data.append(sensor_depth)
        # Get the slope for the entire procedure
        A = np.vstack([x_data,np.ones(len(x_data))])
        overall_slope,offset = np.linalg.lstsq(A,y_data)[0]
        # Get the slope for a recent set of samples
        A = np.vstack([x_data[-1*running_size],np.ones(running_size)])
        recent_slope,offset = np.linalg.lstsq(A,y_data[-1*running_size])[0]
        if overall_slope - recent_slope > allowed_slope_error:
            stop_winch()
    else: time.sleep(.2)

这是否有意义,或者是否有更好的方法?

这是当前系统的一些示例数据。这不是特别艰难的一天,也没有底部罢工。当前系统使用基于摩托罗拉 68k 的 TattleTale Controller 运行他们的基本版本。触底算法只是比较每 x 个样本,如果差异不够大,它就会停止。虽然这很有效,但在粗糙的情况下容易出现误报,并且在平静的情况下 react 不佳:

                      Temp   Cond   Sal     DO     DEPTH    Turb Chlor 
    11/11/10 15:00:19 14.24  18.44  10.97   2.53   0.092     0.5  13.5
    11/11/10 15:00:20 14.24  18.44  10.97   2.53   0.126     0.7   9.5
    11/11/10 15:00:21 14.24  18.45  10.97   2.53   0.132     0.6  13.0
    11/11/10 15:00:22 14.24  18.44  10.96   2.53   0.152     0.6   8.6
    11/11/10 15:00:23 14.24  18.44  10.96   2.53   0.139     0.7  13.6
    11/11/10 15:00:24 14.24  18.44  10.97   2.52   0.120     0.7  13.5
    11/11/10 15:00:25 14.24  18.44  10.97   2.52   0.128     1.4   7.1
    11/11/10 15:00:26 14.24  18.44  10.96   2.52   0.128     0.6   7.9
    11/11/10 15:00:27 14.24  18.44  10.97   2.52   0.141     0.9  12.4
    11/11/10 15:00:28 14.24  18.44  10.97   2.51   0.135     1.3  12.7
    11/11/10 15:00:29 14.24  18.44  10.96   2.51   0.145     1.3  12.8
    11/11/10 15:00:30 14.24  18.44  10.96   2.51   0.163     0.6   4.8
    11/11/10 15:00:31 14.24  18.44  10.96   2.51   0.213     0.9   3.9
    11/11/10 15:00:32 14.24  18.44  10.97   2.51   0.211     0.6   7.1
    11/11/10 15:00:33 14.24  18.44  10.96   2.51   0.241     0.7   6.9
    11/11/10 15:00:34 14.24  18.44  10.96   2.51   0.286     0.5   9.8
    11/11/10 15:00:35 14.24  18.44  10.96   2.51   0.326     0.6   9.0
    11/11/10 15:00:36 14.24  18.44  10.96   2.51   0.358     0.7   3.3
    11/11/10 15:00:37 14.24  18.44  10.96   2.51   0.425     0.7  13.1
    11/11/10 15:00:38 14.24  18.43  10.96   2.51   0.419     0.8   5.3
    11/11/10 15:00:39 14.24  18.44  10.96   2.51   0.495     1.2   7.4
    11/11/10 15:00:40 14.24  18.44  10.96   2.50   0.504     0.7  16.1
    11/11/10 15:00:41 14.24  18.44  10.96   2.50   0.558     0.5  11.9
    11/11/10 15:00:42 14.24  18.44  10.96   2.50   0.585     0.8   8.8
    11/11/10 15:00:43 14.24  18.44  10.96   2.50   0.645     0.8   9.7
    11/11/10 15:00:44 14.24  18.44  10.96   2.50   0.654     0.6   5.2
    11/11/10 15:00:45 14.24  18.44  10.96   2.50   0.694     0.5   9.5
    11/11/10 15:00:46 14.24  18.44  10.96   2.50   0.719     0.7   5.9
    11/11/10 15:00:47 14.24  18.44  10.96   2.50   0.762     0.9   7.2
    11/11/10 15:00:48 14.24  18.44  10.96   2.50   0.815     1.0  11.1
    11/11/10 15:00:49 14.24  18.44  10.96   2.50   0.807     0.6   8.7
    11/11/10 15:00:50 14.24  18.44  10.96   2.50   0.884     0.4   0.4
    11/11/10 15:00:51 14.24  18.44  10.96   2.50   0.865     0.7  13.3
    11/11/10 15:00:52 14.25  18.45  10.97   2.49   0.917     1.2   7.3
    11/11/10 15:00:53 14.24  18.45  10.97   2.49   0.964     0.5   4.8
    11/11/10 15:00:54 14.25  18.44  10.97   2.49   0.967     0.6   9.7
    11/11/10 15:00:55 14.25  18.44  10.97   2.49   1.024     0.5   8.1
    11/11/10 15:00:56 14.25  18.45  10.97   2.49   1.042     1.0  14.3
    11/11/10 15:00:57 14.25  18.45  10.97   2.49   1.074     0.7   6.0
    11/11/10 15:00:58 14.26  18.46  10.97   2.49   1.093     0.9   9.0
    11/11/10 15:00:59 14.26  18.46  10.98   2.49   1.145     0.7   9.1
    11/11/10 15:01:00 14.26  18.46  10.98   2.49   1.155     1.7   8.6
    11/11/10 15:01:01 14.25  18.47  10.98   2.49   1.205     0.7   8.8
    11/11/10 15:01:02 14.25  18.48  10.99   2.49   1.237     0.8  12.9
    11/11/10 15:01:03 14.26  18.48  10.99   2.49   1.248     0.7   7.2
    11/11/10 15:01:04 14.27  18.50  11.00   2.48   1.305     1.2   9.8
    11/11/10 15:01:05 14.28  18.50  11.00   2.48   1.328     0.7  10.6
    11/11/10 15:01:06 14.29  18.49  11.00   2.48   1.367     0.6   5.4
    11/11/10 15:01:07 14.29  18.51  11.01   2.48   1.387     0.8   9.2
    11/11/10 15:01:08 14.30  18.51  11.01   2.48   1.425     0.6  14.1
    11/11/10 15:01:09 14.31  18.52  11.01   2.48   1.456     4.0  11.3
    11/11/10 15:01:10 14.31  18.52  11.01   2.47   1.485     2.5   5.3
    11/11/10 15:01:11 14.31  18.51  11.01   2.47   1.490     0.7   5.2
    11/11/10 15:01:12 14.32  18.52  11.01   2.47   1.576     0.6   6.6
    11/11/10 15:01:13 14.32  18.51  11.01   2.47   1.551     0.7   7.7
    11/11/10 15:01:14 14.31  18.49  10.99   2.47   1.627     0.6   7.3
    11/11/10 15:01:15 14.29  18.47  10.98   2.47   1.620     0.7  11.5
    11/11/10 15:01:16 14.28  18.48  10.99   2.48   1.659     0.8   7.0
    11/11/10 15:01:17 14.27  18.49  10.99   2.48   1.682     1.4  14.4
    11/11/10 15:01:18 14.26  18.49  11.00   2.48   1.724     1.0   2.9
    11/11/10 15:01:19 14.27  18.52  11.01   2.48   1.756     0.8  13.5
    11/11/10 15:01:20 14.28  18.52  11.01   2.47   1.752     5.3  11.7
    11/11/10 15:01:21 14.29  18.52  11.02   2.47   1.841     0.8   5.8
    11/11/10 15:01:22 14.30  18.52  11.01   2.47   1.789     1.0   5.5
    11/11/10 15:01:23 14.31  18.52  11.01   2.47   1.868     0.7   6.8
    11/11/10 15:01:24 14.31  18.52  11.02   2.47   1.848     0.8   7.8
    11/11/10 15:01:25 14.32  18.52  11.01   2.47   1.896     0.3   8.3
    11/11/10 15:01:26 14.32  18.52  11.01   2.47   1.923     0.9   4.8
    11/11/10 15:01:27 14.32  18.51  11.01   2.47   1.936     0.5   6.4
    11/11/10 15:01:28 14.32  18.52  11.01   2.46   1.960     0.9  10.0
    11/11/10 15:01:29 14.31  18.52  11.01   2.46   1.996     0.6  10.7
    11/11/10 15:01:30 14.31  18.52  11.01   2.47   2.024     1.7  11.8
    11/11/10 15:01:31 14.31  18.52  11.01   2.47   2.031     1.0  11.7
    11/11/10 15:01:32 14.31  18.53  11.02   2.46   2.110     1.3   5.4
    11/11/10 15:01:33 14.32  18.52  11.01   2.46   2.067     0.6  12.2
    11/11/10 15:01:34 14.32  18.52  11.01   2.46   2.144     0.4   6.4
    11/11/10 15:01:35 14.32  18.51  11.01   2.46   2.148     1.0   4.6
    11/11/10 15:01:36 14.33  18.51  11.01   2.46   2.172     0.9   9.6
    11/11/10 15:01:37 14.33  18.52  11.01   2.46   2.221     1.0   6.5
    11/11/10 15:01:38 14.33  18.51  11.01   2.46   2.219     0.3   7.6
    11/11/10 15:01:39 14.33  18.51  11.01   2.46   2.278     1.2   8.1
    11/11/10 15:01:40 14.32  18.51  11.01   2.46   2.258     0.5   0.6
    11/11/10 15:01:41 14.32  18.52  11.01   2.46   2.329     1.2   8.2
    11/11/10 15:01:42 14.31  18.51  11.01   2.46   2.321     1.1   9.6
    11/11/10 15:01:43 14.31  18.51  11.01   2.46   2.382     1.0   5.3
    11/11/10 15:01:44 14.31  18.51  11.01   2.46   2.357     0.7   8.5
    11/11/10 15:01:45 14.31  18.52  11.01   2.46   2.449     0.4  10.3
    11/11/10 15:01:46 14.31  18.52  11.01   2.46   2.430     0.6  10.0
    11/11/10 15:01:47 14.31  18.52  11.01   2.46   2.472     0.6  11.3
    11/11/10 15:01:48 14.31  18.52  11.01   2.45   2.510     1.2   8.5
    11/11/10 15:01:49 14.31  18.51  11.01   2.45   2.516     0.7   9.5
    11/11/10 15:01:50 14.31  18.52  11.01   2.45   2.529     0.5   9.6
    11/11/10 15:01:51 14.31  18.52  11.01   2.45   2.575     0.7   8.2
    11/11/10 15:01:52 14.31  18.51  11.01   2.46   2.578     0.5   9.4
    11/11/10 15:01:53 14.31  18.51  11.01   2.46   2.592     0.8   5.5
    11/11/10 15:01:54 14.30  18.51  11.01   2.46   2.666     0.6   7.1
    11/11/10 15:01:55 14.30  18.51  11.01   2.46   2.603     0.7  11.5
    11/11/10 15:01:56 14.29  18.52  11.01   2.45   2.707     0.9   7.2
    11/11/10 15:01:57 14.29  18.52  11.01   2.45   2.673     0.7   9.2
    11/11/10 15:01:58 14.28  18.52  11.01   2.45   2.705     0.7   6.4
    11/11/10 15:01:59 14.28  18.52  11.01   2.45   2.720     1.3   6.8
    11/11/10 15:02:00 14.28  18.52  11.02   2.45   2.778     0.7   7.5
    11/11/10 15:02:01 14.27  18.52  11.02   2.45   2.724     0.5   8.0
    11/11/10 15:02:02 14.27  18.51  11.01   2.45   2.840     0.9  10.0
    11/11/10 15:02:03 14.26  18.52  11.02   2.45   2.758     0.8   6.4
    11/11/10 15:02:04 14.26  18.52  11.01   2.46   2.874     0.4   9.7
    11/11/10 15:02:05 14.24  18.53  11.02   2.46   2.824     1.1  10.8
    11/11/10 15:02:06 14.24  18.53  11.02   2.46   2.896     1.0   8.8
    11/11/10 15:02:07 14.22  18.53  11.02   2.47   2.903     0.6  16.3
    11/11/10 15:02:08 14.22  18.54  11.03   2.45   2.912     0.9   9.6
    11/11/10 15:02:09 14.21  18.54  11.02   2.45   2.949     0.8   6.6
    11/11/10 15:02:10 14.20  18.54  11.03   2.45   2.964     1.4   8.4
    11/11/10 15:02:11 14.19  18.55  11.03   2.46   2.966     3.0  12.9
    11/11/10 15:02:12 14.17  18.55  11.03   2.45   3.020     1.0   7.5
    11/11/10 15:02:13 14.15  18.56  11.04   2.45   3.000     1.1   9.5
    11/11/10 15:02:14 14.14  18.56  11.04   2.45   3.064     0.9   6.5
    11/11/10 15:02:15 14.13  18.56  11.04   2.45   3.037     1.3   8.2
    11/11/10 15:02:16 14.13  18.57  11.04   2.45   3.097     1.3   7.7
    11/11/10 15:02:17 14.12  18.57  11.05   2.45   3.128     1.5   8.4
    11/11/10 15:02:18 14.11  18.58  11.05   2.45   3.104     1.7   7.0
    11/11/10 15:02:19 14.10  18.58  11.05   2.45   3.190     1.2  10.2
    11/11/10 15:02:20 14.10  18.58  11.05   2.44   3.141     5.8   9.9
    11/11/10 15:02:21 14.09  18.60  11.06   2.44   3.199     1.4   4.7
    11/11/10 15:02:22 14.07  18.60  11.07   2.44   3.208     1.6   9.4
    11/11/10 15:02:23 14.06  18.60  11.07   2.44   3.199     2.1   6.2
    11/11/10 15:02:24 14.06  18.62  11.08   2.43   3.259     3.0   9.3
    11/11/10 15:02:25 14.05  18.63  11.08   2.43   3.228     1.6   8.9
    11/11/10 15:02:26 14.06  18.63  11.08   2.43   3.289     1.6   3.5
    11/11/10 15:02:27 14.05  18.64  11.09   2.43   3.278     1.8   2.2
    11/11/10 15:02:28 14.05  18.64  11.09   2.43   3.307     2.2   9.7
    11/11/10 15:02:29 14.04  18.64  11.09   2.43   3.315     2.3   5.5
    11/11/10 15:02:30 14.04  18.65  11.10   2.43   3.367     2.1   5.1
    11/11/10 15:02:31 14.03  18.65  11.10   2.43   3.297     2.5   8.5
    11/11/10 15:02:32 14.03  18.65  11.10   2.41   3.419     1.9   6.8
    11/11/10 15:02:33 14.03  18.65  11.10   2.41   3.347     2.1   4.0
    11/11/10 15:02:34 14.03  18.66  11.10   2.41   3.405     2.0  11.8
    11/11/10 15:02:35 14.03  18.67  11.11   2.41   3.420     2.4  10.6
    11/11/10 15:02:36 14.03  18.67  11.11   2.39   3.369     2.7  10.5
    11/11/10 15:02:37 14.02  18.67  11.11   2.39   3.402     1.6   9.1
    11/11/10 15:02:38 14.02  18.66  11.11   2.39   3.408     1.9   8.5
    11/11/10 15:02:39 14.02  18.67  11.11   2.39   3.362     4.2   7.0
    11/11/10 15:02:40 14.02  18.67  11.11   2.38   3.421     2.3  12.1
    11/11/10 15:02:41 14.02  18.67  11.11   2.38   3.371     2.6  14.7
    11/11/10 15:02:42 14.02  18.67  11.11   2.38   3.409     3.0   6.5
    11/11/10 15:02:43 14.02  18.67  11.11   2.38   3.368     2.3   2.5
    11/11/10 15:02:44 14.02  18.67  11.11   2.37   3.434     2.5  10.2
    11/11/10 15:02:45 14.02  18.67  11.11   2.37   3.346     1.6   4.5

从数据的角度来看,这也不是一个非常有趣的一天。

最佳答案

您的方法(将当前导数与平均导数进行比较)很好,但可以改进。最重要的是,在决定如何分析数据之前,您确实需要查看数据:

plot of data, derivatives, and power spectra

这些图显示: A) 您的原始数据。注意:由于阀芯直径变化,下降率不是恒定的,因此线性回归可能不是最优的。此外,在阀芯停止时开始时还有额外数据,这可能会影响您的斜率测量。 B) 您的数据的衍生品。这是您用来进行检测的数据。告诉我:你能轻易地看出平均斜率变为零的区域吗? C) 数据的 FFT,在频率范围的上半部分显示出很大的功率——这就是噪声所在的位置。由于噪声仅占据频率范围的上半部分,因此应该很容易滤除。 D) 通过 sigma=1.0 的高斯低通滤波器后的数据 (scipy.ndimage.gaussian_filter(data, 1.0)) E) D 的导数(更容易看到这个数据的底部) F) E 的功率谱,显示噪声大部分被去除。

因此,通过稍微过滤一下,可以很容易地通过视觉检测底部。那么,问题是 1) 如何将“视觉检测”转化为可靠的算法,以及 2) 如何确定 sigma 的最佳值。如果它太小,那么噪音就会妨碍你。如果太大,则阀芯可能运行时间过长。回答这两个问题的唯一方法是凭经验——尽可能多地提取这些数据集并尝试新的想法,直到你得到一个适用于大多数(如果不是所有)数据集的想法。

我的第一个方法是这样的: - 低通数据到达时,使用根据经验预先确定的参数。如果这个参数选择正确,应该只需要考虑到达的最后一个数据点。 - 当您在某个(根据经验确定的)阈值内找到接近于零的点时触发。

您可以做很多事情来使它更“聪明”,例如根据先前的噪音自动选择阈值。然而,这些技巧可能很难正确实现,因为它们可能会被意想不到的输入所愚弄。应用您对数据已知的知识几乎总是比让计算机为您猜测更好。

关于python - 实时统计分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362335/

相关文章:

python - "R6034 An application has made an attempt to load the C runtime library incorrectly"安装pygtk后

python - 打印 NumPy 数组时的轴顺序

python - 加载以前保存的没有自定义层的模型时缺少 get_config

python - 对按多列分组的数据框中的值进行排序

python - 如何将模块导入到scrapy蜘蛛中一次?

python - 神经网络实现中的溢出错误

python - 使用 list append 和 For 循环时,是否应该在 python 中事先声明变量?

python - python scipy 中样条线与平面的相交

python - 用Python计算自相关函数

python - 如何访问 N*M*M numpy 数组的下三角