Jestem bardzo nowy w Pythonie i programowaniu w ogóle (to jest mój pierwszy język programowania, zacząłem około miesiąc temu).

Mam plik CSV z danymi zamówionych w ten sposób (dane pliku CSV na dole). Istnieje 31 kolumn danych. Pierwsza kolumna (długość fali) musi być odczytana jako zmienna niezależna (x) i dla pierwszej iteracji, musi odczytać w drugiej kolumnie (tj. Pierwsza kolumna oznaczona jako "obserwacja") jako zmienna zależna (Y). Następnie próbuję dopasować model Gaussa + Line do danych i wyodrębniając wartość średniej średnicy Gaussa (MU) z danych, które powinny być przechowywane w tablicy do dalszej analizy. Ten proces powinien być powtarzany dla każdego zestawu obserwacji, podczas gdy wartości X odczytane musi pozostać tak samo (tj. Z kolumny długości fali)

Oto kod, w jaki sposób aktualnie czytam dane:

import numpy as np #importing necessary packages
import matplotlib.pyplot as plt
import pandas as pd
import scipy as sp
from scipy.optimize import curve_fit
e=np.exp
spectral_data=np.loadtxt(r'C:/Users/Sidharth/Documents/Computing Labs/Project 1/Halpha_spectral_data.csv', delimiter=',', skiprows=2) #importing data file
print(spectral_data)
x=spectral_data[:,0] #selecting column 0 to be x-axis data
y=spectral_data[:,1] #selecting column 1 to be y-axis data

Muszę więc zautomatyzować ten proces, aby zamiast zmienić Y = Spectral_data [:, 1] do Y = Spectral_data [:, 2] ręcznie aż do Y = Spectral_data [:, 30] dla każdej iteracji może być po prostu zautomatyzowany.

Mój kod do wytwarzania Fit Gaussa jest następujący:

plt.scatter(x,y) #produce scatter plot
plt.title('Observation 1')
plt.ylabel('Intensity (arbitrary units)')
plt.xlabel('Wavelength (m)')
plt.plot(x,y,'*')
plt.plot(x,c+m*x,'-') #plots the fit

print('The slope and intercept of the regression is,', m,c)
m_best=m
c_best=c
def fit_gauss(x,a,mu,sig,m,c):
    gaus = a*sp.exp(-(x-mu)**2/(2*sig**2))
    line = m*x+c
    return gaus + line

initial_guess=[160,7.1*10**-7,0.2*10**-7,m_best,c_best]
po,po_cov=sp.optimize.curve_fit(fit_gauss,x,y,initial_guess)

Gaussijczyk wydaje się pasować do grzywny (jak pokazano na obrazie działki), a więc średnia wartość tego Gaussa (tj. Współrzędna X szczytowa) jest wartością, którą muszę wyciągnąć z niego. Wartość średniej podana jest w konsoli (oznaczona przez MU):

The slope and intercept of the regression is, -731442221.6844947 616.0099144830941
The signal parameters are
 Gaussian amplitude = 19.7 +/- 0.8
 mu = 7.1e-07 +/- 2.1e-10
 Gaussian width (sigma) = -0.0 +/- 0.0
and the background estimate is
 m = 132654859.04 +/- 6439349.49
 c = 40 +/- 5

Więc moje pytania są, jak mogę iterować proces czytania w danych z CSV, aby nie musiał ręcznie zmienić kolumnę Y, wymaga danych z , a następnie , jak mam Przechowuj wartość MU z każdej iteracji odczytu, dzięki czemu mogę wykonać dalszą analizę / obliczenia, a następnie później?

Moje myśli powinienem użyć pętli dla pętli , ale nie jestem pewien, jak to zrobić.

Pomarańczowa linia pokazana na działce jest wynikiem jakiegoś kodu, który próbowałem wcześniej. Myślę, że jego nieistotne, dlatego nie jest w głównej części pytania, ale jeśli to konieczne, to wszystko jest.

x=spectral_data[:,0] #selecting column 0 to be x-axis data
y=spectral_data[:,1] #selecting column 1 to be y-axis data
plt.scatter(x,y) #produce scatter plot
plt.title('Observation 1')
plt.ylabel('Intensity (arbitrary units)')
plt.xlabel('Wavelength (m)')
plt.plot(x,y,'*')
plt.plot(x,c+m*x,'-') #plots the fit

CSV file data Plot showing Gaussian + line fit

0
sid2001 21 listopad 2020, 22:06

1 odpowiedź

Najlepsza odpowiedź

Zwykle, gdy napotkasz taki problem, spróbuj go złamać, co należy zachować niezmienione (w twoim przykładzie, dane X i kod analizy), a co ma zostać zmienione (dane Y lub bardziej konkretne Indeks, który mówi reszcie kodu, co jest właściwą kolumną dla danych Y) i jak zachować wartości, które chcesz zapisać dalej w dół drogi.
Po zrozumieniu tego musimy sformalizować właściwą pętlę i jak przechowywać wartości, które chcemy. Aby zrobić ten ostatni, łatwy sposób jest przechowywanie ich na liście, więc zainicjujemy pustą listę i na końcu każdej pętli iteracji dołączymy wartość do tej listy.

mu_list = [] # will store our mu's in this list
for i in range(1, 31): # each iteration i gets a different value, starting with 1 and ends with 30 (and not 31)
    x = spectral_data[:, 0]
    y = spectral_data[:, i]
    # Your analysis and plot code here #
    mu = po[1] # Not sure po[1] is the right place where your mu is, please change it appropriately...
    mu_list.append(mu) # store mu at the end of our growing mu_list

I będziesz miał listę 30 mu mu_list.

Teraz, zauważ, że nie musimy robić wszystkiego w pętli, na przykład X jest taki sam niezależnie od i (Ładowanie x tylko raz - poprawia wydajność), a kod analizy jest zasadniczo taki sam, z wyjątkiem innego niż inny Wejście (dane Y), abyśmy mogli zdefiniować funkcję (dobra praktyka, aby większy kod znacznie bardziej czytelny), więc najprawdopodobniej możemy zabrać je z pętli. Możemy napisać x = spectral_data[:, 0] przed pętlą i zdefiniować funkcję, która analizuje dane i zwroty MU:

def analyze(x, y):
    # Your analysis and plot code here #
    mu = po[1]
    return mu

x = spectral_data[:, 0]
mu_list = [] # will store our mu's in this list
for i in range(1, 31):
    y = spectral_data[:, i]
    mu_list.append(analyze(x,y)) # Will calculate mu using our function, and store it at the end of our growing mu_list
0
itaishz 21 listopad 2020, 19:49