【发布时间】:2021-03-04 21:40:01
【问题描述】:
我对 python 和一般编程非常陌生(这是我的第一门编程语言,大约一个月前开始使用)。
我有一个 CSV 文件,其中的数据排序如下(CSV 文件数据在底部)。有 31 列数据。第一列(波长)必须作为自变量(x)读入,对于第一次迭代,它必须在第二列(即标记为“观察”的第一列)中作为因变量(y)读入。然后,我尝试将高斯+线模型拟合到数据中,并从数据中提取高斯 (mu) 的平均值,该数据应存储在数组中以供进一步分析。应针对每组观察重复此过程,而读取的 x 值必须保持不变(即来自 Wavelength 列)
这是我目前如何读取数据的代码:
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
所以我需要将该过程自动化,这样就不必手动将 y=spectral_data[:,1] 更改为 y=spectral_data[:,2] 直到 y=spectral_data[:,30]迭代,它可以简单地自动化。
我生成高斯拟合的代码如下:
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)
高斯似乎很合适(如图所示),所以这个高斯的平均值(即峰值的 x 坐标)是我必须从中提取的值。均值的值在控制台中给出(用 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
所以我的问题是,如何迭代从 csv 读取数据的过程,这样我就不必手动更改从 y 获取数据的列,然后 如何存储读取的每次迭代中的 mu 值,以便以后可以对该平均值进行进一步的分析/计算?
我的想法是我应该使用 for-loop,但我不知道该怎么做。
图中显示的橙色线是我之前尝试过的一些代码的结果。我认为这无关紧要,这就是为什么它不在问题的主要部分,但如果有必要,这就是全部。
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
【问题讨论】:
标签: python numpy for-loop matplotlib scipy