Skip to content

Commit 4108709

Browse files
alexbarrosaquemy
authored andcommitted
fix: complete alerts information in json (#1339)
* fix: complete alerts information in json * fix: lint issues * fix: mutable default parameters * fix: rebase conflicts
1 parent 9f5d4ba commit 4108709

File tree

1 file changed

+97
-60
lines changed

1 file changed

+97
-60
lines changed

src/ydata_profiling/model/alerts.py

Lines changed: 97 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,14 @@ class Alert:
9595
def __init__(
9696
self,
9797
alert_type: AlertType,
98-
values: Optional[Dict] = {},
98+
values: Optional[Dict] = None,
9999
column_name: Optional[str] = None,
100-
fields: Optional[Set] = set(),
100+
fields: Optional[Set] = None,
101101
is_empty: bool = False,
102102
):
103-
self.fields = fields
103+
self.fields = fields or set()
104104
self.alert_type = alert_type
105-
self.values = values
105+
self.values = values or {}
106106
self.column_name = column_name
107107
self._is_empty = is_empty
108108

@@ -143,14 +143,14 @@ def __repr__(self):
143143
class ConstantLengthAlert(Alert):
144144
def __init__(
145145
self,
146-
values: Optional[Dict] = {},
146+
values: Optional[Dict] = None,
147147
column_name: Optional[str] = None,
148148
is_empty: bool = False,
149149
):
150150
super().__init__(
151-
AlertType.CONSTANT_LENGTH,
152-
values,
153-
column_name,
151+
alert_type=AlertType.CONSTANT_LENGTH,
152+
values=values,
153+
column_name=column_name,
154154
fields={"composition_min_length", "composition_max_length"},
155155
is_empty=is_empty,
156156
)
@@ -162,14 +162,14 @@ def _get_description(self) -> str:
162162
class ConstantAlert(Alert):
163163
def __init__(
164164
self,
165-
values: Optional[Dict] = {},
165+
values: Optional[Dict] = None,
166166
column_name: Optional[str] = None,
167167
is_empty: bool = False,
168168
):
169169
super().__init__(
170-
AlertType.CONSTANT,
171-
values,
172-
column_name,
170+
alert_type=AlertType.CONSTANT,
171+
values=values,
172+
column_name=column_name,
173173
fields={"n_distinct"},
174174
is_empty=is_empty,
175175
)
@@ -181,14 +181,14 @@ def _get_description(self) -> str:
181181
class DuplicatesAlert(Alert):
182182
def __init__(
183183
self,
184-
values: Optional[Dict] = {},
184+
values: Optional[Dict] = None,
185185
column_name: Optional[str] = None,
186186
is_empty: bool = False,
187187
):
188188
super().__init__(
189-
AlertType.DUPLICATES,
190-
values,
191-
column_name,
189+
alert_type=AlertType.DUPLICATES,
190+
values=values,
191+
column_name=column_name,
192192
fields={"n_duplicates"},
193193
is_empty=is_empty,
194194
)
@@ -203,12 +203,16 @@ def _get_description(self) -> str:
203203
class EmptyAlert(Alert):
204204
def __init__(
205205
self,
206-
values: Optional[Dict] = {},
206+
values: Optional[Dict] = None,
207207
column_name: Optional[str] = None,
208208
is_empty: bool = False,
209209
):
210210
super().__init__(
211-
AlertType.EMPTY, values, column_name, fields={"n"}, is_empty=is_empty
211+
alert_type=AlertType.EMPTY,
212+
values=values,
213+
column_name=column_name,
214+
fields={"n"},
215+
is_empty=is_empty,
212216
)
213217

214218
def _get_description(self) -> str:
@@ -218,14 +222,14 @@ def _get_description(self) -> str:
218222
class HighCardinalityAlert(Alert):
219223
def __init__(
220224
self,
221-
values: Optional[Dict] = {},
225+
values: Optional[Dict] = None,
222226
column_name: Optional[str] = None,
223227
is_empty: bool = False,
224228
):
225229
super().__init__(
226-
AlertType.HIGH_CARDINALITY,
227-
values,
228-
column_name,
230+
alert_type=AlertType.HIGH_CARDINALITY,
231+
values=values,
232+
column_name=column_name,
229233
fields={"n_distinct"},
230234
is_empty=is_empty,
231235
)
@@ -240,12 +244,15 @@ def _get_description(self) -> str:
240244
class HighCorrelationAlert(Alert):
241245
def __init__(
242246
self,
243-
values: Optional[Dict] = {},
247+
values: Optional[Dict] = None,
244248
column_name: Optional[str] = None,
245249
is_empty: bool = False,
246250
):
247251
super().__init__(
248-
AlertType.HIGH_CORRELATION, values, column_name, set(), is_empty
252+
alert_type=AlertType.HIGH_CORRELATION,
253+
values=values,
254+
column_name=column_name,
255+
is_empty=is_empty,
249256
)
250257

251258
def _get_description(self) -> str:
@@ -263,14 +270,14 @@ def _get_description(self) -> str:
263270
class ImbalanceAlert(Alert):
264271
def __init__(
265272
self,
266-
values: Optional[Dict] = {},
273+
values: Optional[Dict] = None,
267274
column_name: Optional[str] = None,
268275
is_empty: bool = False,
269276
):
270277
super().__init__(
271-
AlertType.IMBALANCE,
272-
values,
273-
column_name,
278+
alert_type=AlertType.IMBALANCE,
279+
values=values,
280+
column_name=column_name,
274281
fields={"imbalance"},
275282
is_empty=is_empty,
276283
)
@@ -286,14 +293,14 @@ def _get_description(self) -> str:
286293
class InfiniteAlert(Alert):
287294
def __init__(
288295
self,
289-
values: Optional[Dict] = {},
296+
values: Optional[Dict] = None,
290297
column_name: Optional[str] = None,
291298
is_empty: bool = False,
292299
):
293300
super().__init__(
294-
AlertType.INFINITE,
295-
values,
296-
column_name,
301+
alert_type=AlertType.INFINITE,
302+
values=values,
303+
column_name=column_name,
297304
fields={"p_infinite", "n_infinite"},
298305
is_empty=is_empty,
299306
)
@@ -308,14 +315,14 @@ def _get_description(self) -> str:
308315
class MissingAlert(Alert):
309316
def __init__(
310317
self,
311-
values: Optional[Dict] = {},
318+
values: Optional[Dict] = None,
312319
column_name: Optional[str] = None,
313320
is_empty: bool = False,
314321
):
315322
super().__init__(
316-
AlertType.MISSING,
317-
values,
318-
column_name,
323+
alert_type=AlertType.MISSING,
324+
values=values,
325+
column_name=column_name,
319326
fields={"p_missing", "n_missing"},
320327
is_empty=is_empty,
321328
)
@@ -330,11 +337,16 @@ def _get_description(self) -> str:
330337
class NonStationaryAlert(Alert):
331338
def __init__(
332339
self,
333-
values: Optional[Dict] = {},
340+
values: Optional[Dict] = None,
334341
column_name: Optional[str] = None,
335342
is_empty: bool = False,
336343
):
337-
super().__init__(AlertType.NON_STATIONARY, values, column_name, set(), is_empty)
344+
super().__init__(
345+
alert_type=AlertType.NON_STATIONARY,
346+
values=values,
347+
column_name=column_name,
348+
is_empty=is_empty,
349+
)
338350

339351
def _get_description(self) -> str:
340352
return f"[{self.column_name}] is non stationary"
@@ -343,11 +355,16 @@ def _get_description(self) -> str:
343355
class SeasonalAlert(Alert):
344356
def __init__(
345357
self,
346-
values: Optional[Dict] = {},
358+
values: Optional[Dict] = None,
347359
column_name: Optional[str] = None,
348360
is_empty: bool = False,
349361
):
350-
super().__init__(AlertType.SEASONAL, values, column_name, set(), is_empty)
362+
super().__init__(
363+
alert_type=AlertType.SEASONAL,
364+
values=values,
365+
column_name=column_name,
366+
is_empty=is_empty,
367+
)
351368

352369
def _get_description(self) -> str:
353370
return f"[{self.column_name}] is seasonal"
@@ -356,14 +373,14 @@ def _get_description(self) -> str:
356373
class SkewedAlert(Alert):
357374
def __init__(
358375
self,
359-
values: Optional[Dict] = {},
376+
values: Optional[Dict] = None,
360377
column_name: Optional[str] = None,
361378
is_empty: bool = False,
362379
):
363380
super().__init__(
364-
AlertType.SKEWED,
365-
values,
366-
column_name,
381+
alert_type=AlertType.SKEWED,
382+
values=values,
383+
column_name=column_name,
367384
fields={"skewness"},
368385
is_empty=is_empty,
369386
)
@@ -379,11 +396,16 @@ def _get_description(self) -> str:
379396
class TypeDateAlert(Alert):
380397
def __init__(
381398
self,
382-
values: Optional[Dict] = {},
399+
values: Optional[Dict] = None,
383400
column_name: Optional[str] = None,
384401
is_empty: bool = False,
385402
):
386-
super().__init__(AlertType.TYPE_DATE, values, column_name, set(), is_empty)
403+
super().__init__(
404+
alert_type=AlertType.TYPE_DATE,
405+
values=values,
406+
column_name=column_name,
407+
is_empty=is_empty,
408+
)
387409

388410
def _get_description(self) -> str:
389411
return f"[{self.column_name}] only contains datetime values, but is categorical. Consider applying `pd.to_datetime()`"
@@ -392,11 +414,16 @@ def _get_description(self) -> str:
392414
class UniformAlert(Alert):
393415
def __init__(
394416
self,
395-
values: Optional[Dict] = {},
417+
values: Optional[Dict] = None,
396418
column_name: Optional[str] = None,
397419
is_empty: bool = False,
398420
):
399-
super().__init__(AlertType.UNIFORM, values, column_name, set(), is_empty)
421+
super().__init__(
422+
alert_type=AlertType.UNIFORM,
423+
values=values,
424+
column_name=column_name,
425+
is_empty=is_empty,
426+
)
400427

401428
def _get_description(self) -> str:
402429
return f"[{self.column_name}] is uniformly distributed"
@@ -405,14 +432,14 @@ def _get_description(self) -> str:
405432
class UniqueAlert(Alert):
406433
def __init__(
407434
self,
408-
values: Optional[Dict] = {},
435+
values: Optional[Dict] = None,
409436
column_name: Optional[str] = None,
410437
is_empty: bool = False,
411438
):
412439
super().__init__(
413-
AlertType.UNIQUE,
414-
values,
415-
column_name,
440+
alert_type=AlertType.UNIQUE,
441+
values=values,
442+
column_name=column_name,
416443
fields={"n_distinct", "p_distinct", "n_unique", "p_unique"},
417444
is_empty=is_empty,
418445
)
@@ -424,11 +451,16 @@ def _get_description(self) -> str:
424451
class UnsupportedAlert(Alert):
425452
def __init__(
426453
self,
427-
values: Optional[Dict] = {},
454+
values: Optional[Dict] = None,
428455
column_name: Optional[str] = None,
429456
is_empty: bool = False,
430457
):
431-
super().__init__(AlertType.UNSUPPORTED, values, column_name, set(), is_empty)
458+
super().__init__(
459+
alert_type=AlertType.UNSUPPORTED,
460+
values=values,
461+
column_name=column_name,
462+
is_empty=is_empty,
463+
)
432464

433465
def _get_description(self) -> str:
434466
return f"[{self.column_name}] is an unsupported type, check if it needs cleaning or further analysis"
@@ -437,14 +469,14 @@ def _get_description(self) -> str:
437469
class ZerosAlert(Alert):
438470
def __init__(
439471
self,
440-
values: Optional[Dict] = {},
472+
values: Optional[Dict] = None,
441473
column_name: Optional[str] = None,
442474
is_empty: bool = False,
443475
):
444476
super().__init__(
445-
AlertType.ZEROS,
446-
values,
447-
column_name,
477+
alert_type=AlertType.ZEROS,
478+
values=values,
479+
column_name=column_name,
448480
fields={"n_zeros", "p_zeros"},
449481
is_empty=is_empty,
450482
)
@@ -459,11 +491,16 @@ def _get_description(self) -> str:
459491
class RejectedAlert(Alert):
460492
def __init__(
461493
self,
462-
values: Optional[Dict] = {},
494+
values: Optional[Dict] = None,
463495
column_name: Optional[str] = None,
464496
is_empty: bool = False,
465497
):
466-
super().__init__(AlertType.REJECTED, values, column_name, set(), is_empty)
498+
super().__init__(
499+
alert_type=AlertType.REJECTED,
500+
values=values,
501+
column_name=column_name,
502+
is_empty=is_empty,
503+
)
467504

468505
def _get_description(self) -> str:
469506
return f"[{self.column_name}] was rejected"

0 commit comments

Comments
 (0)