[英]How to check for consecutive timestamp in a list
我有一本字典,其值如下:
{
'original_data': [{'1600995180': 64.71666666666667, '1600995240': 0.17222222222222222, '1600995300': 0.16111111111111112, '1600995360': 0.6666666666666666, '1600995420': 0.17222222222222222, '1600995480': 0.0, '1600995540': 0.0, '1600995600': 0.0, '1600995660': 0.0, '1600995720': 0.0, '1600995780': 0.0, '1600995840': 1.0, '1600995900': 1.0, '1600995960': 1.0, '1600996020': 0.0, '1600996080': 0.0, '1600996140': 1.0, '1600996200': 1.0, '1600996260': 1.0, '1600996320': 0.0, '1600996380': 0.0, '1600996440': 0.0, '1600996500': 0.0, '1600996560': 0.0, '1600996620': 0.0, '1600996680': 0.0, '1600996740': 0.0, '1600996800': 0.0, '1600996860': 0.0, '1600996920': 10.86944444444444, '1600996980': 106.88333333333331}],
'outliers': [0.16111111111111112, 0.17222222222222222, 0.17222222222222222, 0.6666666666666666, 10.86944444444444, 64.71666666666667, 106.88333333333331]
}
original_data
包含一個值為{timestamp: value}
的列表。 離群值只包含來自 original_data 的離群value
。
我想實際比較outlier
value
中的每個value
,然后在original_data
查看這些值是否與時間戳連續出現。 每個數據點的時間戳相隔 1 分鍾
def consecutively(data):
values = data['original_data'][0].values()
out = data['outliers']
b = False
for v in values:
if v in out:
if b:
return True
else:
b = True
else:
b = False
return False
這行得通!
PS 我不確定將“original_data”用作只有 1 個項目的列表,這是一個字典。 為什么不直接使用字典?
我有一個建議,那就是在 pandas DataFrame
處理這個DataFrame
。
我將調用您的原始字典data
。 它的格式有點奇怪,但可以輕松處理:
import pandas as pd # pip install pandas if you don't have it
df = pd.DataFrame(data["original_data"]).T.reset_index()
df.columns = ["timestamp", "value"] # change the column names to something descriptive
### OPTIONAL (convert UNIX timestamps to pandas Timestamp to makes things clearer)
df["timestamp"] = pd.to_datetime(df.timestamp, unit="s")
###
df["outlier"] = df.value.isin(data["outliers"]) # add a column to show whether a value was an outlier
到這一步,你就大功告成了! 您可以檢查df
並查看:
timestamp value outlier
0 2020-09-25 00:53:00 64.716667 True
1 2020-09-25 00:54:00 0.172222 True
2 2020-09-25 00:55:00 0.161111 True
3 2020-09-25 00:56:00 0.666667 True
4 2020-09-25 00:57:00 0.172222 True
5 2020-09-25 00:58:00 0.000000 False
6 2020-09-25 00:59:00 0.000000 False
7 2020-09-25 01:00:00 0.000000 False
8 2020-09-25 01:01:00 0.000000 False
9 2020-09-25 01:02:00 0.000000 False
10 2020-09-25 01:03:00 0.000000 False
11 2020-09-25 01:04:00 1.000000 False
12 2020-09-25 01:05:00 1.000000 False
13 2020-09-25 01:06:00 1.000000 False
14 2020-09-25 01:07:00 0.000000 False
15 2020-09-25 01:08:00 0.000000 False
16 2020-09-25 01:09:00 1.000000 False
17 2020-09-25 01:10:00 1.000000 False
18 2020-09-25 01:11:00 1.000000 False
19 2020-09-25 01:12:00 0.000000 False
20 2020-09-25 01:13:00 0.000000 False
21 2020-09-25 01:14:00 0.000000 False
22 2020-09-25 01:15:00 0.000000 False
23 2020-09-25 01:16:00 0.000000 False
24 2020-09-25 01:17:00 0.000000 False
25 2020-09-25 01:18:00 0.000000 False
26 2020-09-25 01:19:00 0.000000 False
27 2020-09-25 01:20:00 0.000000 False
28 2020-09-25 01:21:00 0.000000 False
29 2020-09-25 01:22:00 10.869444 True
30 2020-09-25 01:23:00 106.883333 True
這會告訴你你想知道什么。 或者,如果您想明確標記一個異常值是否在另一個異常值之前,您可以這樣做
df["is_outlier_preceded_by_outlier"] = df.outlier & df.outlier.diff().eq(False)
這將創建一個值為True
的列,該值是一個異常值並且前面是另一個異常值,否則為False
。
df.query("is_outlier_preceded_by_outlier")
將只返回True
。
編輯:或者(不太明顯但更具可擴展性)
df["is_outlier_preceded_by_outlier"] = df.outlier.rolling(2).sum().eq(2)
也可以工作,您可以將 2(在兩個地方)更改為您喜歡查找 N 個連續異常值的任何數字。
編輯 2:所以,如果你想要每組 N 個連續異常值的值,那就有點棘手了:
groups = df.outlier.diff().ne(0).cumsum()
is_part_of_long_group = df.outlier.groupby(groups).transform("size").ge(3)
df["one_of_many_outliers"] = is_part_of_long_group & df.outlier
df.query("one_of_many_outliers").value
首先,我們必須在outlier
列中識別相同值的組。 df.outlier.diff().ne(0).cumsum()
創建一個系列,我們將其用作分組索引,每當outlier
列中的下一個值與前一個值不同時,其outlier
就會遞增。
接下來我們通過這個“索引”對outlier
列進行分組,並使用transform
方法來獲取每組連續值的大小。 最后,我們檢查該組的大小是否大於或等於 3,即我們查找長度至少為 3 個項目的連續值組。
請注意,盡管agg("size")
會給我們每個組及其大小,但transform("size")
獲取每個組的大小並將其映射回原始df.outlier
系列。
最后,我們對連續的非異常值不感興趣,因此我們檢查值是否既是異常值又是一長組連續相等值的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.