Factory sensors with failure labels

A year of hourly sensor readings from six machines, with the degradation stage, remaining useful life, and the failures and work orders they lead to.

Six machines monitored hourly for a year: vibration, bearing temperature, motor current, pressure and speed, with the machine's degradation stage, its remaining useful life, and a label for failure within 24 hours. Failures and the work orders that repair them are linked back to the readings.

  • predictive maintenance
  • IoT
  • sensor data
  • remaining useful life
  • time series
  • machine learning
02,5005,000Sep 2025Nov 2025Jan 2026Mar 2026May 2026Jul 2026Aug 2026
Rows per month in sensor_readings.recorded_at, counted from the file.

Explore

Every table, profiled

Each column's type, spread, empties and most common values, measured from the CSVs in the download. Switch to the first rows to see the data exactly as it sits in the file.

sensor_readings.csv

52,560 rows · 13 columns · 1 foreign keys

reading_idprimary key
unique on every row
52,560 distinctno empties
asset_idforeign key
points to assets.asset_id
6 distinctno empties
recorded_atdate
Sep 2025Aug 2026
2025-09-01 to 2026-08-31no empties
operating_modecategory
  • normal
    75%
  • idle
    19%
  • high
    5.4%
  • stopped
    1.2%
4 valuesno empties
vibration_mm_snumber
09.13
mean 2.67median 2.270 to 12.091.7% empty
bearing_temp_cnumber
20.496.7
mean 55.05median 55-16.5 to 119.51.5% empty
motor_current_anumber
065.6
mean 33.16median 34.10 to 87.21.4% empty
discharge_pressure_barnumber
07.41
mean 6.04median 6.180 to 12.941.1% empty
rotor_speed_rpmnumber
01,653
mean 1,492.8median 1,4980 to 3,1271.4% empty
degradation_stagecategory
  • healthy
    57%
  • degrading
    27%
  • critical
    15%
  • stopped
    1.2%
4 valuesno empties
rul_hoursnumber
6.972,548.2
mean 709.9median 616.71.04 to 2,785.612% empty
failure_next_24hyes / no
true · 1.7%false · 98%
no empties
next_failure_modecategory
  • seal_leak
    28%
  • bearing_wear
    28%
  • electrical_fault
    18%
  • overheating
    15%
  • imbalance
    10%
5 values98% empty

Keys

Every join resolves

4 foreign keys, 52,668 references checked against the table each one points at. None points at a row that does not exist.

assets

  • site_idsites.site_id0 orphans

failure_events

  • asset_idassets.asset_id0 orphans

sensor_readings

  • asset_idassets.asset_id0 orphans

work_orders

  • asset_idassets.asset_id0 orphans

Checks

What we checked

  • 4 foreign-key relationships checked, 0 orphaned rows
  • No row is dated before the row it belongs to
  • 52,560 hourly readings from 6 machines; 1.7% are labelled as failing within 24 hours
  • 39 failures; in the 72 hours before 39 of them the machine had already left the healthy state
  • Remaining useful life counts down by one hour per reading in 100% of consecutive readings (it resets at a repair)
  • 63 work orders, 63 of them closed on or after they opened

The same checks ship in the zip as INTEGRITY.txt, so you can rerun them in any SQL engine. How we verify

Questions, answered

Worth asking it

Each answer is the query's result on these exact files. Open one for its SQL and rows, then check your own query against it.

  1. 1How early can a model flag a failure using vibration and temperature alone?Vibration averages 2.57 mm/s over a week out and 4.45 mm/s in the last 24 hours.
    -- Running readings only, by hours left before the next failure.
    select case when rul_hours <= 24 then '0-24 h'
                when rul_hours <= 72 then '25-72 h'
                when rul_hours <= 168 then '73-168 h'
                else 'over 168 h' end as hours_to_failure,
           count(*) as readings,
           round(avg(vibration_mm_s), 2) as avg_vibration_mm_s,
           round(avg(bearing_temp_c), 1) as avg_bearing_temp_c
    from sensor_readings
    where operating_mode <> 'stopped' and rul_hours is not null
    group by 1
    order by min(rul_hours)
    hours_to_failurereadingsavg_vibration_mm_savg_bearing_temp_c
    0-24 h8974.4562.2
    25-72 h1,8684.2160.9
    73-168 h3,7353.8759.5
    over 168 h39,9422.5753.5
  2. 2Does remaining useful life fall faster for some failure modes?seal_leak comes soonest after a repair (1,202 h on average), bearing_wear latest (1,340 h).
    select failure_mode,
           count(*) as failures,
           round(avg(hours_since_last_repair), 0) as avg_hours_between_failures,
           round(min(hours_since_last_repair), 0) as shortest,
           round(max(hours_since_last_repair), 0) as longest
    from failure_events
    where hours_since_last_repair is not null
    group by failure_mode
    order by avg_hours_between_failures
    failure_modefailuresavg_hours_between_failuresshortestlongest
    seal_leak111,2025691,960
    imbalance41,2087991,529
    electrical_fault71,2819401,818
    overheating61,3112833,161
    bearing_wear111,3405982,785
  3. 3How much downtime does each failure mode cost?bearing_wear costs the most downtime: 119 hours over 11 failures.
    select failure_mode,
           count(*) as failures,
           round(sum(downtime_hours), 1) as downtime_hours,
           round(avg(downtime_hours), 1) as avg_downtime_hours
    from failure_events
    group by failure_mode
    order by downtime_hours desc
    failure_modefailuresdowntime_hoursavg_downtime_hours
    bearing_wear1111910.8
    seal_leak11114.110.4
    overheating692.215.4
    electrical_fault768.39.8
    imbalance447.711.9
  4. 4Are preventive work orders placed before or after degradation begins?Preventive work orders opened while the machine was healthy (13), degrading (6), critical (5).
    -- The machine's state in the hour before each work order was opened (the work order itself stops it).
    select w.order_type, r.degradation_stage, count(*) as work_orders
    from work_orders w
    join sensor_readings r
      on r.asset_id = w.asset_id and r.recorded_at = date_trunc('hour', w.opened_at) - interval '1 hour'
    group by w.order_type, r.degradation_stage
    order by w.order_type, work_orders desc
    order_typedegradation_stagework_orders
    correctivestopped34
    correctivecritical5
    preventivehealthy13
    preventivedegrading6
    preventivecritical5

Every query runs on the files in the download as they are. ANSWERS.sql holds all of them; run it in DuckDB from the dataset's folder.

Full version · $15

This sample, or the full Predictive Maintenance Fleet

Two years of sensor readings, failures, repairs and costs for 240 machines. Try its free preview before you decide.

This samplePredictive Maintenance Fleet
Rows52,669179,004
Tables56
Columns4291
FormatsCSVCSV
AuditKeys and the checks listed above68 checks, all listed
LicenceCC0, freeCommercial use, $15 once
Built forpredictive maintenance, IoT, sensor data, remaining useful lifeRemaining useful life (RUL) regression, Survival analysis, Anomaly detection and alarm tuning, Failure mode diagnosis, Maintenance strategy and cost, Dashboards and teaching

Use it

Take it, or make one shaped like yours

Rebuild it byte for byte

The zip includes RECIPE.json: the Studio pack, the overrides and seed 20260921 that made these exact rows.

Your own tables, your own numbers

Describe the data you need in Studio and get connected tables with the totals you state, profiled like this and checked before you download.

The full version, and what goes with it

All premium
  • Vibration through a life that ends in failure

    240 machines at 4 plants, two years

    Two years of sensor readings, failures, repairs and costs for 240 machines

    Answer key

    • failure_mode
    • true_life_days
    • true_failure_at
    • +6 more
    Rows
    179,004
    Tables
    6
    Checks
    68 of 68
    Free preview18-question projectProfile and preview
  • An X-bar chart with the truth underneath: flatness, characteristic 139

    3 plants, 36 CNC machines, six months

    Six months of control charts with the ground truth underneath

    Answer key

    • active_cause_id
    • true_cause_shift_sigma
    • true_tool_wear_sigma
    • +6 more
    Rows
    515,442
    Tables
    15
    Checks
    101 of 101
    Free preview18-question projectProfile and preview
  • QA review of manufacturing batch records, by month

    One oral-solids plant, five systems, two years

    Two years of a pharmaceutical plant's records, from process order to QP release

    Answer key

    • root_cause
    • batch_disposition_outcome
    • conclusion
    • +6 more
    Rows
    661,497
    Tables
    65
    Checks
    133 of 133
    Free previewProfile and preview

Related free datasets

All 12

Fully synthetic. No real person, company or transaction is represented, and no production data was read to make it. CC0: use it anywhere, no attribution needed.