Удаление шума (скачков и падений) из данных датчиков расхода топливаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Удаление шума (скачков и падений) из данных датчиков расхода топлива

Сообщение Anonymous »

Я работаю с данными о расходе топлива, полученными от датчика, но иногда данные содержат шум (резкие скачки или падения), что делает их несогласованными. Моя цель — выявить и удалить эти выбросы, чтобы обеспечить точность и надежность данных для дальнейшего анализа.
Вот ключевые детали:
  • Данные датчиков содержат записи с отметкой времени в формате unix, значением расхода топлива, скоростью и другими данными.
  • Объем данных варьируется от 40 до 80 записей каждые 10 минут.< /li>
    Мне нужен последовательный и надежный метод фильтрации убрать шум и сгладить данные.
Ниже приведен код, который я реализовал на данный момент:

Код: Выделить всё

// value == Fuel Consumption
var data = FileReader.ReadCsv(path).Where(d => d.Value > 0).ToList();

var cleanedData = RemoveOutliers(data.Select(d => new DataPoint(d.Timestamp, d.Value, d.Speed)).ToList(), 1.5);
cleanedData = ApplyMovingAverage(cleanedData, 8);

List anomalyDetectionResults = [];
foreach (var dataPoint in cleanedData)
{
// todo
}

static List RemoveOutliers(List data, double iqrFactor)
{
var values = data.Select(d => d.Value).ToList();
values.Sort();

double q1 = GetPercentile(values, 25);
double q3 = GetPercentile(values, 75);
double iqr = q3 - q1;
double lowerBound = q1 - iqrFactor * iqr;
double upperBound = q3 + iqrFactor * iqr;

return data.Where(d => d.Value >= lowerBound && d.Value  d.Value);
smoothedData.Add(new DataPoint(data[i].Timestamp, avg, data[i].Speed));
}
return smoothedData;
}

static double GetPercentile(List sortedValues, double percentile)
{
if (!sortedValues.Any()) return 0;

double rank = percentile / 100.0 * (sortedValues.Count - 1);
int lowerIndex = (int)Math.Floor(rank);
int upperIndex = (int)Math.Ceiling(rank);

if (lowerIndex == upperIndex) return sortedValues[lowerIndex];

return sortedValues[lowerIndex] + (rank - lowerIndex) * (sortedValues[upperIndex] - sortedValues[lowerIndex]);
}

public class DataPoint(DateTime timestamp, double value, int speed)
{
public DateTime Timestamp { get; set; } = timestamp;
public double Value { get; set; } = value;
public int Speed { get; set; } = speed;
}
Изображение
< img alt="Расход топлива" src="https://i.sstatic.net/YFvKEqgx.png" />
Буду признателен за любые рекомендации, предложения или альтернативы подходы к решению этой проблемы проблема.

Подробнее здесь: https://stackoverflow.com/questions/793 ... onsumption
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»