2015-07-08 3 views
0

Я имею дело с данными датчиков. Иногда эти датчики имеют затемнения и перегорания, в результате я могу иметь следующий вид временных рядов в кадре, назовем его «myData»:Как фильтровать или отбрасывать значение на основе предыдущего с помощью Deedle в C#?

[7.438984; 0,000002; 7.512345; 0.000000; 7.634912; 0.005123; 7.845627 ...]

Потому что мне нужна только 3 DECIMALS точность, я округлил данные из кадра:

var myRoundedData = myData.ColumnApply((Series<DateTime, double> numbers) => numbers.Select(kvp => Math.Round(kvp.Value, 3))); 

я получаю столбцы из рамы и фильтруются Зеро «0.000»:

var myFilteredTimeSeries = from kvp in myTimeSeries where kvp.Value != 0.000 select kvp; 

Итак, моя временная серия частично фильтруется: [7.439; 7,512; 7,635; 0,006; 7.846 ...]

Однако значение «0,006» недействительно!

Как я мог реализовать изящный синтаксис фильтрации на основе предыдущего значения, что-то вроде «предел процента» в скорости изменения:

если (0,006/7,635) * 100 < 0,1 затем ---> drop/delete (0.006)

ответ

0

Один из ключей - сосредоточиться на методах, которые включают в себя значение и его «окрестности», точно так же, как @tomaspetricek указал (Спасибо!). Моя цель состояла в том, чтобы найти временную метку «свободные шумы» или ключи для создания рамки и выполнить операцию AddColumn, которая по своей природе является операцией JoinKind.Left.

Чтобы решить эту проблему, я использовал метод попарных(), чтобы сфокусироваться на «ITEM1» (текущее значение), и «ITEM2» (следующее значение) следующим образом:

double filterSensibility = 5.0 // % percentage 

var myBooleanFilteredTimeSeries = myTimeSeries.Pairwise().Select(kvp => (kvp.Value.Item2/kvp.Value.Item1) * 100 < filterSensibility); 

Здесь я мог бы написать отношения, которые я хотел! (см. вопрос) Затем на основе серии времени (пример), опубликованной до моего получения:

myBooleanFilteredTimeSeries = [FALSE; ЛОЖНЫЙ; FALSE TRUE; FALSE ...]

ИСТИНА означает, что это значение шумно!Таким образом, я получаю только FALSE булевы значения с:

var myDateKeysModel = from kvp in myBooleanFilteredTimeSeries where kvp.Value == false select kvp; 

Я создал кадр из этой последней серии Time:

myCleanDateTimeKeysFrame = Frame.FromRecords(myDateKeysModel); 

Наконец, я добавляю оригинал (шумные) временные ряды на ранее созданный кадр :

myCleanDateTimeKeysFrame.AddColumn("Column Title", myOrginalTimeSeries); 

... et voilà!

enter image description here

0

Если вы хотите посмотреть только на предыдущее/следующее значение, вы можете перенести серию на один и закрепить его оригиналом. Это даст вам ряд пара (значение вместе с предыдущей/следующей стоимостью):

var r = actual.ZipInner(actual.Shift(1)); 

Если вы хотите посмотреть на более элементах по всем указанной, то вам необходимо одну из функций оконных обеспечивается Deedle:

Простейший пример будет использовать WindowInto, чтобы получить значение вместе с 4-мя значениями перед ним:

var res = values.WindowInto(5, win => 
    // 'win' is a series with the values - do something clever here! 
); 

 Смежные вопросы

  • Нет связанных вопросов^_^