找到满足Deedle系列条件的第一个窗口

时间:2015-08-20 03:17:39

标签: c# time-series deedle

鉴于Deedle Series以时间作为行索引,我需要找到信号首次满足条件的时间(在这种情况下,50ms内保持在0.005以下)。

目前我采用50ms的移动窗口,从每个窗口的开始时间和最大值创建一个系列,然后得到第一个最大值为< 0.005。它工作得很好但效率很低。

D:\python2.7.9\lib\site-package\numpy\core\_methods.py:55:RuntimeWarning: Mean of empty slice. warnings.warn("Mean of empty slice" RuntimeWaening) D:\python2.7.9\lib\site-packages\numpy\core\_methods.py:67: RuntimeWarning: invalid value encountered in double_scalars ret = ret.dtype.type(ret / rcount) F:/testModel/keywordRetireve.py:47: RuntimeWarning: invalid value encountered in less similarity.sort(key=lambda x: x[1], reverse=True) Traceback (most recent call last):  File "F:/testModel/keywordRetireve.py", line 53, in <module> gettingSimi = getting_similarityS(restaurants)  File "F:/testModel/keywordRetireve.py", line 47, in getting_similarityS
similarity.sort(key=lambda x: x[1], reverse=True)  ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

问题在于,即使第一个窗口符合条件,它也会搜索整个系列(可能会变得非常大)。

有没有一种简单的方法可以做到这一点但是在找到第一个窗口时停止,而不是搜索整个系列?

1 个答案:

答案 0 :(得分:1)

好吧,我无法找到Deedly单行或任何方便的LINQ命令来执行此操作,因此我编写了以下扩展方法:

public static K FirstWindowWhere<K, V>(
    this Series<K, V> series,
    Func<V, bool> condition,
    int windowSize)
{
    int consecutiveTrues = 0;
    foreach (var datum in series.Observations)
    {
        if (condition(datum.Value))
        {
            consecutiveTrues++;
        }
        else
        {
            consecutiveTrues = 0;
        }

        if (consecutiveTrues == windowSize)
        {
            return datum.Key;
        }
    }
    return default(K);
}

以上述条件致电:

double zeroTime = mySeries.FirstWindowWhere(d => d <= 0.005, numSteps);

我尝试了一些不同的方法,包括使用Series.Between代替Series.GetObservations的漂亮优雅方法,但速度明显变慢。所以除非有人有更简单/更好的解决方案,否则这样做。