[英]Address and smoothen noise in sensor data
我有如下傳感器數據,其中在數據列下,在包含值 50 的前后行之間有 6 行包含值 45。要求是清理此數據並在 new_data 列中使用 50(上一個值)進行估算。 此外,噪聲記錄的數量(在表中顯示為 45)可能在數量或行級別上有所不同。
案例1(樣本數據):-
編號 | 時間戳 | 數據 | 新數據 |
---|---|---|---|
1 | 2021 年 1 月 1 日 0:00:00 | 50 | 50 |
2 | 2021 年 1 月 1 日 0:15:00 | 50 | 50 |
3 | 2021 年 1 月 1 日 0:30:00 | 50 | 50 |
4 | 2021 年 1 月 1 日 0:45:00 | 50 | 50 |
5 | 2021 年 1 月 1 日 1:00:00 | 50 | 50 |
6 | 2021 年 1 月 1 日 1:15:00 | 50 | 50 |
7 | 2021 年 1 月 1 日 1:30:00 | 50 | 50 |
8 | 2021 年 1 月 1 日 1:45:00 | 50 | 50 |
9 | 2021 年 1 月 1 日 2:00:00 | 50 | 50 |
10 | 2021 年 1 月 1 日 2:15:00 | 50 | 50 |
11 | 2021 年 1 月 1 日 2:30:00 | 45 | 50 |
12 | 2021 年 1 月 1 日 2:45:00 | 45 | 50 |
13 | 2021 年 1 月 1 日 3:00:00 | 45 | 50 |
14 | 2021 年 1 月 1 日 3:15:00 | 45 | 50 |
15 | 2021 年 1 月 1 日 3:30:00 | 45 | 50 |
16 | 2021 年 1 月 1 日 3:45:00 | 45 | 50 |
17 | 2021 年 1 月 1 日 4:00:00 | 50 | 50 |
18 | 2021 年 1 月 1 日 4:15:00 | 50 | 50 |
19 | 2021 年 1 月 1 日 4:30:00 | 50 | 50 |
20 | 2021 年 1 月 1 日 4:45:00 | 50 | 50 |
21 | 2021 年 1 月 1 日 5:00:00 | 50 | 50 |
22 | 2021 年 1 月 1 日 5:15:00 | 50 | 50 |
23 | 2021 年 1 月 1 日 5:30:00 | 50 | 50 |
我正在考慮需要對這些按時間戳 asc 排序的數據進行分組(如下所示),然后可能有一個條件,它必須在大樣本數據中逐組檢查,如果第 1 組與第 3 組相同,請替換具有組 1 值的組 2。
編號 | 時間戳 | 數據 | 新數據 | 團體 |
---|---|---|---|---|
1 | 2021 年 1 月 1 日 0:00:00 | 50 | 50 | 1 |
2 | 2021 年 1 月 1 日 0:15:00 | 50 | 50 | 1 |
3 | 2021 年 1 月 1 日 0:30:00 | 50 | 50 | 1 |
4 | 2021 年 1 月 1 日 0:45:00 | 50 | 50 | 1 |
5 | 2021 年 1 月 1 日 1:00:00 | 50 | 50 | 1 |
6 | 2021 年 1 月 1 日 1:15:00 | 50 | 50 | 1 |
7 | 2021 年 1 月 1 日 1:30:00 | 50 | 50 | 1 |
8 | 2021 年 1 月 1 日 1:45:00 | 50 | 50 | 1 |
9 | 2021 年 1 月 1 日 2:00:00 | 50 | 50 | 1 |
10 | 2021 年 1 月 1 日 2:15:00 | 50 | 50 | 1 |
11 | 2021 年 1 月 1 日 2:30:00 | 45 | 50 | 2 |
12 | 2021 年 1 月 1 日 2:45:00 | 45 | 50 | 2 |
13 | 2021 年 1 月 1 日 3:00:00 | 45 | 50 | 2 |
14 | 2021 年 1 月 1 日 3:15:00 | 45 | 50 | 2 |
15 | 2021 年 1 月 1 日 3:30:00 | 45 | 50 | 2 |
16 | 2021 年 1 月 1 日 3:45:00 | 45 | 50 | 2 |
17 | 2021 年 1 月 1 日 4:00:00 | 50 | 50 | 3 |
18 | 2021 年 1 月 1 日 4:15:00 | 50 | 50 | 3 |
19 | 2021 年 1 月 1 日 4:30:00 | 50 | 50 | 3 |
20 | 2021 年 1 月 1 日 4:45:00 | 50 | 50 | 3 |
21 | 2021 年 1 月 1 日 5:00:00 | 50 | 50 | 3 |
22 | 2021 年 1 月 1 日 5:15:00 | 50 | 50 | 3 |
23 | 2021 年 1 月 1 日 5:30:00 | 50 | 50 | 3 |
此外,還需要添加一個例外,例如,如果下一組具有相似的模式,則不要更改而是保留數據原樣。 示例如下:如果第 1 組和第 3 組相同,則將第 2 組歸入第 1 組值。 但是如果第 2 組和第 4 組相同,則不要更改第 3 組,在 New_data 中保留相同的數據。
案例2:-
編號 | 時間戳 | 數據 | 新數據 | 團體 |
---|---|---|---|---|
1 | 2021 年 1 月 1 日 0:00:00 | 50 | 50 | 1 |
2 | 2021 年 1 月 1 日 0:15:00 | 50 | 50 | 1 |
3 | 2021 年 1 月 1 日 0:30:00 | 50 | 50 | 1 |
4 | 2021 年 1 月 1 日 0:45:00 | 50 | 50 | 1 |
5 | 2021 年 1 月 1 日 1:00:00 | 50 | 50 | 1 |
6 | 2021 年 1 月 1 日 1:15:00 | 50 | 50 | 1 |
7 | 2021 年 1 月 1 日 1:30:00 | 50 | 50 | 1 |
8 | 2021 年 1 月 1 日 1:45:00 | 50 | 50 | 1 |
9 | 2021 年 1 月 1 日 2:00:00 | 50 | 50 | 1 |
10 | 2021 年 1 月 1 日 2:15:00 | 50 | 50 | 1 |
11 | 2021 年 1 月 1 日 2:30:00 | 45 | 50 | 2 |
12 | 2021 年 1 月 1 日 2:45:00 | 45 | 50 | 2 |
13 | 2021 年 1 月 1 日 3:00:00 | 45 | 50 | 2 |
14 | 2021 年 1 月 1 日 3:15:00 | 45 | 50 | 2 |
15 | 2021 年 1 月 1 日 3:30:00 | 45 | 50 | 2 |
16 | 2021 年 1 月 1 日 3:45:00 | 45 | 50 | 2 |
17 | 2021 年 1 月 1 日 4:00:00 | 50 | 50 | 3 |
18 | 2021 年 1 月 1 日 4:15:00 | 50 | 50 | 3 |
19 | 2021 年 1 月 1 日 4:30:00 | 50 | 50 | 3 |
20 | 2021 年 1 月 1 日 4:45:00 | 50 | 50 | 3 |
21 | 2021 年 1 月 1 日 5:00:00 | 50 | 50 | 3 |
22 | 2021 年 1 月 1 日 5:15:00 | 50 | 50 | 3 |
23 | 2021 年 1 月 1 日 5:30:00 | 50 | 50 | 3 |
24 | 2021 年 1 月 1 日 5:45:00 | 45 | 45 | 4 |
25 | 2021 年 1 月 1 日 6:00:00 | 45 | 45 | 4 |
26 | 2021 年 1 月 1 日 6:15:00 | 45 | 45 | 4 |
27 | 2021 年 1 月 1 日 6:30:00 | 45 | 45 | 4 |
28 | 2021 年 1 月 1 日 6:45:00 | 45 | 45 | 4 |
29 | 2021 年 1 月 1 日 7:00:00 | 45 | 45 | 4 |
30 | 2021 年 1 月 1 日 7:15:00 | 45 | 45 | 4 |
31 | 2021 年 1 月 1 日 7:30:00 | 45 | 45 | 4 |
在 postgresql 中尋求幫助以解決上述情況。 請隨時提出解決上述問題的任何替代方法。
下面的查詢應該回答需要。
第一個查詢標識對應於數據更改的行。
第二個查詢對兩次連續數據變化之間的行進行分組,並設置相應的時間戳范圍
第三個查詢是遞歸查詢,它根據時間戳順序以迭代的方式計算 new_data。
最后一個查詢顯示預期結果。
WITH RECURSIVE list As ( SELECT no, timestamp, lag(data) OVER w AS previous, data, lead(data) OVER w AS next, data IS DISTINCT FROM lag(data) OVER w AS first, data IS DISTINCT FROM lead(data) OVER w AS last FROM sensors WINDOW w AS (ORDER BY timestamp ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) ), range_list AS ( SELECT tsrange(timestamp, lead(timestamp) OVER w, '[]') AS range, previous, data, lead(next) OVER w AS next, first FROM list WHERE first OR last WINDOW w AS (ORDER BY timestamp ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) ), rec_list (range, previous, data, next, new_data, arr) AS ( SELECT range, previous, data, next, data, array[range] FROM range_list WHERE previous IS NULL UNION ALL SELECT c.range, p.data, c.data, c.next, CASE WHEN p.new_data IS NOT DISTINCT FROM c.next THEN p.data ELSE c.data END, p.arr || c.range FROM rec_list AS p INNER JOIN range_list AS c ON lower(c.range) = upper(p.range) + interval '15 minutes' WHERE NOT array[c.range] <@ p.arr AND first ) SELECT s.*, r.new_data FROM sensors AS s INNER JOIN rec_list AS r ON r.range @> s.timestamp ORDER BY timestamp
在dbfiddle中查看測試結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.