В моем наборе данных есть ежедневные временные ряды для разных компаний, и я работаю с PostgreSQL. Моя цель — исключить компании со слишком неполными временными рядами. Поэтому я хочу исключить все компании, у которых есть 3 или более последовательных пропущенных значения. Кроме того, я хочу исключить все компании, у которых более 50% пропущенных значений между их первой и последней датой в наборе данных.
Мы можем работать со следующими примерами данных:
date company value
2012-01-01 A 5
2012-01-01 B 2
2012-01-02 A NULL
2012-01-02 B 2
2012-01-02 C 4
2012-01-03 A NULL
2012-01-03 B NULL
2012-01-03 C NULL
2012-01-04 A NULL
2012-01-04 B NULL
2012-01-04 C NULL
2012-01-05 A 8
2012-01-05 B 9
2012-01-05 C 3
2012-01-06 A 8
2012-01-06 B 9
2012-01-06 C NULL
Таким образом, A должен быть исключен, потому что у него есть разрыв в три последовательных пропущенных значения, и C, потому что у него есть более 50% пропущенных значений между его первой и последней датой.
Объединив другие ответы на этом форуме, я составил следующий код:
Добавьте первичный ключ автоинкремента для идентификации каждой строки
CREATE TABLE test AS SELECT * FROM mytable ORDER BY company, date; CREATE SEQUENCE id_seq; ALTER TABLE test ADD id INT UNIQUE; ALTER TABLE test ALTER COLUMN id SET DEFAULT NEXTVAL('id_seq'); UPDATE test SET id = NEXTVAL('id_seq'); ALTER TABLE test ADD PRIMARY KEY (id);
Обнаружение пробелов во временном ряду
CREATE TABLE to_del AS WITH count3 AS ( SELECT *, COUNT(CASE WHEN value IS NULL THEN 1 END) OVER (PARTITION BY company ORDER BY id ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS cnt FROM test) SELECT company, id FROM count3 WHERE cnt >= 3;
Удалить пробелы из mytable
DELETE FROM mytable WHERE company in (SELECT DISTINCT company FROM to_del);
Кажется, удалось обнаружить и удалить пробелы из 3 или более последовательных пропущенных значений из временного ряда. Но такой подход очень громоздкий. И я не могу понять, как дополнительно исключить все компании с более чем 50% пропущенных значений.
Можете ли вы придумать более эффективное решение, чем мое (я только учусь работать с PostgreSQL), которое также позволяет исключить компании с более чем 50% пропущенных значений?