簡體   English   中英

解決和平滑傳感器數據中的噪聲

[英]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 中尋求幫助以解決上述情況。 請隨時提出解決上述問題的任何替代方法。

下面的查詢應該回答需要。

  1. 第一個查詢標識對應於數據更改的行。

  2. 第二個查詢對兩次連續數據變化之間的行進行分組,並設置相應的時間戳范圍

  3. 第三個查詢是遞歸查詢,它根據時間戳順序以迭代的方式計算 new_data。

  4. 最后一個查詢顯示預期結果。

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM