AC02-ML / api /README.md
deropxyz's picture
init
03bcd34
# Predictive Maintenance FastAPI
## 🚀 Quick Start
### 1. Install Dependencies
```bash
pip install -r requirements.txt
```
### 2. Run API Server
```bash
# Development mode with auto-reload
python main.py
# Or using uvicorn directly
uvicorn main:app --reload --host 0.0.0.0 --port 8000
```
### 3. Access API
- **HTML Test Interface**: Open `index.html` in browser (recommended for testing)
- **Interactive Docs**: http://localhost:8000/docs
- **ReDoc**: http://localhost:8000/redoc
- **Health Check**: http://localhost:8000/health
### 4. Quick Testing (Windows)
```bash
# Install dependencies
install_requirements.bat
# Start server
start_server.bat
# Open test interface
open_test_interface.bat
```
---
## 📡 API Endpoints
### 1. Single Prediction: `POST /predict`
**Request Body:**
```json
{
"machine_id": "M_L_01",
"air_temperature": 298.1,
"process_temperature": 308.6,
"rotational_speed": 1551,
"torque": 42.8,
"tool_wear": 0,
"type": "M"
}
```
**Response (Enhanced with Features & Anomaly Detection):**
```json
{
"machine_id": "M_L_01",
"timestamp": "2024-11-26T10:30:00.123456",
"prediction": "HEALTHY",
"confidence": 0.9234,
"diagnostics": {
"primary_cause": "Normal Operation",
"sensor_alert": "All parameters within optimal range. Health score: 100%.",
"recommended_action": "CONTINUE NORMAL OPERATION. Next scheduled maintenance as planned.",
"severity": "LOW"
},
"features": {
"Air_temp_K": 298.1,
"Process_temp_K": 308.6,
"Speed_rpm": 1551,
"Torque_Nm": 42.8,
"Tool_wear_min": 0,
"Tool_wear_hours": 0.0,
"Temperature_Diff": 10.5,
"Power_W": 6951.2,
"Type_Encoded": 1
},
"anomalies": [],
"overall_health": "🟢 EXCELLENT HEALTH - All systems operating optimally within normal parameters."
}
```
### 2. Batch Prediction (CSV Download): `POST /predict/batch`
**Request:**
- Upload CSV file (any size)
- **Flexible CSV Format** - accepts columns with:
- UPPERCASE/lowercase/MixedCase names
- Units in brackets: `air_temperature_[k]`, `Air Temperature [K]`, etc.
- Extra columns (will be ignored)
- Any column order
**Required Columns (flexible naming):**
- `air_temperature` or `air_temperature_[k]`
- `process_temperature` or `process_temperature_[k]`
- `rotational_speed` or `rotational_speed_[rpm]`
- `torque` or `torque_[nm]`
- `tool_wear` or `tool_wear_[min]`
- `type`
- Optional: `machine_id`
**Response:**
- CSV file download with added columns:
- `Prediction`: HEALTHY or FAILURE
- `Confidence`: 0.0 to 1.0
- `Primary_Cause`: Root cause analysis
- `Sensor_Alert`: Specific sensor readings
- `Recommended_Action`: Actionable maintenance advice
- `Severity`: LOW, MEDIUM, HIGH, CRITICAL
- `Processed_At`: Timestamp
### 3. Batch Prediction (JSON for UI): `POST /predict/batch/json`
**Request:**
- Upload CSV file (max 500 rows)
- Same flexible format as `/predict/batch`
**Response:**
```json
{
"summary": {
"total_records": 5,
"predictions": {
"failure": 2,
"healthy": 3,
"errors": 0
},
"failure_rate": 40.0
},
"results": [
{
"row_number": 1,
"machine_id": "M_001",
"prediction": "HEALTHY",
"confidence": 0.9234,
"diagnostics": {...},
"features": {...},
"anomalies": [...],
"overall_health": "🟢 EXCELLENT HEALTH",
"input_data": {...}
}
],
"processed_at": "2024-11-26T10:30:00"
}
```
---
## 🧠 Diagnostic Engine Rules
### Priority 1: CRITICAL
- **Tool Wear > 200 min**: Immediate tool replacement required
### Priority 2: HIGH
- **Power > 9000 W** or **Torque > 60 Nm**: Mechanical overload detected
- **ML Anomaly (Confidence > 80%)**: Unusual pattern detected
### Priority 3: MEDIUM
- **Temperature Diff < 8.0 K at Speed > 1300 RPM**: Cooling system issue
- **Temperature Diff > 15.0 K**: Excessive thermal stress
- **Speed > 2500 RPM**: High-speed operation risk
### Priority 4: LOW
- **All parameters normal**: Continue operation
---
## 🔬 Feature Engineering (Physics-Based)
The API automatically calculates:
1. **Temperature_Diff** = `process_temperature` - `air_temperature`
- Indicates thermal stress
- Optimal range: 8-12 K
2. **Power_W** = `torque` × `rotational_speed` × (2π / 60)
- Mechanical power output
- Safety limit: 9000 W
3. **Type_Encoded** = {L: 0, M: 1, H: 2}
- Machine type categorization
---
## 📊 Example cURL Commands
### Single Prediction
```bash
curl -X POST "http://localhost:8000/predict" \
-H "Content-Type: application/json" \
-d '{
"machine_id": "M_L_01",
"air_temperature": 298.1,
"process_temperature": 308.6,
"rotational_speed": 1551,
"torque": 42.8,
"tool_wear": 0,
"type": "M"
}'
```
### Batch Prediction
```bash
curl -X POST "http://localhost:8000/predict/batch" \
-F "file=@test_data.csv" \
-o predictions_output.csv
```
### Health Check
```bash
curl http://localhost:8000/health
```
### Model Info
```bash
curl http://localhost:8000/model/info
```
---
## 🛠️ Python Client Example
```python
import requests
import pandas as pd
# Single prediction
url = "http://localhost:8000/predict"
data = {
"machine_id": "M_L_01",
"air_temperature": 298.1,
"process_temperature": 308.6,
"rotational_speed": 1551,
"torque": 42.8,
"tool_wear": 0,
"type": "M"
}
response = requests.post(url, json=data)
result = response.json()
print(f"Prediction: {result['prediction']}")
print(f"Confidence: {result['confidence']}")
print(f"Action: {result['diagnostics']['recommended_action']}")
# Batch prediction
url_batch = "http://localhost:8000/predict/batch"
files = {'file': open('test_data.csv', 'rb')}
response = requests.post(url_batch, files=files)
with open('predictions.csv', 'wb') as f:
f.write(response.content)
```
---
## 📂 CSV Format for Batch Processing (FLEXIBLE!)
### ✅ Format 1: Simple (Recommended)
```csv
machine_id,air_temperature,process_temperature,rotational_speed,torque,tool_wear,type
M_L_01,298.1,308.6,1551,42.8,0,M
M_L_02,299.2,310.1,1450,38.5,150,L
M_H_01,297.5,312.8,1800,65.2,220,H
```
### ✅ Format 2: With Units (Dataset Format)
```csv
machine_id,air_temperature_[k],process_temperature_[k],rotational_speed_[rpm],torque_[nm],tool_wear_[min],type
M_L_01,298.1,308.6,1551,42.8,0,M
M_L_02,299.2,310.1,1450,38.5,150,L
```
### ✅ Format 3: Mixed Case with Spaces
```csv
Machine ID,Air Temperature [K],Process Temperature [K],Rotational Speed [RPM],Torque [Nm],Tool Wear [min],TYPE
M_L_01,298.1,308.6,1551,42.8,0,M
```
### ✅ Format 4: Extra Columns (Will be Ignored)
```csv
machine_id,timestamp,air_temperature,process_temperature,rotational_speed,torque,tool_wear,type,location,operator
M_L_01,2024-11-26,298.1,308.6,1551,42.8,0,M,Factory_A,John
```
**All formats above are automatically handled by the API!**
**Output CSV** (additional columns):
```csv
...,Prediction,Confidence,Primary_Cause,Sensor_Alert,Recommended_Action,Severity,Processed_At
...,HEALTHY,0.9234,Normal Operation,All parameters within optimal range...,CONTINUE NORMAL OPERATION...,LOW,2024-11-26T10:30:00
...,HEALTHY,0.8876,Normal Operation,All parameters within optimal range...,CONTINUE NORMAL OPERATION...,LOW,2024-11-26T10:30:01
...,FAILURE,0.9567,Tool End of Life,Tool wear (220 min) exceeds safety threshold...,IMMEDIATE ACTION: Replace cutting tool...,CRITICAL,2024-11-26T10:30:02
```
---
## 🔐 Production Deployment
### Environment Variables
```bash
export MODEL_PATH="/path/to/model_pipeline.joblib"
export API_HOST="0.0.0.0"
export API_PORT="8000"
export LOG_LEVEL="info"
```
### Docker Deployment
```dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```
### Run with Gunicorn (Production)
```bash
pip install gunicorn
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
```
---
## 📈 Performance Metrics
- **Model**: RandomForest Classifier (Optimized with Ensemble)
- **Features**: 9 engineered features (including Tool_wear_hours)
- **F1-Score**: ~75-85% (after optimization)
- **Inference Time**: ~10-20ms per prediction
- **Batch Processing**:
- CSV Download: Unlimited rows
- JSON Response: Max 500 rows (for UI display)
- Throughput: ~100-200 records/second
- **Anomaly Detection**: 7 parameter checks (Real-time)
- **Overall Health Assessment**: 4 levels (EXCELLENT/GOOD/FAIR/POOR)
---
## 🐛 Troubleshooting
### Model Not Loading
```bash
# Check if model file exists
ls ../models/model_pipeline_improved.joblib
ls ../models/model_pipeline.joblib
# Verify model structure
python -c "import joblib; m = joblib.load('../models/model_pipeline.joblib'); print(m.keys())"
```
### CORS Issues
- Already configured for `allow_origins=["*"]`
- Modify in `main.py` if needed for specific domains
### Port Already in Use
```bash
# Change port in main.py or use:
uvicorn main:app --port 8001
```
---
## 📞 API Support
For issues or questions:
1. Check `/health` endpoint for model status
2. Review logs for detailed error messages
3. Validate input data matches schema in `/docs`
---
**Built with FastAPI 🚀 | Production-Ready | ML + Physics-Based Diagnostics**