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
|
required |
quality_df
|
Optional[DataFrame]
|
DataFrame with [date, shift, ok_parts, nok_parts, quality_pct]
— e.g. from |
None
|
downtime_df
|
Optional[DataFrame]
|
DataFrame with [date, shift, availability_pct, downtime_minutes]
— e.g. from |
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:
-
From raw signals (provide UUIDs):
highlight_issues('prod', 'ok', 'nok', 'state', thresholds={...}) -
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'. |