Skip to content

shift_handover

shift_handover ¤

Automated shift handover report generation.

Standardize shift-to-shift communication: - Production summary - Quality summary - Downtime summary - Issues to watch

Two modes of operation: 1. From raw signals: generate_report(counter_uuid, ok_counter_uuid, ...) 2. From pre-computed DataFrames: from_shift_data(production_df, quality_df, downtime_df)

ShiftHandoverReport ¤

ShiftHandoverReport(
    dataframe: DataFrame,
    *,
    time_column: str = "systime",
    shift_definitions: Optional[
        Dict[str, tuple[str, str]]
    ] = None
)

Bases: Base

Generate automated shift handover reports.

Combines production, quality, and downtime data into a single summary suitable for shift handover meetings.

Merge keys: [date, shift] — the report output is keyed on these columns.

Two usage patterns:

Pattern A — from raw signals (one-step):

report = ShiftHandoverReport(df)
result = report.generate_report(
    counter_uuid='prod', ok_counter_uuid='ok',
    nok_counter_uuid='nok', state_uuid='state',
    targets={'shift_1': 450, 'shift_2': 450},
)

Pattern B — pipeline (compose from upstream modules):

# Step 1: compute upstream DataFrames
prod   = ShiftReporting(df).shift_production('counter')
qual   = QualityTracking(df).nok_by_shift('ok', 'nok')
downtime = DowntimeTracking(df).downtime_by_shift('state')

# Step 2: assemble into handover report
result = ShiftHandoverReport.from_shift_data(
    production_df=prod,
    quality_df=qual,
    downtime_df=downtime,
    targets={'shift_1': 450, 'shift_2': 450},
)

Both patterns return the same output schema.

from_shift_data staticmethod ¤

from_shift_data(
    production_df: DataFrame,
    quality_df: Optional[DataFrame] = None,
    downtime_df: Optional[DataFrame] = None,
    *,
    targets: Optional[Dict[str, float]] = None,
    report_date: Optional[str] = None
) -> pd.DataFrame

Build a handover report from pre-computed shift-level DataFrames.

This is the pipeline-friendly entry-point. Instead of reading raw signals, it accepts DataFrames that were already computed by upstream modules (ShiftReporting, QualityTracking, DowntimeTracking, etc.).

Parameters:

Name Type Description Default
production_df DataFrame

DataFrame with [date, shift, quantity] — e.g. from ShiftReporting.shift_production().

required
quality_df Optional[DataFrame]

DataFrame with [date, shift, ok_parts, nok_parts, quality_pct] — e.g. from QualityTracking.nok_by_shift(). Optional.

None
downtime_df Optional[DataFrame]

DataFrame with [date, shift, availability_pct, downtime_minutes] — e.g. from DowntimeTracking.downtime_by_shift(). Optional.

None
targets Optional[Dict[str, float]]

Per-shift production targets (dict).

None
report_date Optional[str]

Specific date (YYYY-MM-DD). If None, uses latest.

None

Returns:

Type Description
DataFrame

DataFrame with columns:

DataFrame

date, shift, production, production_target, production_achievement_pct,

DataFrame

ok_parts, nok_parts, quality_pct, availability_pct, downtime_minutes

generate_report ¤

generate_report(
    counter_uuid: str,
    ok_counter_uuid: str,
    nok_counter_uuid: str,
    state_uuid: str,
    *,
    targets: Optional[Dict[str, float]] = None,
    quality_target_pct: float = 98.0,
    availability_target_pct: float = 90.0,
    running_value: str = "Running",
    value_column_counter: str = "value_integer",
    value_column_state: str = "value_string",
    report_date: Optional[str] = None
) -> pd.DataFrame

Generate a shift handover report from raw timeseries signals.

For pipeline usage with pre-computed DataFrames, use :meth:from_shift_data instead.

Parameters:

Name Type Description Default
counter_uuid str

UUID of production counter.

required
ok_counter_uuid str

UUID of good parts counter.

required
nok_counter_uuid str

UUID of defective parts counter.

required
state_uuid str

UUID of machine state signal.

required
targets Optional[Dict[str, float]]

Per-shift production targets.

None
quality_target_pct float

Quality target percentage.

98.0
availability_target_pct float

Availability target percentage.

90.0
running_value str

Value indicating machine is running.

'Running'
value_column_counter str

Column for counter values.

'value_integer'
value_column_state str

Column for state values.

'value_string'
report_date Optional[str]

Specific date (YYYY-MM-DD). If None, uses latest date.

None

Returns:

Type Description
DataFrame

DataFrame with columns:

DataFrame

date, shift, production, production_target, production_achievement_pct,

DataFrame

ok_parts, nok_parts, quality_pct, availability_pct, downtime_minutes

highlight_issues ¤

highlight_issues(
    counter_uuid: Optional[str] = None,
    ok_counter_uuid: Optional[str] = None,
    nok_counter_uuid: Optional[str] = None,
    state_uuid: Optional[str] = None,
    *,
    report_df: Optional[DataFrame] = None,
    thresholds: Optional[Dict[str, float]] = None,
    targets: Optional[Dict[str, float]] = None,
    running_value: str = "Running",
    value_column_counter: str = "value_integer",
    value_column_state: str = "value_string",
    report_date: Optional[str] = None
) -> List[Dict[str, str]]

Identify issues that need attention.

Can be called in two ways:

  1. From raw signals (provide UUIDs): highlight_issues('prod', 'ok', 'nok', 'state', thresholds={...})

  2. From a pre-built report DataFrame: highlight_issues(report_df=my_report, thresholds={...})

Parameters:

Name Type Description Default
counter_uuid Optional[str]

UUID of production counter (raw-signal mode).

None
ok_counter_uuid Optional[str]

UUID of good parts counter (raw-signal mode).

None
nok_counter_uuid Optional[str]

UUID of defective parts counter (raw-signal mode).

None
state_uuid Optional[str]

UUID of machine state signal (raw-signal mode).

None
report_df Optional[DataFrame]

Pre-computed report DataFrame (pipeline mode). If provided, UUID arguments are ignored.

None
thresholds Optional[Dict[str, float]]

Minimum acceptable values for each metric. Defaults to production_achievement_pct=95, quality_pct=98, availability_pct=90.

None
targets Optional[Dict[str, float]]

Per-shift production targets.

None
running_value str

Value indicating machine is running.

'Running'
value_column_counter str

Column for counter values.

'value_integer'
value_column_state str

Column for state values.

'value_string'
report_date Optional[str]

Specific date (YYYY-MM-DD).

None

Returns:

Type Description
List[Dict[str, str]]

List of dicts with keys: shift, metric, value, threshold, severity.

List[Dict[str, str]]

severity is 'warning' (within 5% of threshold) or 'critical'.