tsadmetrics 0.1.9__py3-none-any.whl → 0.1.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -262,16 +262,29 @@ def transform_to_full_series(length: int, anomalies: np.array):
262
262
 
263
263
  def counting_method(y_true: np.array, y_pred: np.array, k: int):
264
264
  em,da,ma,fa = 0,0,0,0
265
- for gt,pa in zip(y_true,y_pred):
265
+ for i_gt in range(len(y_true)):
266
+ i_pa = i_gt
267
+ gt = y_true[i_gt]
268
+ pa = y_pred[i_pa]
266
269
  if gt==1 and pa==1:
267
270
  em+=1
268
271
  elif gt==0 and pa==1:
269
272
  fa+=1
270
- else:
273
+ elif gt==1 and pa==0:
274
+ anom_range = y_pred[i_gt-k:i_pa+k+1]
275
+ detected = False
276
+ for r in anom_range:
277
+ if r==1:
278
+ em+=1
279
+ detected=True
280
+ break
281
+ if not detected:
282
+ ma+=1
283
+ elif gt==0 and pa==0:
271
284
  pass
272
- b = DelayThresholdedPointAdjust(len(y_true),y_true,y_pred,k=k)
273
- da = b.tp-em
274
- ma = b.fn
285
+ # b = DelayThresholdedPointAdjust(len(y_true),y_true,y_pred,k=k)
286
+ # da = b.tp-em
287
+ # ma = b.fn
275
288
 
276
289
  return em,da,ma,fa
277
290
 
@@ -1,16 +1,42 @@
1
1
  import numpy as np
2
2
  from ._tsadeval.metrics import *
3
- from .metric_utils import transform_to_full_series
4
3
  from sklearn.metrics import auc
5
- from .binary_metrics import point_adjusted_precision, point_adjusted_recall, segment_wise_precision, segment_wise_recall
6
4
  from pate.PATE_metric import PATE
7
- def precision_at_k(y_true : np.array ,y_anomaly_scores: np.array):
8
-
5
+ def precision_at_k(y_true : np.array, y_anomaly_scores: np.array):
6
+ """
7
+ Calculate the precision at k score for anomaly detection in time series.
8
+
9
+ This metric evaluates how many of the top-k points (with highest anomaly scores)
10
+ actually correspond to true anomalies. It is particularly useful when we are
11
+ interested in identifying the most anomalous points, without needing to set a
12
+ fixed threshold.
13
+
14
+ The value of k is automatically set to the number of true anomalies present in
15
+ y_true. That is, k = sum(y_true).
16
+
17
+ Parameters:
18
+ y_true (np.array): The ground truth binary labels for the time series data.
19
+ y_anomaly_scores (np.array): The predicted anomaly scores for the time series data.
20
+ """
9
21
  m = PatK_pw(y_true,y_anomaly_scores)
10
22
 
11
23
  return m.get_score()
12
24
 
13
- def auc_roc_pw(y_true : np.array ,y_anomaly_scores: np.array):
25
+ def auc_roc_pw(y_true : np.array, y_anomaly_scores: np.array):
26
+ """
27
+ Calculate the AUC-ROC score for anomaly detection in time series.
28
+
29
+ This is the standard Area Under the Receiver Operating Characteristic Curve (AUC-ROC),
30
+ computed in a point-wise manner. That is, each point in the time series is treated
31
+ independently when calculating true positives, false positives, and false negatives.
32
+
33
+ Parameters:
34
+ y_true (np.array): Ground-truth binary labels for the time series (0 = normal, 1 = anomaly).
35
+ y_anomaly_scores (np.array): Continuous anomaly scores assigned to each point in the series.
36
+
37
+ Returns:
38
+ float: AUC-ROC score.
39
+ """
14
40
 
15
41
  m = AUC_ROC(y_true,y_anomaly_scores)
16
42
 
@@ -18,7 +44,20 @@ def auc_roc_pw(y_true : np.array ,y_anomaly_scores: np.array):
18
44
 
19
45
 
20
46
  def auc_pr_pw(y_true : np.array ,y_anomaly_scores: np.array):
21
-
47
+ """
48
+ Calculate the AUC-PR score for anomaly detection in time series.
49
+
50
+ This is the standard Area Under the Precision-Recall Curve (AUC-PR),
51
+ computed in a point-wise manner. That is, each point in the time series is treated
52
+ independently when calculating precision and recall.
53
+
54
+ Parameters:
55
+ y_true (np.array): Ground-truth binary labels for the time series (0 = normal, 1 = anomaly).
56
+ y_anomaly_scores (np.array): Continuous anomaly scores assigned to each point in the series.
57
+
58
+ Returns:
59
+ float: AUC-PR score.
60
+ """
22
61
  m = AUC_PR_pw(y_true,y_anomaly_scores)
23
62
 
24
63
  return m.get_score()
@@ -26,19 +65,88 @@ def auc_pr_pw(y_true : np.array ,y_anomaly_scores: np.array):
26
65
 
27
66
 
28
67
  def auc_pr_pa(y_true: np.array, y_anomaly_scores: np.array):
29
- thresholds = np.unique(y_anomaly_scores)[::-1] # Descending order
68
+ """
69
+ Calculate the AUC-PR score using point-adjusted evaluation for anomaly detection in time series.
70
+
71
+ This is the standard Area Under the Precision-Recall Curve (AUC-PR), but instead of computing
72
+ precision and recall point-wise, it uses a point-adjusted approach. Specifically, for each
73
+ ground-truth anomalous segment, if at least one point within that segment is predicted as anomalous,
74
+ the entire segment is considered correctly detected. The adjusted predictions are then compared
75
+ to the ground-truth labels to compute true positives, false positives, and false negatives,
76
+ which are used to construct the PR curve.
77
+
78
+ Parameters:
79
+ y_true (np.array): Ground-truth binary labels for the time series (0 = normal, 1 = anomaly).
80
+ y_anomaly_scores (np.array): Continuous anomaly scores assigned to each point in the series.
81
+
82
+ Returns:
83
+ float: AUC-PR score (with point-adjusted evaluation).
84
+ """
85
+
86
+
30
87
  precisions = [1]
31
88
  recalls = [0]
32
- for t in thresholds[:-1]:
89
+ tps,fps,fns = [],[],[]
90
+
91
+ p_adj = PointAdjust(len(y_true),y_true,(np.array(y_anomaly_scores) >= 0.5).astype(int))
92
+ segments= p_adj.get_gt_anomalies_segmentwise()
93
+ idx = np.argsort(y_anomaly_scores)[::-1].astype(int)
94
+ y_true_sorted = np.array(y_true)[idx]
95
+ y_anomaly_scores_sorted = np.array(y_anomaly_scores)[idx]
96
+
97
+ segment_mins = []
98
+ for start,end in segments:
99
+ anoms_scores = y_anomaly_scores[start:end+1]
100
+ segment_mins.append([np.max(anoms_scores),end-start+1])
33
101
 
34
- y_pred = (y_anomaly_scores >= t).astype(int)
102
+ for i_t in range(len(y_anomaly_scores_sorted)):
103
+ fp,tp,fn = 0,0,0
104
+ if i_t > 0 and y_anomaly_scores_sorted[i_t] == y_anomaly_scores_sorted[i_t-1] :
105
+ tp = tps[-1]
106
+ fp = fps[-1]
107
+ fn = fns[-1]
108
+ else:
109
+ if y_true_sorted[i_t] == 0:
110
+ #FP
111
+ if len(fps)==0:
112
+ aux_y_pred = (y_anomaly_scores >= y_anomaly_scores_sorted[i_t]).astype(int)
113
+ for i in range(len(aux_y_pred)):
114
+ if aux_y_pred[i] == 1 and y_true[i] == 0:
115
+ fp+=1
35
116
 
36
117
 
37
- precisions.append(point_adjusted_precision(y_true, y_pred))
38
- recalls.append(point_adjusted_recall(y_true, y_pred))
118
+ else:
119
+ fp=fps[i_t-1]+1
120
+ else:
121
+ if len(fps)==0:
122
+ aux_y_pred = (y_anomaly_scores >= y_anomaly_scores_sorted[i_t]).astype(int)
123
+ for i in range(len(aux_y_pred)):
124
+ if aux_y_pred[i] == 1 and y_true[i] == 0:
125
+ fp+=1
126
+ else:
127
+ fp=fps[i_t-1]
128
+ for score, length in segment_mins:
129
+ if score >= y_anomaly_scores_sorted[i_t]:
130
+ #TP
131
+ tp+= length
132
+ else:
133
+ #FN
134
+ fn+= length
135
+ tps.append(tp)
136
+ fns.append(fn)
137
+ fps.append(fp)
138
+ for tp,fp,fn in zip(tps,fps,fns):
139
+ if tp>0:
140
+ precisions.append(tp/(tp+fp))
141
+ recalls.append(tp/(tp+fn))
142
+ else:
143
+ precisions.append(0)
144
+ recalls.append(0)
145
+
39
146
 
40
147
  recalls.append(1)
41
148
  precisions.append(0)
149
+
42
150
  auc_value = auc(recalls, precisions)
43
151
  return auc_value
44
152
 
@@ -46,29 +154,159 @@ def auc_pr_pa(y_true: np.array, y_anomaly_scores: np.array):
46
154
 
47
155
 
48
156
  def auc_pr_sw(y_true: np.array, y_anomaly_scores: np.array):
49
- thresholds = np.unique(y_anomaly_scores)[::-1] # Descending order
157
+ """
158
+ Calculate the AUC-PR score using segment-wise evaluation for anomaly detection in time series.
159
+
160
+ This is the standard Area Under the Precision-Recall Curve (AUC-PR), but it uses a segment-wise
161
+ adjustment when computing precision and recall. In this evaluation, each contiguous segment of
162
+ anomalous ground-truth points is treated as a single unit. A true positive is counted if at least
163
+ one predicted anomaly overlaps with the segment. A false negative occurs when a segment is
164
+ completely missed, and a false positive is recorded for each predicted anomalous segment
165
+ that does not overlap with any ground-truth anomaly. These adjusted counts are then used
166
+ to compute precision and recall for constructing the PR curve.
167
+
168
+ Parameters:
169
+ y_true (np.array): Ground-truth binary labels for the time series (0 = normal, 1 = anomaly).
170
+ y_anomaly_scores (np.array): Continuous anomaly scores assigned to each point in the series.
171
+
172
+ Returns:
173
+ float: AUC-PR score (with segment-wise evaluation).
174
+ """
175
+
50
176
  precisions = [1]
51
177
  recalls = [0]
178
+ tps,fps,fns = [],[],[]
179
+
180
+
181
+ segments = []
182
+ i=0
183
+ while i < len(y_true):
184
+ if y_true[i] == 1:
185
+ start = i
186
+ end = i
187
+ while i < len(y_true) and y_true[i] == 1:
188
+ end = i
189
+ i += 1
190
+ segments.append([start,end])
191
+ i+=1
192
+ idx = np.argsort(y_anomaly_scores)[::-1].astype(int)
193
+ y_anomaly_scores_sorted = np.array(y_anomaly_scores)[idx]
52
194
 
53
- for t in thresholds[:-1]:
54
- y_pred = (y_anomaly_scores >= t).astype(int)
55
- precisions.append(segment_wise_precision(y_true, y_pred))
56
- recalls.append(segment_wise_recall(y_true, y_pred))
57
- recalls.append(1)
58
- precisions.append(0)
195
+ segment_mins = []
196
+ for start,end in segments:
197
+ anoms_scores = y_anomaly_scores[start:end+1]
198
+ segment_mins.append([np.max(anoms_scores),[start,end]])
199
+
200
+ for i_t in range(len(y_anomaly_scores_sorted)):
201
+ fp,tp,fn = 0,0,0
202
+
203
+
204
+ aux_y_pred = (y_anomaly_scores >= y_anomaly_scores_sorted[i_t]).astype(int)
205
+ for score,seg in segment_mins:
206
+ start,end = seg
207
+ if score >= y_anomaly_scores_sorted[i_t]:
208
+ #TP
209
+ tp+= 1
210
+ if aux_y_pred[start]== 1:
211
+ # Extender hacia la izquierda
212
+ i = start - 1
213
+ while i >= 0 and aux_y_pred[i] == 1:
214
+ aux_y_pred[i] = 0
215
+ i -= 1
216
+
217
+ if aux_y_pred[end] == 1:
218
+ # Extender hacia la derecha
219
+ i = end + 1
220
+ while i < len(aux_y_pred) and aux_y_pred[i] == 1:
221
+ aux_y_pred[i] = 0
222
+ i += 1
223
+ aux_y_pred[start:end+1] = 0
224
+
225
+ else:
226
+ #FN
227
+ fn+= 1
228
+
229
+ if np.sum(aux_y_pred)>0:
230
+ fpsegments = []
231
+ i=0
232
+ while i < len(aux_y_pred):
233
+ if aux_y_pred[i] == 1:
234
+ start = i
235
+ end = i
236
+ while i < len(aux_y_pred) and aux_y_pred[i] == 1:
237
+ end = i
238
+ i += 1
239
+ fpsegments.append([start,end])
240
+ i+=1
241
+ fp = len(fpsegments)
242
+ else:
243
+ fp = 0
244
+
245
+
246
+ tps.append(tp)
247
+ fns.append(fn)
248
+ fps.append(fp)
249
+ for tp,fp,fn in zip(tps,fps,fns):
250
+ if tp>0:
251
+ precisions.append(tp/(tp+fp))
252
+ recalls.append(tp/(tp+fn))
253
+ else:
254
+ precisions.append(0)
255
+ recalls.append(0)
256
+
257
+
258
+
59
259
  auc_value = auc(recalls, precisions)
260
+
60
261
  return auc_value
61
262
 
62
263
 
63
264
  def vus_roc(y_true : np.array ,y_anomaly_scores: np.array, window=4):
64
-
265
+ """
266
+ Calculate the VUS-ROC (Volume Under the ROC Surface) score for anomaly detection in time series.
267
+
268
+ This metric extends the classical AUC-ROC by introducing a temporal tolerance parameter `l`, which
269
+ smooths the binary ground-truth labels. The idea is to allow a flexible evaluation that tolerates
270
+ small misalignments in the detection of anomalies. The final score is computed by integrating
271
+ the ROC-AUC over different values of the tolerance parameter, from 0 to `window`, thus producing
272
+ a volume under the ROC surface.
273
+
274
+ Parameters:
275
+ y_true (np.array): Ground-truth binary labels (0 = normal, 1 = anomaly).
276
+ y_anomaly_scores (np.array): Anomaly scores for each time point.
277
+ window (int): Maximum temporal tolerance `l` used to smooth the evaluation.
278
+
279
+ Returns:
280
+ float: VUS-ROC score.
281
+
282
+ For more information, see the original paper:
283
+ https://dl.acm.org/doi/10.14778/3551793.3551830
284
+ """
65
285
  m = VUS_ROC(y_true,y_anomaly_scores,max_window=window)
66
286
 
67
287
  return m.get_score()
68
288
 
69
289
 
70
290
  def vus_pr(y_true : np.array ,y_anomaly_scores: np.array, window=4):
71
-
291
+ """
292
+ Calculate the VUS-PR (Volume Under the PR Surface) score for anomaly detection in time series.
293
+
294
+ This metric is an extension of the classical AUC-PR, incorporating a temporal tolerance parameter `l`
295
+ that smooths the binary ground-truth labels. It allows for some flexibility in the detection of
296
+ anomalies that are temporally close to the true events. The final metric integrates the PR-AUC
297
+ over several levels of temporal tolerance (from 0 to `window`), yielding a volume under the PR surface.
298
+
299
+ Parameters:
300
+ y_true (np.array): Ground-truth binary labels (0 = normal, 1 = anomaly).
301
+ y_anomaly_scores (np.array): Anomaly scores for each time point.
302
+ window (int): Maximum temporal tolerance `l` used to smooth the evaluation.
303
+
304
+ Returns:
305
+ float: VUS-PR score.
306
+
307
+ For more information, see the original paper:
308
+ https://dl.acm.org/doi/10.14778/3551793.3551830
309
+ """
72
310
  m = VUS_PR(y_true,y_anomaly_scores,max_window=window)
73
311
 
74
312
  return m.get_score()
@@ -76,17 +314,29 @@ def vus_pr(y_true : np.array ,y_anomaly_scores: np.array, window=4):
76
314
 
77
315
  def real_pate(y_true: np.array, y_anomaly_scores: np.array, early: int, delay: int):
78
316
  """
79
- Calculate PATE score for anomaly detection in time series.
80
- The PATE score is the ratio of the number of true positives to the sum of true positives, false positives, and false negatives, within a given early and delay range.
317
+ Calculate PATE score for anomaly detection in time series using real-valued anomaly scores.
318
+
319
+ This version of PATE evaluates real-valued anomaly scores by assigning weights to predictions
320
+ based on their temporal proximity to the true anomaly intervals. It defines an early buffer of
321
+ length `early` before each anomaly and a delay buffer of length `delay` after it. Detections with
322
+ high scores within the anomaly interval receive full weight, while those in the buffer zones are
323
+ assigned linearly decaying weights depending on their distance from the interval. Scores outside
324
+ these zones contribute to false positives, and intervals with insufficient detection are penalized
325
+ as false negatives.
326
+
327
+ The final PATE score aggregates these weighted contributions across all time steps, yielding
328
+ a smooth performance measure that is sensitive to both the timing and confidence of the predictions.
329
+
330
+ For more information, see the original paper:
331
+ https://arxiv.org/abs/2405.12096
81
332
 
82
333
  Parameters:
83
- y_true (np.array): The ground truth binary labels for the time series data.
84
- y_anomaly_scores (np.array): The predicted binary labels for the time series data.
85
- early (int): The maximum number of time steps before an anomaly must be predicted to be considered early.
86
- delay (int): The maximum number of time steps after an anomaly must be predicted to be considered delayed.
334
+ y_true (np.array): Ground truth binary labels (0 = normal, 1 = anomaly).
335
+ y_anomaly_scores (np.array): Real-valued anomaly scores for each time point.
336
+ early (int): Length of the early buffer zone before each anomaly interval.
337
+ delay (int): Length of the delay buffer zone after each anomaly interval.
87
338
 
88
339
  Returns:
89
- float: The PATE score.
340
+ float: The real-valued PATE score.
90
341
  """
91
-
92
342
  return PATE(y_true, y_anomaly_scores, early, delay, binary_scores=False)
tsadmetrics/utils.py CHANGED
@@ -2,7 +2,7 @@ import numpy as np
2
2
  import pandas as pd
3
3
  import time
4
4
 
5
- def compute_metrics(y_true: np.array,y_pred: np.array,metrics: list, metrics_params: dict, is_anomaly_score = False, verbose = False):
5
+ def compute_metrics(y_true: np.array,y_pred: np.array, metrics: list, metrics_params: dict, is_anomaly_score = False, verbose = False):
6
6
  """
7
7
  Computes the specified metrics for the given true and predicted values.
8
8
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tsadmetrics
3
- Version: 0.1.9
3
+ Version: 0.1.11
4
4
  Summary: =?unknown-8bit?q?Librer=C3=ADa_para_evaluaci=C3=B3n_de_detecci=C3=B3n_de_anomal=C3=ADas?= en series temporales
5
5
  Home-page: https://github.com/pathsko/TSADmetrics
6
6
  Author: Pedro Rafael Velasco Priego
@@ -1,3 +1,4 @@
1
+ docs/conf.py,sha256=skVqctOiByesc7wNDW5DpjyTxUCP0wxlpWA1fsJYZhk,1384
1
2
  entorno/bin/activate_this.py,sha256=45dnJsdtOWIt5LtVSBmBfB8E7AlKcnhnZe9e3WGclak,1199
2
3
  entorno/bin/rst2html.py,sha256=h4RydG-iAectsUra0lNFGwB4_1mngxrtPPgQrxUWQ3A,643
3
4
  entorno/bin/rst2html4.py,sha256=Xiv3Zb1gk4jT7DYFVlf5w4LJtI5ZI3pW3b1KLxyPS5A,765
@@ -12,14 +13,14 @@ entorno/bin/rst2xetex.py,sha256=spisB81JgqAmMAkjdTaP8awFQS_Zuob9HIcbMi1kOS8,922
12
13
  entorno/bin/rst2xml.py,sha256=uoIfpn3prnir2tzqdycsAjOg-OWw663XOK47IeHCZdY,651
13
14
  entorno/bin/rstpep2html.py,sha256=sthYQHEgYfj4JqwG45URwVbRAs-HYuwKget7SUwp9fc,719
14
15
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- tests/test_binary.py,sha256=3uLdXzdbQcqLRfXeKDmt2g2XQTU5lZOFQoiy-r9Olqo,29801
16
- tests/test_non_binary.py,sha256=PRvsgGbwbRXVNkYBk2-oJw8ekLW4DWJkEZhAWO0L9sk,11309
16
+ tests/test_binary.py,sha256=dj9BsKBo5rpWw4JGiKKoVkg4rIW4YylTie2VxH2DAGo,29787
17
+ tests/test_non_binary.py,sha256=syANlwm0DKsL6geGeq6nQI6ZVe6T_YXWTyk2-Hmck4s,11308
17
18
  tsadmetrics/__init__.py,sha256=MTWOa43fgOdkMNo5NglCReRnB8hoF0ob2PIvDziCNHw,1575
18
- tsadmetrics/binary_metrics.py,sha256=nwfPdfHAc_4tJMNlyIwMwFQRLvCU-ik9lQLqlaWLqTs,37741
19
- tsadmetrics/metric_utils.py,sha256=Y_lOE01_uyC22wnw3_G-kKUEJdqevDIWMWvSDE8Cjms,10477
20
- tsadmetrics/non_binary_metrics.py,sha256=JIOvkigSjHBZLKbGJj7ESe0lPM7P1JPoIUnbiMZuuLg,2896
19
+ tsadmetrics/binary_metrics.py,sha256=pEIe8s3_obGN1hHhfvQwg0BXKafs4lQ3l1-K03P3Ews,60067
20
+ tsadmetrics/metric_utils.py,sha256=fm8v0X37_AlqWpkcUT9r3680QsjLljrHe2YuXkRLAZ4,10873
21
+ tsadmetrics/non_binary_metrics.py,sha256=yo620BWZIq-OkBqQV7t7ynjGhcuX6QWQ6iq_7eJq9gI,13074
21
22
  tsadmetrics/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- tsadmetrics/utils.py,sha256=fV5sJE094C_GjBbqrI34Wpy-4hcZtXc9y207ffQB7Mc,2360
23
+ tsadmetrics/utils.py,sha256=15X_RkHdCxhu_-OH8fEm3gRVQ4tTMqCkNaQsQoloEYQ,2361
23
24
  tsadmetrics/_tsadeval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
25
  tsadmetrics/_tsadeval/auc_roc_pr_plot.py,sha256=PHqJUXq2qI248XV9o04D8SsUJgowetaKq0Cu5bYrIAE,12689
25
26
  tsadmetrics/_tsadeval/discontinuity_graph.py,sha256=Ci65l_DPi6HTtb8NvQJe1najgGrRuEpOMWvSyi2AeR0,4088
@@ -52,7 +53,7 @@ tsadmetrics/_tsadeval/prts/time_series_metrics/fscore.py,sha256=pJz4iuPyVGNvwsaR
52
53
  tsadmetrics/_tsadeval/prts/time_series_metrics/precision.py,sha256=jLkcMg7UNl25SHtZUBGkP-RV8HsvaZCtjakryl7PFWU,3204
53
54
  tsadmetrics/_tsadeval/prts/time_series_metrics/precision_recall.py,sha256=OhUJSm_I7VZ_gX_SSg8AYUq3_NW9rMIy7lAVsnOFw4Q,417
54
55
  tsadmetrics/_tsadeval/prts/time_series_metrics/recall.py,sha256=LL-0pPer3ymovVRlktaHo5XDzpgiDhWOVfdPOzKR6og,3152
55
- tsadmetrics-0.1.9.dist-info/METADATA,sha256=tFW_YWxVHIkXA2qGqORTi2HGHfZ1akAE5aAKQrh7yhI,830
56
- tsadmetrics-0.1.9.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
57
- tsadmetrics-0.1.9.dist-info/top_level.txt,sha256=WHaYe-ubr_88yhxe-SaZC8HuAMvlSjXCo-wIdkTeKtA,26
58
- tsadmetrics-0.1.9.dist-info/RECORD,,
56
+ tsadmetrics-0.1.11.dist-info/METADATA,sha256=JrsyLRUVbWIhrBkE56hn3ALYUycm3j52kSmmcq8TMhA,831
57
+ tsadmetrics-0.1.11.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
58
+ tsadmetrics-0.1.11.dist-info/top_level.txt,sha256=s2VIr_ePl-WZbYt9FsYbsDGM7J-Qc5cgpwEOeQ3FVpM,31
59
+ tsadmetrics-0.1.11.dist-info/RECORD,,
@@ -1,3 +1,4 @@
1
+ docs
1
2
  entorno
2
3
  tests
3
4
  tsadmetrics