Code Duplication    Length = 56-60 lines in 3 locations

src/egon/data/validation/rules/custom/sanity/gas_grid.py 3 locations

@@ 401-460 (lines=60) @@
398
        AND {combined_condition}
399
        """
400
401
    def evaluate_df(self, df, ctx):
402
        """
403
        Evaluate one-port component connections.
404
405
        Parameters
406
        ----------
407
        df : pd.DataFrame
408
            DataFrame with disconnected components (component_id, bus, carrier)
409
        ctx : dict
410
            Context information
411
412
        Returns
413
        -------
414
        RuleResult
415
            Validation result with success/failure status
416
        """
417
        # Filter out NULL rows
418
        df = df.dropna()
419
420
        disconnected_count = len(df)
421
422
        if disconnected_count == 0:
423
            return RuleResult(
424
                rule_id=self.rule_id,
425
                task=self.task,
426
                table=self.table,
427
                kind=self.kind,
428
                success=True,
429
                observed=0,
430
                expected=0,
431
                message=(
432
                    f"All {self.component_carrier} {self.component_type}s connected "
433
                    f"to valid buses for {self.scenario}"
434
                ),
435
                severity=Severity.INFO,
436
                schema=self.schema,
437
                table_name=self.table_name,
438
                rule_class=self.__class__.__name__
439
            )
440
        else:
441
            # Show sample of disconnected components (first 5)
442
            sample_components = df.head(5).to_dict(orient='records')
443
444
            return RuleResult(
445
                rule_id=self.rule_id,
446
                task=self.task,
447
                table=self.table,
448
                kind=self.kind,
449
                success=False,
450
                observed=disconnected_count,
451
                expected=0,
452
                message=(
453
                    f"Found {disconnected_count} disconnected {self.component_carrier} "
454
                    f"{self.component_type}s for {self.scenario}. "
455
                    f"Sample (first 5): {sample_components}"
456
                ),
457
                severity=Severity.ERROR,
458
                schema=self.schema,
459
                table_name=self.table_name,
460
                rule_class=self.__class__.__name__
461
            )
462
463
@@ 96-154 (lines=59) @@
93
        )
94
        """
95
96
    def evaluate_df(self, df, ctx):
97
        """
98
        Evaluate isolated buses.
99
100
        Parameters
101
        ----------
102
        df : pd.DataFrame
103
            DataFrame with isolated buses (bus_id, carrier, country)
104
        ctx : dict
105
            Context information
106
107
        Returns
108
        -------
109
        RuleResult
110
            Validation result with success/failure status
111
        """
112
        # Filter out NULL rows from unsupported scenarios
113
        df = df.dropna()
114
115
        isolated_count = len(df)
116
117
        if isolated_count == 0:
118
            return RuleResult(
119
                rule_id=self.rule_id,
120
                task=self.task,
121
                table=self.table,
122
                kind=self.kind,
123
                success=True,
124
                observed=0,
125
                expected=0,
126
                message=(
127
                    f"No isolated {self.carrier} buses found for {self.scenario} "
128
                    f"(all buses connected to grid)"
129
                ),
130
                severity=Severity.INFO,
131
                schema=self.schema,
132
                table_name=self.table_name,
133
                rule_class=self.__class__.__name__
134
            )
135
        else:
136
            # Show sample of isolated buses (first 5)
137
            sample_buses = df.head(5).to_dict(orient='records')
138
139
            return RuleResult(
140
                rule_id=self.rule_id,
141
                task=self.task,
142
                table=self.table,
143
                kind=self.kind,
144
                success=False,
145
                observed=isolated_count,
146
                expected=0,
147
                message=(
148
                    f"Found {isolated_count} isolated {self.carrier} buses for {self.scenario}. "
149
                    f"Sample (first 5): {sample_buses}"
150
                ),
151
                severity=Severity.ERROR,
152
                schema=self.schema,
153
                table_name=self.table_name,
154
                rule_class=self.__class__.__name__
155
            )
156
157
@@ 752-807 (lines=56) @@
749
        )
750
        """
751
752
    def evaluate_df(self, df, ctx):
753
        """
754
        Evaluate link connections.
755
756
        Parameters
757
        ----------
758
        df : pd.DataFrame
759
            DataFrame with links that have missing buses
760
        ctx : dict
761
            Context information
762
763
        Returns
764
        -------
765
        RuleResult
766
            Validation result with success/failure status
767
        """
768
        disconnected_count = len(df)
769
770
        if disconnected_count == 0:
771
            return RuleResult(
772
                rule_id=self.rule_id,
773
                task=self.task,
774
                table=self.table,
775
                kind=self.kind,
776
                success=True,
777
                observed=0,
778
                expected=0,
779
                message=(
780
                    f"All {self.carrier} links connected to valid buses for {self.scenario}"
781
                ),
782
                severity=Severity.INFO,
783
                schema=self.schema,
784
                table_name=self.table_name,
785
                rule_class=self.__class__.__name__
786
            )
787
        else:
788
            # Show sample of disconnected links (first 5)
789
            sample_links = df.head(5).to_dict(orient='records')
790
791
            return RuleResult(
792
                rule_id=self.rule_id,
793
                task=self.task,
794
                table=self.table,
795
                kind=self.kind,
796
                success=False,
797
                observed=disconnected_count,
798
                expected=0,
799
                message=(
800
                    f"Found {disconnected_count} disconnected {self.carrier} links "
801
                    f"for {self.scenario}. "
802
                    f"Sample (first 5): {sample_links}"
803
                ),
804
                severity=Severity.ERROR,
805
                schema=self.schema,
806
                table_name=self.table_name,
807
                rule_class=self.__class__.__name__
808
            )
809