Machine Sensor Readings (IoT) dataset
10-minute readings from factory machines that slowly wear out, warn and fail: predictive maintenance practice.
About this dataset
Readings every ten minutes from machines on a fictional factory floor, starting 1 January 2026: temperature, vibration, pressure and RPM, with a status of Normal, Warning, Fault or Stopped.
Every so often a machine starts to wear out. Over the next several hours its vibration and temperature climb, pressure and speed drop, it raises warnings and finally faults, and then it is stopped for repair before going back to normal. Spotting that drift early is what predictive maintenance is about.
Good for practising: Anomaly detection, Time series, Rolling features, Classification.
What's built into the data
The rows are random, but they follow rules, so there is something real to find. These are the patterns to look for:
- Wear-outs start at random and last about 6 to 15 hours (36–90 readings) before the fault.
- Vibration rises fastest near the end; temperature climbs steadily; pressure and RPM sag.
- After a fault the machine shows 'Stopped' with RPM 0 for 1–3 hours, then resets to normal.
- Faults are rare compared with normal readings, so the data is very imbalanced.
Columns
| Column | Type | Description |
|---|---|---|
reading_id | ID (number) | Row number. |
timestamp | Date & time | Time of the reading (every 10 minutes). |
machine_id | Category | Machine M-01 to M-10. |
temperature_c | Decimal | Bearing temperature, °C. |
vibration_mm_s | Decimal | Vibration velocity, mm/s. |
pressure_bar | Decimal | Hydraulic pressure, bar. |
rpm | Whole number | Motor speed; 0 while stopped. |
status | Category | Normal, Warning, Fault or Stopped. |
Preview: the first 8 rows
A sample with seed 2026. Your download will have different values but the same columns and patterns.
| reading_id | timestamp | machine_id | temperature_c | vibration_mm_s | pressure_bar | rpm | status |
|---|---|---|---|---|---|---|---|
| 1 | 2026-01-01 00:00 | M-01 | 58.05 | 2.383 | 5.79 | 1493 | Normal |
| 2 | 2026-01-01 00:00 | M-02 | 61.11 | 2.587 | 5.99 | 1450 | Normal |
| 3 | 2026-01-01 00:10 | M-01 | 58.83 | 2.312 | 6.25 | 1501 | Normal |
| 4 | 2026-01-01 00:10 | M-02 | 62.7 | 2.794 | 5.74 | 1474 | Normal |
| 5 | 2026-01-01 00:20 | M-01 | 57.54 | 2.492 | 5.88 | 1490 | Normal |
| 6 | 2026-01-01 00:20 | M-02 | 62.22 | 2.611 | 6.11 | 1458 | Normal |
| 7 | 2026-01-01 00:30 | M-01 | 58.11 | 2.654 | 5.91 | 1506 | Normal |
| 8 | 2026-01-01 00:30 | M-02 | 64.36 | 2.763 | 6.08 | 1443 | Normal |
Practice exercises
- Plot vibration and temperature for one machine and shade the Warning and Fault periods.
- Add rolling features (1-hour mean and slope of vibration) and see how early they rise before a fault.
- Label each reading 'fails within the next 6 hours: yes/no' and train a classifier on the rolling features.
- Try an unsupervised method (z-score or Isolation Forest) on normal readings only and see what it flags.
- Work out mean time between failures and mean repair time per machine.
Stuck on one? Each exercise uses ideas from the lessons below, and trying it with the messy option on turns it into a cleaning exercise as well.
Load it straight into Python
You don't have to download first. Pandas can read the link directly, in Jupyter, Google Colab or a script. Keep the seed so you get the same data every time you run the notebook:
import pandas as pd
url = "https://beeprotonai.info/resources/datasets/machine-sensors/download/?rows=1000&seed=42"
df = pd.read_csv(url, parse_dates=["timestamp"])
df.head()
For SQL practice, download the SQL format and run it against an empty database, for example sqlite3 practice.db < machine-sensors-1000-rows-seed42.sql or mysql -u root -p practice < machine-sensors-1000-rows-seed42.sql (use your file's name). It creates a table called machine_sensors and fills it.
About the data
Everything in this file is invented. Names are random pairings of common first names and surnames, email addresses use example.com (reserved for examples, so it can never reach anyone), and phone numbers start with +91 00, which no real Indian mobile number does. Any resemblance to a real person or business is coincidence. Dates run from 1 April 2024 to 31 March 2026 unless a column says otherwise. Use it freely for learning, teaching and projects, including commercial ones, with no attribution required (CC0).
Lessons that go with it
More datasets
Two years of orders from a fictional chain of Indian sweet shops, with Diwali …
Employee & Attrition RecordsAn HR file of employees with salary, satisfaction, overtime and whether they left: built …
Student Exam ResultsMarks in five subjects with attendance and study hours, plus totals, percentage, result and …
Customer List (CRM)Customer records with contact details, segment, orders and spend: ideal for cleaning, deduplication and …
Stock Register (Inventory)Monthly stock register for five warehouses: opening, received, issued, closing, reorder level and value.
Website Traffic (Analytics)Daily sessions, users, bounce rate and conversions by page, traffic source and device.