AI-powered predictive maintenance platform for industrial assets.
The adapter layer. Every dataset — a NASA benchmark, a customer's historian export — lands in one canonical schema, and nothing downstream can tell which is which.
pip install pandas numpy pyyaml pyarrow
python scripts/make_sample_data.py # stand-in data
python -m pdm.cli list
python -m pdm.cli ingest --dataset cmapss --raw data/raw/cmapss --out data/canonical
python -m pdm.cli ingest --dataset generic_csv --raw data/raw/acme_pumps --out data/canonicalasset_id · timestamp · channel · value · unit · quality
Plus an asset registry (class, criticality, redundancy, bearing geometry) and an event log (failures, maintenance, inspections). Bearing geometry lives in the registry because without it you cannot compute BPFO/BPFI, and without those you cannot name a fault mode — only report that a number moved.
pdm/
schema.py canonical contract + validation. Adapters fail here, loudly
store.py parquet, or CSV when no engine is installed
quality.py stuck sensors, dropouts, constant channels, irregular sampling
cli.py ingest entrypoint
adapters/
base.py Adapter ABC + registry
cmapss.py NASA turbofan, 26-column whitespace format
generic_csv.py customer export driven by mapping.yaml
scripts/
make_sample_data.py generates both formats so this runs before you download anything
Download the Turbofan Engine Degradation Simulation Data Set from the NASA PCoE
repository, unzip into data/raw/cmapss/, and rerun the same command. No code
changes. That is the whole point of the boundary.
Drop their CSVs in a directory with a mapping.yaml:
dataset: acme_pumps
site: acme_plant_2
asset_class: pump
timestamp_column: Timestamp
asset_column: TagPrefix
channels:
PUMP_DE_VIB_MMS: {name: drive_end_velocity, unit: mm_s}
PUMP_BRG_TEMP_C: {name: bearing_temp, unit: degC}No code changes. A mapping file is a sales artifact, not an engineering ticket — that difference is what makes a two-week deployment possible.
No if dataset == "..." anywhere outside adapters/. If that branch appears,
you are building three demos instead of one product. Enforce it in review.
Rolling z-score and EWMA baselines, then PCA T²/SPE, then an autoencoder only if it beats them. Expanding-window splits. False alarms per asset-month at a fixed budget. Publish the runs where the simple baseline wins.