Schreiben Sie den Felderstellungsknoten von SPSS Modeler mit Python neu. Merkmalsextraktion aus Zeitreihensensordaten

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.

image.png

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.

image.png

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.

image.png

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.

image.png

1m. ① Bedingung: Leistungsunterschied vor 1 Stunde Modeler-Version

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.

image.png

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.

image.png

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. image.png

Im Fall von M_CD = 229 gab es einen beträchtlichen positiven und negativen Unterschied, und die Zunahme und Abnahme wurden wiederholt. image.png

1p. ① Bedingt: Leistungsunterschied vor 1 Stunde Pandas-Version

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)

image.png

2m. (2) Flaggentyp: Flag, das den Zickzack erfasst, dessen Leistung die Modeler-Version erhöht oder verringert

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.

image.png

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.

image.png

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. image.png

Wenn M_CD = 229 ist, können Sie sehen, dass das Erhöhen und Verringern fein wiederholt wird. image.png

2p. (2) Flaggentyp: Flaggenpandas-Version, die den Zickzack erfasst, dessen Leistung zunimmt oder abnimmt

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. image.png

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. image.png

3m. ③ Zählertyp: Kumulative Anzahl von Zick-Zack-Vorkommen Modeler-Version

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.

image.png

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.

image.png

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. image.png

Wenn M_CD = 229 war, wurden die Zunahme und Abnahme fein wiederholt, und der Zickzackzustand wurde 40 Mal oder mehr wiederholt. image.png

3p. ③ Zählertyp: Kumulative Anzahl der Pandas-Versionen im Zickzack

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. image.png

4m. ④ Zustandstyp: Ein Zustand, in dem Zickzack häufig auftritt oder nicht. Modeler-Version

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.

image.png

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.

image.png

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.

image.png

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.

image.png

4p. ④ Zustandstyp: Gibt an, ob Zickzack häufig auftritt oder nicht

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.

image.png

5. Probe

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

6. Referenzinformationen

Felderstellungsknoten https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.2/modeler_mainhelp_client_ddita/clementine/derive_overview.html

Recommended Posts

Schreiben Sie den Felderstellungsknoten von SPSS Modeler mit Python neu. Merkmalsextraktion aus Zeitreihensensordaten
Schreiben Sie den Datensatzadditionsknoten von SPSS Modeler mit Python neu.
Schreiben Sie den Sampling-Knoten von SPSS Modeler mit Python (2) neu: Layered Sampling, Cluster Sampling
Schreiben Sie den Stichproben-Knoten von SPSS Modeler mit Python neu First: Erste N Fälle, Zufallsstichprobe
"Abrufen von Zeitreihendaten von k-db.com mit Python" Memo zur Erstellung der Programmumgebung
Vergleich von R, Python, SAS, SPSS aus Sicht europäischer Datenwissenschaftler
Zeichnen Sie die CSV von Zeitreihendaten mit einem Unixtime-Wert in Python (matplotlib).
Zeigen Sie Details zu Zeitreihendaten mit Remotte an
Vorhersage der Zielzeit eines vollständigen Marathons mit maschinellem Lernen - Visual: Visualisierung von Daten mit Python-
[In-Database Python Analysis Tutorial mit SQL Server 2017] Schritt 4: Feature-Extraktion von Daten mit T-SQL
Implementierung der Clustering-K-Form-Methode für Zeitreihendaten [Unüberwachtes Lernen mit Python Kapitel 13]
Lerne Nim mit Python (ab Anfang des Jahres).
[Grundlagen der Datenwissenschaft] Sammeln von Daten aus RSS mit Python
"Zeitreihenanalyse von Wirtschafts- und Finanzdaten messen" Das Problem am Ende des Kapitels mit Python lösen
Formatieren Sie die Zeitachse des Pandas-Zeitreihendiagramms mit matplotlib neu
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Ändern Sie die Einstellungen eines Knotens in einem Superknoten mit dem Python-Skript SPSS Modeler
Grundlegende Zusammenfassung der Datenoperationen mit Python Pandas - Erste Hälfte: Datenerstellung und -operationen
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
[Python] Zeichnen Sie Zeitreihendaten
So extrahieren Sie Funktionen von Zeitreihendaten mit PySpark Basics
Die Farbextraktion mit Python + OpenCV löste das Rätsel des grünen Hintergrunds
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Existenz aus Sicht von Python
Differenzierung von Zeitreihendaten (diskret)
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Schreiben Sie den Neukonfigurationsknoten von SPSS Modeler mit Python neu. Aggregation nach gekauften Produktkategorien
[Kaggle] Ich habe versucht, mithilfe von tsfresh das Feature-Quantity-Engineering mehrdimensionaler Zeitreihendaten durchzuführen