| @@ 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 | ||