File size: 1,434 Bytes
5143557
 
 
 
 
 
eed1cab
5143557
 
 
 
 
 
 
 
 
eed1cab
5143557
 
 
 
 
 
 
eed1cab
5143557
 
eed1cab
5143557
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
"""Deterministic repairer for decimal-shift issues."""

from __future__ import annotations

from dataforge.detectors.base import Issue, Schema
from dataforge.repairers.base import ProposedFix, RetryContext
from dataforge.table import TableLike, cell_value, column_names, row_count
from dataforge.transactions.txn import CellFix


class DecimalShiftRepairer:
    """Repair decimal-shift issues using the detector's expected value."""

    def propose(
        self,
        issue: Issue,
        df: TableLike,
        schema: Schema | None,
        retry_context: RetryContext | None = None,
    ) -> ProposedFix | None:
        """Return a deterministic fix for a decimal-shift issue."""
        del schema, retry_context
        if issue.issue_type != "decimal_shift" or issue.expected is None:
            return None
        if issue.row >= row_count(df) or issue.column not in column_names(df):
            return None

        old_value = cell_value(df, issue.row, issue.column)
        if old_value == issue.expected:
            return None

        return ProposedFix(
            fix=CellFix(
                row=issue.row,
                column=issue.column,
                old_value=old_value,
                new_value=issue.expected,
                detector_id="decimal_shift",
            ),
            reason=issue.reason,
            confidence=issue.confidence,
            provenance="deterministic",
        )