Verwenden Sie den Knoten "Feld erstellen", der vorhandene Daten aus vorhandenen Daten mithilfe von Funktionen usw. verarbeitet, um Features aus Zeitreihensensordaten zu extrahieren. Und lassen Sie uns den Prozess mit Python-Pandas neu schreiben.
SPSS Modeler stellt Knoten für verschiedene Datenverarbeitungen bereit, aber der Knoten "Felderstellung" ist ein ziemlich universeller Knoten für die Verarbeitung von Daten mit einem hohen Freiheitsgrad.
Sie können das Verarbeitungsmuster aus der Liste "Abgeleitet" auswählen. Eine Ableitung ist schwer vorstellbar, aber es handelt sich um eine englische Übersetzung, die als Ableitung bezeichnet wird. Dies bedeutet ein Verarbeitungsmuster, das durch Ableiten aus den Originaldaten erstellt wird. Ich werde in der Reihenfolge des persönlichen Gebrauchs erklären.
Beide Prozessdatensätze von oben nach unten. Insbesondere für Zähl- und Zustandstypen ist es wichtig, die Verarbeitungsreihenfolge von Datensätzen zu kennen.
Da es sich um einen Allzweckknoten handelt, können verschiedene Verarbeitungen in Betracht gezogen werden. Dieses Mal werde ich ihn jedoch zum Extrahieren von Merkmalsmengen aus Zeitreihensensordaten verwenden.
Da die Zeitreihensensordaten nicht viele Informationen enthalten, besteht der Schlüssel zur Analyse darin, effektive Merkmale zu verarbeiten und zu erstellen. Zum Beispiel wäre es einfach, wenn wir das einfache Merkmal erfassen könnten, dass "ein Fehler auftritt, wenn die Leistung 200 W überschreitet", aber wie sich der Wert des Sensors tatsächlich geändert hat, steigt beispielsweise die Leistungsmenge schnell an und die Leistungsmenge ist stabil. In den meisten Fällen kann eine aussagekräftige Analyse nur durchgeführt werden, wenn die Analyse unter Verwendung von Informationen durchgeführt wird, z. B. das Wiederholen der Zunahme / Abnahme im Zickzack, ohne dies zu tun.
Die zu analysierenden Daten sind wie folgt. M_CD: Maschinencode UP_TIIME: Startzeit KRAFT: Macht TEMP: Temperatur ERR_CD: Fehlercode
Für jeden Maschinencode werden Änderungen der Leistung und Temperatur während der Startzeit sowie etwaige Fehler in chronologischer Reihenfolge aufgezeichnet.
Dieses Mal werde ich die folgenden Funktionen aus diesen Daten erstellen. ① Bedingt: Leistungsunterschied vor 1 Stunde (2) Flaggentyp: Ein Flag, das den Zickzack fängt, dessen Leistung zunimmt oder abnimmt ③ Zähltyp: Kumulative Anzahl von Zickzackvorkommen ④ Zustandstyp: Ein Zustand, in dem Zickzack häufig auftritt oder nicht.
In jedem Fall wird eine Verarbeitung ausgeführt, für die eine Datensatzreihenfolge erforderlich ist. Verwenden Sie daher einen Sortierknoten, um nach jedem Maschinencode und jeder Startzeit zu sortieren.
Lassen Sie uns einen Unterschied von "Unterschied zur Leistung vor einer Stunde" machen.
Auf Abgeleitet setzen: Bedingt für den Felderstellungsknoten. Anschließend wird ein Eingabeelement mit der Struktur der IF-Anweisung angezeigt. Eigentlich kann die IF-Anweisung mit "Ableitung: CLEM-Ausdruck" geschrieben werden, es wird jedoch empfohlen, "Ableitung: Bedingt" zu verwenden, um die Lesbarkeit zu verbessern.
Geben Sie zuerst @ DIFF1 (POWER) in Dann ein :. @ DIFF1 ist eine in Modeler integrierte Funktion namens CLEM-Funktion, die die Differenz zur vorherigen Zeile berechnet. Jetzt können Sie die Differenz zur Leistung vor einer Stunde berechnen.
Als nächstes setzen Sie If: auf M_CD = @OFFSET (M_CD, 1) und Else: auf undef. @OFFSET ist eine Funktion, die sich auf den Wert N Zeilen zuvor bezieht. Hier wird auf die vorherige Zeile verwiesen. undef bedeutet NULL. Mit anderen Worten, wenn es mit M_CD in der vorherigen Zeile identisch ist, wird @ DIFF1 (POWER) berechnet, und wenn es sich von M_CD in der vorherigen Zeile unterscheidet, ist es bedeutungslos, die Differenz mit der Leistung einer anderen Maschine zu berechnen, was bedeutet, NULL zu setzen. Wird sein.
Das Ergebnis ist wie folgt. Es gibt eine neue abgeleitete Spalte mit dem Namen POWER_DIFF, die den Wert von POWER in der vorherigen Zeile abzüglich der aktuellen POWER enthält. In dem Beispiel in Zeile 930 ist 988W-991W = -3W enthalten.
Wenn Sie sich Zeile 941 ansehen, finden Sie $ null $. Dies sind die Daten der Maschine mit M_CD = 204 bis zur 940. Zeile und die Daten der Maschine mit M_CD = 209 bis zur 941. Zeile. Daher ist es bedeutungslos, die Differenz mit der Leistung zu berechnen, sodass NULL eingegeben wird.
Schauen wir uns übrigens zwei Maschinen mit M_CD = 1000 und M_CD = 229 im Zeitreihendiagramm an.
Bei M_CD = 1000 hat die Leistung von Anfang an um -1 W und -2 W abgenommen und nie zugenommen. Am Ende gibt es eine relativ große Reduzierung von -5W und -6W.
Im Fall von M_CD = 229 gab es einen beträchtlichen positiven und negativen Unterschied, und die Zunahme und Abnahme wurden wiederholt.
In Pandas gruppieren wir nach M_CD und berechnen diff (1), das die Berechnung für POWER vor einer Stunde darstellt, und fügen sie in eine neue Spalte mit dem Namen df ['POWER_DIFF'] ein.
#Leistungsunterschied vor 1 Stunde
df['POWER_DIFF'] = df.groupby(['M_CD'])['POWER'].diff(1)
Möglicherweise stimmt etwas mit der Stromversorgung nicht, wenn die Stromversorgung wiederholt auf und ab geht, wie bei einer Maschine mit M_CD = 229. Es ist nicht möglich, den Zickzack der Leistungssteigerung / -abnahme nur mit dem Einzelwert (Beispiel: -5 W) der "Leistungsdifferenz vor einer Stunde" zu erfassen. Erstellen Sie eine Funktion, die angibt, dass sich der Leistungsunterschied von positiv zu negativ oder von negativ zu positiv geändert hat.
Im Felderstellungsknoten auf "Abgeleitet: Flag-Typ" setzen. Da ich den Datentyp des Feldes später im Zeitreihendiagramm anzeigen wollte, habe ich ihn auf den kontinuierlichen Typ gesetzt, 1 für wahr und 0 für falsch. Wenn Sie nur ein Flag möchten, können Sie den Datentyp als Flag-Typ belassen. Zu wahren Bedingungen POWER_DIFF * @OFFSET(POWER_DIFF,1) < 0 Einstellen. "Leistungsunterschied vor 1 Stunde" * "Leistungsunterschied vor 1 Stunde" wird berechnet, um festzustellen, ob er negativ ist. Die Multiplikation von Plus und Minus ist Minus und die Multiplikation von Plus und Minus ist Plus. Daher wird es markiert, wenn das Vorzeichen invertiert wird, dh wenn Zickzack auftritt.
Das Ergebnis ist wie folgt. Es gibt eine neue abgeleitete Spalte namens FLUCTUATION, die 1 enthält, wenn POWER_DIFF und POWER_DIFF in der vorherigen Zeile unterschiedliche Vorzeichen haben. In Zeile 1195 stieg sie vor einer Stunde um 5 W und diesmal auch um 5 W, sodass sie monoton zunimmt. Die Flagge ist also 0. Auf der anderen Seite In Zeile 1197 stieg 5 W vor 1 Stunde an, aber diese Zeit verringerte sich auf -1 W, so dass Zickzack auftritt. Die Flagge ist also 1. Die Zick-Zack-Situation, die ohne einen Blick auf die Grafik nicht verstanden werden konnte, kann jetzt durch einen Blick auf einen Datensatz in Zeile 1197 verstanden werden.
Schauen wir uns zwei Maschinen an, M_CD = 1000 und M_CD = 229, noch einmal im Zeitreihendiagramm.
Da M_CD = 1000 von Anfang an eine monotone Leistungsabnahme aufweist, gibt es keinen Zickzack.
Wenn M_CD = 229 ist, können Sie sehen, dass das Erhöhen und Verringern fein wiederholt wird.
Das Erstellen einer Zick-Zack-Flagge mit Pandas kann etwas verwirrend sein. Erstellen Sie zunächst vor einer Stunde eine POWER_DIFF-Variable. Gruppiert nach M_CD für POWER_DIFF wird der Wert vor einer Stunde durch Shift (1) referenziert und in eine neue Spalte mit dem Namen df ['PREV_POWER_DIFF'] eingefügt.
#POWER vor 1 Stunde_DIFF-Spalte hinzugefügt
df['PREV_POWER_DIFF'] = df.groupby(['M_CD'])['POWER_DIFF'].shift(1)
Diese Spalte wird in Modeler nicht erstellt, da sie am Ende nicht benötigt wird, aber für Berechnungen in Pandas.
Definieren Sie als Nächstes die Funktion func_fluctuation. In der folgenden IF-Anweisung in dieser Funktion if x.POWER_DIFF * x.PREV_POWER_DIFF < 0: "Leistungsunterschied vor 1 Stunde" * "Leistungsunterschied vor 1 Stunde" wird berechnet, um festzustellen, ob er negativ ist.
Wir rufen diese Funktion dann mit Lambda für jede Zeile auf und fügen das Ergebnis in eine neue Spalte mit dem Namen df ['FLUCTUATION'] ein. Beachten Sie, dass wir von pandas.Series in pandas.DataFrame konvertieren, indem Sie axis = 1 setzen.
#Funktion zur Beurteilung der Plus- und Minus-Inversion
def func_fluctuation(x):
if x.POWER_DIFF * x.PREV_POWER_DIFF < 0:
return 1
else:
return 0
#Rufen Sie eine Funktion auf, die die Inversion von Plus und Minus aus jeder Zeile bestimmt
df['FLUCTUATION'] = df.apply(lambda x:func_fluctuation(x),axis=1)
Ich konnte es wie folgt erzeugen.
Wenn Sie viele Zickzacke haben, wie bei einer Maschine mit M_CD = 229, haben Sie möglicherweise ein Problem mit der Stromversorgung. Wenn Sie jedoch einige Zickzackmuster haben, denken Sie möglicherweise, dass dies in Ordnung ist. Erstellen wir einen charakteristischen Betrag aus der kumulierten Summe, wie oft der Zickzack nach dem Start kumulativ aufgetreten ist.
Im Felderstellungsknoten auf "Abgeleitet: Zählertyp" setzen. Für inkrementelle Bedingungen FLUCTUATION = 1 Inkrement ist 1 Einstellen. Dies bedeutet, dass es um eins zählt, wenn ein Zickzack auftritt. Außerdem wird M_CD / = @OFFSET (M_CD, 1) als Rücksetzbedingung festgelegt, und der Zähler wird so eingestellt, dass er bei einem Maschinenwechsel auf 0 zurückkehrt.
Das Ergebnis ist wie folgt. Es gibt eine neue abgeleitete Spalte mit dem Namen FLUC_COUNT. Wenn 1 in FLUCTUATION eingegeben wird, wird diese einzeln hochgezählt. In Zeile 1194 ist FLUC_COUNT 1, da FLUCTUATION aufgetreten ist. Danach wird 1 bis zur Zeile 1197 beibehalten. Und da FLUCTUATION in Zeile 1197 erneut auftritt, hat es sich auf 2 erhöht.
Betrachten wir nun die beiden Maschinen M_CD = 104 und M_CD = 229 im Zeitreihendiagramm.
M_CD = 104 hat nach 40 Stunden zwei Zickzacklinien, wonach die Leistung stetig abnimmt. FLUC_COUNT bleibt also nach ca. 50 Stunden bei 2.
Wenn M_CD = 229 war, wurden die Zunahme und Abnahme fein wiederholt, und der Zickzackzustand wurde 40 Mal oder mehr wiederholt.
In Pandas können Sie mit einer Funktion namens cumsum () berechnen, die die kumulative Summe berechnet. Gruppiert nach M_CD wird die kumulative Summe von FLUCTUATION mit cumsum () berechnet und in eine neue Spalte mit dem Namen df ['FLUC_COUNT'] eingefügt.
#Kumulative Anzahl von Zickzack
df['FLUC_COUNT'] = df.groupby(['M_CD'])['FLUCTUATION'].cumsum()
Ich konnte es wie folgt erzeugen.
Wenn der Zick-Zack-Zustand ebenfalls ein wenig schwankt, liegt möglicherweise kein großes Problem vor. Wenn sich der Zickzack dagegen in kurzer Zeit wiederholt, kann der Effekt auch dann bestehen bleiben, wenn der Zickzack danach nachlässt. "Abgeleitet: Zustandstyp" kann eine so komplizierte Situation ausdrücken.
Auf dem Felderstellungsknoten auf "Abgeleitet: Statustyp" setzen. Da ich den Datentyp des Feldes später im Zeitreihendiagramm anzeigen wollte, habe ich ihn auf den fortlaufenden Typ gesetzt, 1 für "Ein" und 0 für "Aus". Wenn Sie nur ein Flag möchten, können Sie den Datentyp als Flag-Typ belassen. Für den bedingten Ausdruck des Schalters "Ein" FLUCTUATION = 1 and @OFFSET(FLUCTUATION,1) = 1 Einstellen. Dies bedeutet, dass es einen Zickzack gab und dass der Zickzack vor einer Stunde passiert ist. Mit anderen Worten, Zickzack trat 2 Stunden hintereinander auf.
Als nächstes wird im bedingten Ausdruck des Schalters "aus" @SINCE(FLUCTUATION = 1) >= 5 or M_CD /= @OFFSET(M_CD,1) Einstellen. @SINCE gibt einen numerischen Wert zurück, der die Anzahl der Zeilen angibt, bevor der als Argument angegebene Ausdruck gilt. @SINCE (FLUCTUATION = 1)> = 5 bedeutet, dass der letzte Zickzack vor mehr als 5 Zeilen aufgetreten ist. Mit anderen Worten bedeutet dies, dass es stabil ist, da es länger als 5 Stunden hintereinander keinen Zickzack gibt.
Außerdem ist M_CD / = @OFFSET (M_CD, 1) eine Rücksetzbedingung und wird so eingestellt, dass der Status ausgeschaltet wird, wenn sich die Maschine ändert.
Ähnlich wie der Flag-Typ, jedoch ermöglicht der Statustyp, dass die Ein- und Ausschaltbedingungen asymmetrisch sind. Wenn die instabile Zick-Zack-Situation zweimal anhält, wird sie eingeschaltet, während der stabile Zustand erst nach fünfmaligem Fort wieder ausgeschaltet wird.
Das Ergebnis ist wie folgt. Es gibt eine neue abgeleitete Spalte namens UNSTABILITY.
Als nächstes tritt von Zeile 903 bis Zeile 906 keine FLUKTUATION bei 0 auf, aber UNSTABILITY bleibt 1. Und in Zeile 907 war FLUCTUATION vor mehr als 5 Datensätzen 1, dh FLUCTUATION war 0 mehr als 5 Datensätze hintereinander, sodass UNSTABILITY auf 0 zurückkehrte. Da der Zickzack nicht länger als 5 Stunden auftrat, wurde er als stabil beurteilt.
Betrachten wir nun die beiden Maschinen M_CD = 204 und M_CD = 229 im Zeitreihendiagramm.
M_CD = 204 hat nach 49 Stunden zwei Zickzacklinien, wonach die Leistung stetig abnimmt. Die UNSTABILITÄT bleibt also 5 Stunden nach dem Erreichen von 1 bei 0.
Wenn M_CD = 229 ist, nimmt es fein zu und ab, und UNSTABILITY ist über einen langen Zeitraum 1, aber es gibt 3 Mal ohne Zickzack für 5 Stunden hintereinander, und UNSTABILITY ist während dieses Zeitraums 0.
Da es schwierig ist, einen so komplizierten Zustand mit Pandas auszudrücken, habe ich die serielle Verarbeitung mit Schleifenverarbeitung in Betracht gezogen.
#Die erste Zeile ist der Anfangswert der Stabilität
df.at[0, 'UNSTABILITY'] = 0
stable_seq_count = 0
#2. Zeile(index=1)Schleifenverarbeitung von
for index in range(1,len(df)):
#Die Standardeinstellung behält den vorherigen Status bei
df.at[index, 'UNSTABILITY'] = df.at[index-1, 'UNSTABILITY']
#Wenn es eine Änderung gibt
if df.at[index, 'FLUCTUATION'] == 1 :
#Initialisieren Sie die kontinuierliche Stabilitätszählung
stable_seq_count = 0
#Instabilitätsbeurteilung, wenn die Fluktuation zweimal anhält
if df.at[index-1, 'FLUCTUATION'] == 1:
df.at[index, 'UNSTABILITY'] = 1
#Wenn keine Schwankungen auftreten, erhöhen Sie die Anzahl der kontinuierlichen Stabilitäten
elif df.at[index, 'FLUCTUATION'] == 0:
stable_seq_count += 1
#Beurteilung des stabilen Status, wenn die kontinuierliche Stabilitätszählung fünfmal oder öfter fortgesetzt wird oder wenn die Maschine zu einer anderen Maschine wird
if stable_seq_count >= 5 or df.at[index, 'M_CD'] != df.at[index-1, 'M_CD']:
df.at[index, 'UNSTABILITY'] = 0
Ich konnte es wie folgt erzeugen.
Die Probe wird unten platziert.
Strom https://github.com/hkwd/200611Modeler2Python/raw/master/derive/derive3.str notebook https://github.com/hkwd/200611Modeler2Python/blob/master/derive/derive.ipynb Daten https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/Cond4n_e.csv
■ Testumgebung Modeler 18.2.2 Windows 10 64bit Python 3.6.9 pandas 0.24.1
Felderstellungsknoten https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.2/modeler_mainhelp_client_ddita/clementine/derive_overview.html
Recommended Posts