Die Klasse PredictiveMaintenanceAnalyzer
analysiert Sensordaten eines Fahrzeugs, erkennt Anomalien und sagt basierend auf diesen Daten und einem Machine-Learning-Modell zukünftige Defekte voraus. Die Ergebnisse werden in einem strukturierten Format bereitgestellt und können weiterverarbeitet werden.
__init__
)Initialisiert die Klasse und stellt die Verbindung zur MongoDB sowie die Fahrzeug-ID her.
client
(MongoClient
): Die Verbindung zur MongoDB.db_name
(str
): Der Name der Datenbank.vehicle_id
(str
): Die ID des Fahrzeugs, dessen Daten analysiert werden sollen.Die zentrale Methode der Klasse, die:
detect_anomalies
Die Funktion detect_anomalies
identifiziert Anomalien in Sensordaten eines Fahrzeugs basierend auf dem Sensortyp. Sie verwendet das maschinelle Lernverfahren Isolation Forest, um ungewöhnliche Datenpunkte zu erkennen, erstellt Visualisierungen für die erkannten Anomalien und gibt die Ergebnisse in einem strukturierten Dictionary zurück.
sensor_df
(Pandas DataFrame):
sensorType
: Typ des Sensors (z. B. Temperatur, Druck).value
: Der gemessene Wert des Sensors.timestamp
: Zeitstempel der Messung.mileage
: Kilometerstand zum Zeitpunkt der Messung.debug
(bool, optional, Standard: False
):
contamination
(float, optional, Standard: 0.01
):
n_estimators
(int, optional, Standard: 200
):
results
(dict):
anomaly
: Liste von Anomalieergebnissen pro Sensortyp:
sensor_type
: Typ des Sensors.vehicle_id
: ID des Fahrzeugs.anomaly_count
: Anzahl der erkannten Anomalien.anomaly_data
: Liste der anomalen Messungen (Zeit, Wert, Kilometerstand).plot
: Base64-kodiertes Diagramm, das die Sensorwerte und die erkannten Anomalien zeigt.results = {"anomaly": []}
sensor_df['anomaly'] = 0
anomaly_counts = {}
results
speichert die Ergebnisse der Anomalieerkennung.anomaly_counts
zählt die erkannten Anomalien pro Sensortyp.anomaly
wird im DataFrame hinzugefügt, die später Anomalien markiert.for sensor_type in sensor_df['sensorType'].unique():
sensor_subset = sensor_df[sensor_df['sensorType'] == sensor_type]
sensorType
gruppiert.sensor_subset
) erstellt.X_anomaly = sensor_subset[['value']]
anomaly_detector = IsolationForest(n_estimators=n_estimators, contamination=contamination, random_state=42)
anomaly_detector.fit(X_anomaly)
predictions = anomaly_detector.predict(X_anomaly)
value
wird für die Erkennung verwendet.-1
für Anomalien und 1
für normale Daten zurück.sensor_df.loc[sensor_subset.index, 'anomaly'] = pd.Series(predictions, index=sensor_subset.index)
anomaly_count = (sensor_df.loc[sensor_subset.index, 'anomaly'] == -1).sum()
anomaly_counts[sensor_type] = anomaly_count
sensor_df
gespeichert.-1
) werden gezählt und in anomaly_counts
gespeichert.sensor_df['anomaly'] = sensor_df['anomaly'].apply(lambda x: 1 if x == -1 else 0)
-1
(Anomalie) werden in 1
umgewandelt, um die Markierung einfacher zu machen.Für jeden Sensortyp werden die Ergebnisse strukturiert gespeichert:
anomalies = sensor_df[(sensor_df['sensorType'] == sensor_type) & (sensor_df['anomaly'] == 1)]
anomaly_entry = {
"sensor_type": sensor_type,
"vehicle_id": self.vehicle_id,
"anomaly_count": int(count),
"anomaly_data": anomalies[['timestamp', 'value', 'mileage', 'anomaly']].to_dict(orient='records')
}
sensor_type
: Typ des Sensors.anomaly_count
: Anzahl der erkannten Anomalien.anomaly_data
: Detaillierte Informationen über jede Anomalie.Ein Diagramm wird erstellt, das die Sensorwerte und Anomalien darstellt:
fig, ax = plt.subplots(figsize=(14, 6))
ax.plot(sensor_df[sensor_df['sensorType'] == sensor_type]['timestamp'], sensor_df[sensor_df['sensorType'] == sensor_type]['value'], label='Sensorwert')
ax.scatter(anomalies['timestamp'], anomalies['value'], color='red', label='Anomalie', marker='x')
if debug:
plt.show()
debug
aktiviert ist, wird das Diagramm angezeigt.Das Diagramm wird als Base64-kodierter String gespeichert:
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
anomaly_entry["plot"] = base64.b64encode(buf.getvalue()).decode('utf-8')
Die Ergebnisse werden im Dictionary results
gespeichert und zurückgegeben:
results["anomaly"].append(anomaly_entry)
return results
sensorType
.{
"anomaly": [
{
"sensor_type": "temperature",
"vehicle_id": "V001",
"anomaly_count": 5,
"anomaly_data": [
{ "timestamp": "2024-01-01T12:00:00", "value": 150, "mileage": 12000, "anomaly": 1 },
{ "timestamp": "2024-01-01T12:05:00", "value": 170, "mileage": 12010, "anomaly": 1 }
],
"plot": "<Base64-kodiertes Diagramm>"
}
]
}
anomalies = analyzer.detect_anomalies(sensor_df, debug=True)
print(anomalies)
contamination
, n_estimators
).NaN
) verbessern.contamination
-Parameters basierend auf den Daten.detect_anomalies_thresholds
Die Funktion detect_anomalies_thresholds
dient zur Erkennung von Anomalien in Sensordaten basierend auf vordefinierten oberen und unteren Grenzwerten. Die Grenzwerte können entweder als Parameter übergeben oder aus einer MongoDB-Datenbank abgerufen werden. Die Methode markiert Anomalien im DataFrame und gibt die Ergebnisse in strukturierter Form zurück.
sensor_df
(Pandas DataFrame):
sensorType
: Der Typ des Sensors (z. B. Temperatur, Druck).value
: Der gemessene Wert des Sensors.timestamp
, mileage
für zusätzliche Informationen.sensor_thresholds
(dict):
{
"sensorType1": {"min": min_value, "max": max_value},
"sensorType2": {"min": min_value, "max": max_value}
}
{
"temperature": {"min": -20, "max": 120},
"pressure": {"min": 0, "max": 300}
}
Ein Dictionary mit den Anomalieergebnissen:
anomaly_threshold
(list of dict):
sensor_type
: Der Sensortyp (z. B. Temperatur).vehicle_id
: Die ID des Fahrzeugs.anomaly_count
: Die Anzahl der erkannten Anomalien.anomaly_data
: Eine Liste von Anomaliedatensätzen (Zeit, Wert, Kilometerstand, Anomalie-Markierung).if sensor_thresholds is None:
vehicle_data = self.db["vehicles"].find_one({"vehicleId": self.vehicle_id}, {"_id": 0, "sensorGroup": 1})
if "sensorGroup" in vehicle_data:
sensor_group = vehicle_data["sensorGroup"]
threshold_data = self.db["sensorGroups"].find_one({"sensorGroup": sensor_group}, {"_id": 0, "sensorTypes": 1})
if threshold_data is not None:
sensor_thresholds = threshold_data["sensorTypes"]
if sensor_thresholds is None:
sensor_thresholds = {
"io58": {"min": 0, "max": 120}, # Standardgrenzwerte
"io32": {"min": 0, "max": 120},
"io66": {"min": 13000, "max": 30000}
}
sensor_thresholds
nicht übergeben wird:
sensorGroup
des Fahrzeugs wird aus der MongoDB-Collection vehicles
abgerufen.sensorThresholds
geladen.sensor_df["anomaly_threshold"] = 0
anomaly_threshold_counts = {}
anomaly_threshold
wird im DataFrame hinzugefügt. Diese markiert Anomalien:
1
: Wert liegt außerhalb der Grenzwerte (Anomalie).0
: Wert liegt innerhalb der Grenzwerte (kein Problem).anomaly_threshold_counts
wird erstellt, um die Anzahl der Anomalien pro Sensortyp zu speichern.for sensor_type, thresholds in sensor_thresholds.items():
min_value = thresholds["min"]
max_value = thresholds["max"]
is_anomaly = (sensor_df["sensorType"] == sensor_type) & (
(sensor_df["value"] < min_value) | (sensor_df["value"] > max_value)
)
sensor_df.loc[is_anomaly, "anomaly_threshold"] = 1
sensorType
werden die Grenzwerte (min_value
, max_value
) geladen.< min_value
oder > max_value
werden als Anomalien markiert.sensor_df
) in der Spalte anomaly_threshold
gespeichert.anomaly_threshold_count = (
sensor_df.loc[sensor_df['sensorType'] == sensor_type, 'anomaly_threshold'] == 1).sum()
anomaly_threshold_counts[sensor_type] = anomaly_threshold_count
anomaly_threshold_counts
gespeichert.Für jeden Sensortyp wird ein Eintrag in den Ergebnissen erstellt:
anomalies = sensor_df[(sensor_df['sensorType'] == sensor_type) & (sensor_df['anomaly_threshold'] == 1)]
anomaly_threshold_entry = {
"sensor_type": sensor_type,
"vehicle_id": self.vehicle_id,
"anomaly_count": int(count),
"anomaly_data": anomalies[['timestamp', 'value', 'mileage', 'anomaly_threshold']].to_dict(orient='records')
}
results["anomaly_threshold"].append(anomaly_threshold_entry)
return results
results
mit den Anomalien zurück.| sensorType | value | timestamp | mileage | |————-|——-|———————|———| | temperature | 150 | 2024-01-01 12:00:00 | 12000 | | pressure | 350 | 2024-01-01 12:01:00 | 12010 | | temperature | 100 | 2024-01-01 12:02:00 | 12020 |
{
"temperature": {"min": -20, "max": 120},
"pressure": {"min": 0, "max": 300}
}
{
"anomaly_threshold": [
{
"sensor_type": "temperature",
"vehicle_id": "V001",
"anomaly_count": 1,
"anomaly_data": [
{ "timestamp": "2024-01-01T12:00:00", "value": 150, "mileage": 12000, "anomaly_threshold": 1 }
]
},
{
"sensor_type": "pressure",
"vehicle_id": "V001",
"anomaly_count": 1,
"anomaly_data": [
{ "timestamp": "2024-01-01T12:01:00", "value": 350, "mileage": 12010, "anomaly_threshold": 1 }
]
}
]
}
Die Funktion detect_anomalies_thresholds
ist ein effektives Werkzeug zur Überprüfung von Sensordaten auf Basis vordefinierter Grenzwerte. Sie ist flexibel, da die Grenzwerte entweder als Parameter übergeben oder dynamisch aus der MongoDB geladen werden können. Die Ergebnisse werden strukturiert bereitgestellt und können für weitere Analysen verwendet werden.
Die Klasse PredictiveMaintenanceAnalyzer
bietet ein leistungsstarkes Werkzeug für die Überwachung und Analyse von Fahrzeugdaten. Durch die Kombination von Anomalieerkennung und maschinellem Lernen liefert sie präzise Vorhersagen, die in Wartungssysteme integriert werden können. Die klare Trennung von Datenverarbeitung, Modellierung und Ergebnisausgabe macht die Klasse flexibel und anpassungsfähig.
—‚
Autor: Jörg Harzmann
Dieser Inhalt ist unter einer CC BY-NC Lizenz veröffentlicht. Jeglicher Quellcode ist urheberrechtlich geschützt!