Réécrivez le nœud de création de champ de SPSS Modeler avec Python. Extraction de caractéristiques à partir de données de capteurs de séries temporelles

Utilisez le nœud "Créer un champ", qui traite les données existantes à partir de données existantes à l'aide de fonctions, etc., pour extraire des caractéristiques des données de capteurs de séries temporelles. Et réécrivons le processus avec les pandas Python.

SPSS Modeler fournit des nœuds pour divers traitements de données, mais le nœud "Création de champ" est un nœud assez général pour traiter des données avec un degré de liberté élevé.

image.png

Vous pouvez sélectionner le modèle de traitement dans la liste "Dérivé". La dérivation est difficile à imaginer, mais il s'agit d'une traduction anglaise appelée dérivée, ce qui signifie un modèle de traitement créé en dérivant des données d'origine. Je vais vous expliquer par ordre d'utilisation personnelle.

Les deux traitent les enregistrements de haut en bas. En particulier pour le type de comptage et le type d'état, il est essentiel de connaître l'ordre de traitement des enregistrements.

Puisqu'il s'agit d'un nœud à usage général, divers traitements peuvent être envisagés, mais cette fois, je vais l'utiliser pour extraire des quantités de caractéristiques à partir de données de capteurs de séries temporelles.

Étant donné que les données des capteurs de séries chronologiques ne contiennent pas beaucoup d'informations en l'état, la clé de l'analyse est de traiter et de créer des fonctionnalités efficaces. Par exemple, ce serait facile si nous pouvions saisir la caractéristique simple que "une erreur se produira si la puissance dépasse 200W", mais comment la valeur du capteur a réellement changé, par exemple, la quantité de puissance augmente rapidement et la quantité de puissance est stable. Dans la plupart des cas, une analyse significative ne peut être effectuée que si l'analyse est effectuée à l'aide d'informations telles que la répétition de l'augmentation / diminution en zigzag sans le faire.

Les données à analyser sont les suivantes. M_CD: code machine UP_TIIME: heure de démarrage PUISSANCE: Puissance TEMP: température ERR_CD: code d'erreur

Pour chaque code machine, les changements de puissance et de température le long du temps de démarrage et les éventuelles erreurs sont enregistrés par ordre chronologique.

image.png

Cette fois, je vais créer les fonctionnalités suivantes à partir de ces données. ① Conditionnel: différence de puissance il y a 1 heure (2) Type de drapeau: un drapeau qui attrape le zigzag que la puissance augmente ou diminue ③ Type de comptage: nombre cumulé d'occurrences de zigzag ④ Type d'état: état dans lequel le zigzag se produit fréquemment ou non.

image.png

Dans chaque cas, le traitement qui nécessite l'ordre des enregistrements est effectué, utilisez donc un noeud de tri pour trier par code machine et heure de démarrage.

image.png

1m. ① Conditionnel: différence de puissance il y a 1 heure Version Modeler

Faisons une quantité caractéristique de "différence par rapport à la puissance d'il y a une heure".

Défini sur dérivé: conditionnel au nœud de création de champ. Ensuite, un élément d'entrée montrant la structure de l'instruction IF apparaîtra. En fait, l'instruction IF peut être écrite avec "Derivation: CLEM expression", mais il est recommandé d'utiliser "Derivation: Conditional" pour une meilleure lisibilité.

Tout d'abord, entrez @ DIFF1 (POWER) dans Then:. @ DIFF1 est une fonction intégrée de Modeler appelée fonction CLEM, qui calcule la différence par rapport à la ligne précédente. Vous pouvez maintenant calculer la différence avec la puissance d'il y a une heure.

Ensuite, définissez If: sur M_CD = @OFFSET (M_CD, 1) et Else: sur undef. @OFFSET est une fonction qui fait référence à la valeur N lignes avant. Ici, la ligne précédente est référencée. undef signifie NULL. En d'autres termes, s'il est identique à M_CD dans la ligne précédente, @ DIFF1 (POWER) est calculé, et s'il est différent de M_CD dans la ligne précédente, il est inutile de calculer la différence avec la puissance d'une autre machine, donc cela signifie mettre NULL. Sera.

image.png

Le résultat est le suivant. Il existe une nouvelle colonne dérivée appelée POWER_DIFF qui contient la valeur de POWER dans la ligne précédente moins la puissance actuelle. Dans l'exemple de la ligne 930, 988W-991W = -3W est inclus.

De plus, si vous regardez la ligne 941, vous trouverez $ null $. Ce sont les données de la machine avec M_CD = 204 jusqu'à la 940ème ligne, et les données de la machine avec M_CD = 209 de la 941ème ligne, il est donc inutile de calculer la différence avec la puissance, donc NULL est entré.

image.png

En passant, regardons deux machines avec M_CD = 1000 et M_CD = 229 dans le graphique de séries chronologiques.

À M_CD = 1000, la puissance a diminué de -1W et -2W depuis le début et n'a jamais augmenté. À la fin, il y a une réduction relativement importante de -5W et -6W. image.png

Dans le cas de M_CD = 229, il y avait une différence positive et négative considérable, et l'augmentation et la diminution ont été répétées. image.png

1p. ① Conditionnel: différence de puissance il y a 1 heure version pandas

Chez les pandas, nous groupons par M_CD et calculons diff (1) qui représente le calcul d'il y a une heure pour POWER et le mettons dans une nouvelle colonne appelée df ['POWER_DIFF'].

#Différence de puissance il y a 1 heure
df['POWER_DIFF'] = df.groupby(['M_CD'])['POWER'].diff(1)

image.png

2m. (2) Type de drapeau: Un drapeau qui capture le zigzag que la puissance augmente ou diminue la version Modeler

Il peut y avoir un problème avec l'alimentation si l'alimentation monte et descend à plusieurs reprises comme une machine avec M_CD = 229. Il n'est pas possible de capturer le zigzag d'augmentation / diminution de puissance avec une seule valeur (exemple: -5W) de "la différence de puissance il y a une heure". Créez une fonction qui indique que la différence de puissance est passée de positive à négative ou de négative à positive.

Défini sur "Dérivé: type d'indicateur" dans le nœud de création de champ. Puisque je voulais afficher le type de données du champ dans le graphique de la série chronologique plus tard, je l'ai défini sur type continu, 1 pour vrai et 0 pour faux. Si vous voulez juste un indicateur, vous pouvez laisser le type de données comme type d'indicateur. Aux conditions réelles POWER_DIFF * @OFFSET(POWER_DIFF,1) < 0 Mettre en place. "Différence de puissance il y a 1 heure" * "Différence de puissance il y a 1 heure" est calculée pour déterminer si elle sera négative. La multiplication de plus et moins sera moins, et la multiplication de plus et moins sera plus. Par conséquent, il est signalé lorsque le signe est inversé, c'est-à-dire lorsque le zigzag se produit.

image.png

Le résultat est le suivant. Il existe une nouvelle colonne dérivée appelée FLUCTUATION, qui contient 1 si POWER_DIFF et POWER_DIFF de la ligne précédente ont des signes différents. Dans la ligne 1195, il a augmenté de 5W il y a une heure, et cette fois également de 5W, il augmente donc de manière monotone. Le drapeau est donc 0. D'autre part Dans la ligne 1197, 5W a augmenté il y a 1 heure, mais cette fois a diminué à -1W, donc un zigzag se produit. Le drapeau est donc 1. La situation en zigzag qui ne pouvait être comprise sans regarder le graphique peut maintenant être comprise en regardant simplement un enregistrement sur la ligne 1197.

image.png

Regardons deux machines, M_CD = 1000 et M_CD = 229, à nouveau dans le graphique de séries chronologiques.

Puisque M_CD = 1000 a une diminution monotone de puissance depuis le début, il n'y a pas de zigzag. image.png

Si M_CD = 229, vous pouvez voir que l'augmentation et la diminution se répètent finement. image.png

2p. (2) Type de drapeau: version du drapeau pandas qui capture le zigzag que la puissance augmente ou diminue

Créer un drapeau en zigzag avec des pandas peut être un peu déroutant. Tout d'abord, créez une variable POWER_DIFF il y a une heure. Regroupée par M_CD, pour POWER_DIFF, la valeur d'il y a une heure est référencée par shift (1) et placée dans une nouvelle colonne appelée df ['PREV_POWER_DIFF'].

#POWER il y a 1 heure_Colonne DIFF ajoutée
df['PREV_POWER_DIFF'] = df.groupby(['M_CD'])['POWER_DIFF'].shift(1)

Cette colonne n'est pas créée dans Modeler car elle n'est pas nécessaire à la fin, mais elle est nécessaire pour les calculs dans les pandas. image.png

Ensuite, définissez la fonction func_fluctuation. Dans l'instruction IF suivante de cette fonction if x.POWER_DIFF * x.PREV_POWER_DIFF < 0: "Différence de puissance il y a 1 heure" * "Différence de puissance il y a 1 heure" est calculée pour déterminer si elle sera négative.

Nous appelons ensuite cette fonction avec lambda pour chaque ligne et mettons le résultat dans une nouvelle colonne appelée df ['FLUCTUATION']. Notez que nous convertissons pandas.Series en pandas.DataFrame en définissant axis = 1.

#Fonction pour juger l'inversion plus et moins
def func_fluctuation(x):
    if x.POWER_DIFF * x.PREV_POWER_DIFF < 0:
        return 1
    else:
        return 0
    
#Appeler une fonction qui détermine l'inversion du plus et du moins de chaque ligne
df['FLUCTUATION'] = df.apply(lambda x:func_fluctuation(x),axis=1)

J'ai pu le générer comme suit. image.png

3m. ③ Type de comptage: nombre cumulé d'occurrences de zigzag Version Modeler

Si vous avez beaucoup de zigzags comme une machine avec M_CD = 229, vous pouvez avoir un problème avec l'alimentation, mais si vous avez quelques zigzags, vous pensez peut-être que ça va. Créons une quantité caractéristique de la somme cumulée du nombre de fois où le zigzag s'est produit cumulativement après le démarrage.

Défini sur "Dérivé: type de comptage" dans le nœud de création de champ. Pour les conditions incrémentielles FLUCTUATION = 1 L'incrément est 1 Mettre en place. Cela signifie qu'il compte par un lorsqu'un zigzag se produit. De plus, M_CD / = @OFFSET (M_CD, 1) est défini comme condition de réinitialisation et le compteur est mis à 0 lorsque la machine change.

image.png

Le résultat est le suivant. Il y a une nouvelle colonne dérivée appelée FLUC_COUNT, et quand 1 est entré dans FLUCTUATION, elle sera comptée un par un. En regardant la ligne 1194, FLUC_COUNT vaut 1 car FLUCTUATION s'est produite. Après cela, 1 est maintenu jusqu'à la ligne 1197. Et comme FLUCTUATION se produit à nouveau sur la ligne 1197, elle est passée à 2.

image.png

Regardons maintenant les deux machines M_CD = 104 et M_CD = 229 dans le graphique de séries chronologiques.

M_CD = 104 a deux zigzags après 40 heures, après quoi la puissance diminue régulièrement. Donc FLUC_COUNT sera maintenu à 2 après environ 50 heures. image.png

Lorsque M_CD = 229, l'augmentation et la diminution ont été répétées finement et l'état de zigzag a été répété 40 fois ou plus. image.png

3p. ③ Type de comptage: nombre cumulé d'occurrences de zigzag version pandas

Dans les pandas, vous pouvez calculer avec une fonction appelée cumsum () qui calcule la somme cumulée. Regroupée par M_CD, la somme cumulée de FLUCTUATION est calculée par cumsum () et placée dans une nouvelle colonne appelée df ['FLUC_COUNT'].

#Nombre cumulé de zigzag
df['FLUC_COUNT'] = df.groupby(['M_CD'])['FLUCTUATION'].cumsum()

J'ai pu le générer comme suit. image.png

4m. ④ Type d'état: état dans lequel le zigzag se produit fréquemment ou ne se produit pas. Version Modeler

Si l'état du zigzag fluctue également un peu, il se peut qu'il n'y ait pas de gros problème. D'un autre côté, si le zigzag se répète dans un court laps de temps, l'effet peut persister même si le zigzag disparaît après cela. «Dérivé: type d'état» peut exprimer une situation aussi compliquée.

Défini sur "Dérivé: type d'état" sur le nœud de création de champ. Puisque je voulais afficher le type de données du champ dans le graphique de la série chronologique plus tard, je l'ai défini sur type continu, 1 pour "on" et 0 pour "off". Si vous voulez juste un indicateur, vous pouvez laisser le type de données comme type d'indicateur. Pour l'expression conditionnelle du commutateur "on" FLUCTUATION = 1 and @OFFSET(FLUCTUATION,1) = 1 Mettre en place. Cela signifie qu'il y a eu un zigzag et que c'est arrivé il y a une heure. En d'autres termes, le zigzag s'est produit pendant 2 heures consécutives.

Ensuite, dans l'expression conditionnelle du commutateur "off" @SINCE(FLUCTUATION = 1) >= 5 or M_CD /= @OFFSET(M_CD,1) Mettre en place. @SINCE renvoie une valeur numérique indiquant le nombre de lignes avant que l'expression donnée en argument ne soit maintenue. @SINCE (FLUCTUATION = 1)> = 5 signifie que le zigzag s'est produit pour la dernière fois il y a plus de 5 lignes. En d'autres termes, cela signifie qu'il est stable car il n'y a pas de zigzag pendant plus de 5 heures d'affilée.

De plus, M_CD / = @OFFSET (M_CD, 1) est une condition de réinitialisation, et il est défini pour remettre l'état sur off lorsque la machine change.

Similaire au type d'indicateur, mais le type d'état permet aux conditions d'activation et de désactivation d'être asymétriques. Ici, si la situation instable en zigzag se poursuit deux fois, elle est activée, tandis que l'état stable ne revient pas à off jusqu'à ce qu'il continue cinq fois.

image.png

Le résultat est le suivant. Il existe une nouvelle colonne dérivée appelée UNSTABILITY. Tout d'abord, en regardant la ligne 902, FLUCTUATION contient 2 enregistrements d'affilée et 1 est atteint. Si le zigzag se poursuit pendant 2 heures consécutives, il est jugé instable.

Ensuite, de la ligne 903 à la ligne 906, la FLUCTUATION ne se produit pas à 0, mais UNSTABILITY reste 1. Et à la ligne 907, FLUCTUATION était 1 il y a plus de 5 enregistrements, c'est-à-dire que FLUCTUATION était 0 de plus de 5 enregistrements d'affilée, donc UNSTABILITY est revenu à 0. Comme le zigzag ne s'est pas produit pendant plus de 5 heures, il a été jugé stable.

image.png

Regardons maintenant les deux machines M_CD = 204 et M_CD = 229 dans le graphique de séries chronologiques.

M_CD = 204 a deux zigzags après 49 heures, après quoi la puissance diminue régulièrement. Donc l'INSTABILITÉ restera à 0 5 heures après qu'il devienne 1.

image.png

Lorsque M_CD = 229, l'augmentation et la diminution sont répétées finement, et UNSTABILITY est de 1 pendant une longue période de temps, mais il y a 3 fois sans zigzag pendant 5 heures de suite, et UNSTABILITY est de 0 pendant cette période.

image.png

4p. ④ Type d'état: si le zigzag se produit fréquemment ou non, version pandas

Comme il est difficile d'exprimer une condition aussi compliquée avec les pandas, j'ai envisagé un traitement en série avec un traitement en boucle.

#La première ligne est la valeur initiale de stabilité
df.at[0, 'UNSTABILITY'] = 0
stable_seq_count = 0

#2e ligne(index=1)Traitement en boucle de
for index in range(1,len(df)):
    #La valeur par défaut conserve le statut précédent
    df.at[index, 'UNSTABILITY'] = df.at[index-1, 'UNSTABILITY']
    
    #S'il y a un changement
    if df.at[index, 'FLUCTUATION'] == 1 :
        #Initialiser le décompte de stabilité continue
        stable_seq_count = 0
        #Jugement d'instabilité lorsque la fluctuation se poursuit deux fois
        if df.at[index-1, 'FLUCTUATION'] == 1:
            df.at[index, 'UNSTABILITY'] = 1
    #S'il n'y a pas de fluctuation, augmentez le nombre de stabilité continue
    elif df.at[index, 'FLUCTUATION'] == 0:
        stable_seq_count += 1
    
    #Jugement de l'état stable lorsque le comptage de stabilité continue se poursuit 5 fois ou plus ou lorsque la machine devient une autre machine
    if stable_seq_count >= 5 or df.at[index, 'M_CD'] != df.at[index-1, 'M_CD']:
        df.at[index, 'UNSTABILITY'] = 0

J'ai pu le générer comme suit.

image.png

5. Échantillon

L'échantillon est placé ci-dessous.

courant https://github.com/hkwd/200611Modeler2Python/raw/master/derive/derive3.str notebook https://github.com/hkwd/200611Modeler2Python/blob/master/derive/derive.ipynb Les données https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/Cond4n_e.csv

■ Environnement de test Modeler 18.2.2 Windows 10 64bit Python 3.6.9 pandas 0.24.1

6. Informations de référence

Nœud de création de champ https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.2/modeler_mainhelp_client_ddita/clementine/derive_overview.html

Recommended Posts

Réécrivez le nœud de création de champ de SPSS Modeler avec Python. Extraction de caractéristiques à partir de données de capteurs de séries temporelles
Réécrivez le nœud d'ajout d'enregistrement de SPSS Modeler avec Python.
Réécrire le nœud d'échantillonnage de SPSS Modeler avec Python (2): échantillonnage en couches, échantillonnage en grappes
Réécrire le nœud d'échantillonnage de SPSS Modeler avec Python ①: N premiers cas, échantillonnage aléatoire
"Obtenir des données de séries chronologiques de stock à partir de k-db.com avec Python" Mémo de création d'environnement de programme
Comparaison de R, Python, SAS, SPSS du point de vue des data scientists européens
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
Voir les détails des données de séries chronologiques dans Remotte
Prédire le temps objectif d'un marathon complet avec l'apprentissage automatique-③: j'ai essayé de visualiser les données avec Python-
[Didacticiel d'analyse Python dans la base de données avec SQL Server 2017] Étape 4: Extraction de fonctionnalités de données à l'aide de T-SQL
Implémentation de la méthode de clustering k-shape pour les données de séries chronologiques [Apprentissage non supervisé avec python Chapitre 13]
Apprenez Nim avec Python (dès le début de l'année).
[Bases de la science des données] Collecte de données depuis RSS avec python
"Analyse des séries chronologiques de mesure des données économiques et financières" Résolution du problème de fin de chapitre avec Python
Reformatez l'axe des temps du graphique de la série chronologique des pandas avec matplotlib
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
[Homologie] Comptez le nombre de trous dans les données avec Python
Modifier les paramètres d'un nœud dans un super nœud avec le script SPSS Modeler Python
Résumé de base de la manipulation de données avec Python Pandas - Première moitié: création et manipulation de données
Essayez d'extraire les caractéristiques des données de capteur avec CNN
[Python] Tracer des données de séries chronologiques
Comment extraire des fonctionnalités de données de séries chronologiques avec les bases de PySpark
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Existence du point de vue de Python
Différenciation des données de séries chronologiques (discrètes)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Essayez d'imaginer les données d'élévation du National Land Research Institute avec Python
Réécrivez le nœud de reconfiguration de SPSS Modeler avec Python. Agrégation par catégorie de produits achetés
[Kaggle] J'ai essayé l'ingénierie de quantité de caractéristiques de données de séries chronologiques multidimensionnelles à l'aide de tsfresh