[PYTHON] Analyse des données de mesure ①-Mémorandum de montage scipy-

Préface

Un jour, Kyo "T-kun, je t'enverrai les données qui sont sorties de l'instrument de mesure, alors fais ton propre graphique." T "OK!" Rencontre d'un jour ... T "Ceci est un graphique" Kyo "Quelle était la valeur ici? L'avez-vous calculée?" (...?!) Kyo "Il y a encore 0 données dans le même format que celui-ci. Veuillez faire le calcul." ((^ Ω ^) ... Owata)

Il y a un arrière-plan tel que J'ai commencé à apprendre python pour automatiser et accélérer l'organisation des données. Python a été le premier à commencer la programmation. Après avoir étudié petit à petit et rédigé mon mémoire de maîtrise, j'aimerais enregistrer les progrès liés à python. C'est la première fois que j'écris un article, et je ne sais pas si je vais finir de l'écrire (3/18). GitHub propose également des exemples de données et des blocs-notes. D'ici S'il vous plaît.

J'ai pris les données. Faisons de notre mieux pour élever le graphique.

T "J'écris un programme en étudiant Python, alors peux-tu attendre un instant?" Enseignement "?? Terminé!" (Plus tard, "un peu" gonfle jusqu'à quelques mois)

Maintenant, ouvrons les données. Les données que j'ai reçues étaient au format txt qui peut être ouvert même dans Excel. C'est un peu désagréable d'avoir un délimiteur point-virgule. Voici un exemple des données. image.png

Le premier manuel que j'ai touché était [note d'introduction à python](https://www.amazon.co.jp/%E8%A9%B3%E7%B4%B0-Python-%E5%85%A5%E9%96%80 % E3% 83% 8E% E3% 83% BC% E3% 83% 88-% E5% A4% A7% E9% 87% 8D-% E7% BE% 8E% E5% B9% B8 / dp / 4800711673) fait. Après avoir installé Anaconda selon ce manuel, j'étudiais en écrivant du code sur spyder.

Lire le fichier

Le manuel contenait des fichiers de lecture et d'écriture en utilisant numpy. Pour le moment, je l'ai lu en fonction du sujet. J'ai essayé de passer le chemin du fichier en utilisant tkinter. tkinter Je ne sais pas, mais je l'ai utilisé comme un sortilège magique.

.py


import tkinter as tk
import tkinter.filedialog as fd
import numpy as np

root=tk.Tk()
root.withdraw()
path = fd.askopenfilename(
        title="file---",
        filetypes=[("csv","csv"),("CSV","csv")])
if path :
    fileobj=np.genfromtxt(path,delimiter=";",skip_header=3)#Lisez les données séparées par des points-virgules en sautant 3 lignes
    f=fileobj[:,0]#Données de la première colonne

À ce moment-là, il était en cours de lecture. Plus tard, je suis tombé sur un module pratique appelé pandas. [Introduction à Jupyter [Pratique] pour les utilisateurs de Python](https://www.amazon.co.jp/Python%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%AE % E3% 81% 9F% E3% 82% 81% E3% 81% AEJupyter-% E5% AE% 9F% E8% B7% B5-% E5% 85% A5% E9% 96% 80-% E6% B1% A0% E5% 86% 85-% E5% AD% 9D% E5% 95% 93 / dp / 4774192236) a été utilisé comme référence pour lancer l'environnement du notebook. Recommencez avec jupyter notebook et pandas.

.ipynb


import tkinter
from tkinter import filedialog
import pandas as pd

root = tkinter.Tk()
root.withdraw()
path = filedialog.askopenfilename(
    title="file___",
    filetypes=[("txt","txt"),("csv","csv")])
if path:
    df = pd.read_csv(path,engine="python",header=None,sep=';',skiprows=3,index_col=0)

Visualisation

Si vous le lisez avec des pandas, les données de la table ressembleront à ceci. image.png

Représentons-le rapidement avec la fonction graphique des pandas. Dans cette expérience, nous utiliserons les données des première et deuxième colonnes. Dans DataFrame, les données sont traitées à l'aide d'un indexeur (loc, iloc), mais il convient de noter que l'objet renvoyé est remplacé par Series lorsqu'une ligne ou une colonne de données est spécifiée.

.ipnb


import matplotlib.pyplot as plt
df=df.iloc[:,[0,1]]
df.set_index(0,inplace=True)#Écraser df en spécifiant l'index
df.plot()
plt.show()

image.png

Lors du traçage à l'aide de pandas, il semble que la colonne d'index soit automatiquement prise sur l'axe horizontal, donc l'index est spécifié à l'avance avec .set_inedex (nom de la colonne). Une forme d'onde avec un pic net est apparue autour du centre, comme indiqué sur l'image. Il y avait du bruit sur le bord. Cela dépend du nombre de points de données, mais jusqu'à présent, je l'ai fait dans Excel.

Montage avec scipy

Le processus s'est déroulé sans heurts jusqu'à ce que le graphique soit créé, mais le calcul était gênant. Le défi cette fois était d'évaluer ** la netteté du pic **. En tant qu'outil d'adaptation, curve_fit de scipy est sorti dès que je l'ai recherché sur Google, alors j'ai essayé de l'utiliser. L'axe vertical dans le graphique ci-dessus est la puissance d'entrée et l'unité est exprimée en décibels (dBm). Lorsque l'unité est modifiée en mW et normalisée avec la valeur maximale, elle devient comme indiqué dans la figure ci-dessous.

df.index = df.index*pow(10,-9)
df.index.rename('freq[GHz]',inplace=True)
df['mag'] = pow(10,(df.iloc[:]-df.iloc[:].max())/10)
df['mag'].plot()
plt.show()

image.png La fonction que vous souhaitez adapter est: C'est la fonction Lorentz avec une ligne de base ajoutée. Toutes les variables sauf x. ..

f_{\left(x\right)}=A \left(\frac{\gamma}{\left(x-\mu\right)^2+\gamma^2}\right)+Bx+C

init est la valeur initiale du paramètre. Avec une valeur approximative J'ai fait une liste. Le paramètre optimal opt et cov co-distribué peut être obtenu par curve_fit (nom de la fonction, x, y, valeur initiale du paramètre).

import scipy.optimize
def lorentz(x,A,mu,gamma,B,C):#Définissez une fonction qui convient
    return A*x*gamma/((x-mu)**2+gamma**2)+B*x+C
A  = -np.pi*(df.index.max()-df.index.min())/20
mu = df.index.values.mean()
gamma  = (df.index.max()-df.index.min())/20
B  = 10
C  = 0
init = [A,mu,gamma,B,C]#Valeur initiale du paramètre que vous souhaitez ajuster
opt, cov = scipy.optimize.curve_fit(lorentz,df.index,df['mag'],init)#raccord

image.png Tracez les résultats. Il est très pratique de créer une nouvelle colonne avec df [nom de la colonne] = 〇〇. Si vous souhaitez l'ajouter à un objet Series, convertissez-le en type DataFrame via pd.DataFrame (objet Series) ou .reset_index (). Il est agréable d'utiliser les noms de colonnes tels qu'ils sont dans la légende. L'axe vertical est ... ..

df['fit']=lorentz(df.index,opt[0],opt[1],opt[2],opt[3],opt[4])
df.loc[:,['mag','fit']].plot()
plt.show()

image.png Cela va bien.

La netteté du pic a été évaluée en utilisant les $ \ mu $ et $ \ gamma $ obtenus. ・ $ \ Mu $: Centre du pic ・ $ \ Gamma : moitié de la largeur de deux points lorsque la profondeur du pic est divisée par deux (: moitié prix moitié largeur) Comme c'est le cas, valeur Q (netteté du pic) $ Q = \frac{\mu}{2\gamma} $$ C'est une solution de problème à la recherche de. Continuer.

Analyse des données de mesure (2) -Hytriform et ajustement, recommandation lmfit-

Résumé

Les données d'échantillonnage représentaient les caractéristiques de fréquence d'un certain circuit de résonance. J'ai commencé à le toucher par moi-même et finalement le programme d'analyse Kossa était terminé. Lorsque j'ai déménagé pour la première fois, j'ai été impressionné. Au moment où j'ai obtenu mon diplôme, je traitais des milliers de données. C'est horrible. Faites-le et yokatta ... Je veux étudier de plus en plus les pandas pour pouvoir gérer les données librement.

Recommended Posts

Analyse des données de mesure ①-Mémorandum de montage scipy-
Analyse des données de mesure (2) -Hydrobacter et raccord, recommandation lmfit-
Principes de base de Pandas pour les débutants ② Présentation des données de saisie
Mémorandum elasticsearch_dsl
Sélection des données de mesure
Mémorandum de construction de l'environnement de la bibliothèque AutoML PyCaret
Python pour l'analyse des données Chapitre 4
Python pour l'analyse des données Chapitre 2
Conseils et précautions lors de l'analyse des données
Python pour l'analyse des données Chapitre 3
Mémorandum de l'outil de gestion de paquets Python ez_setup
Modèle de prétraitement pour l'analyse des données (Python)
Analyse de données pour améliorer POG 3 ~ Analyse de régression ~
Recommandation d'analyse des données à l'aide de MessagePack
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Traitement des données 2 Analyse de divers formats de données
Résumé du livre électronique Python utile pour l'analyse de données gratuite
Outil de visualisation Python pour le travail d'analyse de données
Mémorandum sur le QueryDict de Django
Mémorandum de migration avec GORM
JupyterLab Basic Setting 2 pour l'analyse des données (pip)
Configuration de base de JupyterLab pour l'analyse des données (pip)
Un mémorandum de problème lors du formatage des données
Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter
Exécuter l'API de Cloud Pak for Data Analysis Project Job avec des variables d'environnement
Introduction à la modélisation statistique pour l'analyse des données Élargissement de la gamme d'applications de GLM
Un mémorandum de méthode souvent utilisé lors de l'analyse de données avec des pandas (pour les débutants)
Analyse des données pour améliorer POG 2 ~ Analyse avec le notebook jupyter ~
Préparer un environnement de langage de programmation pour l'analyse des données
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: chargement des données
Introduction à la modélisation statistique pour l'analyse des données
Comment utiliser les outils d'analyse de données pour les débutants
Compréhension facile de Python pour les tableaux et (pour les super débutants)
Analyse émotionnelle des données de tweet à grande échelle par NLTK
Environnement enregistré pour l'analyse des données avec Python