ガウス関数でフィットしたい
\[f = a \exp \left( - \frac{ (x-b)^{2} }{2 c^{2}} \right)\]
1import pandas as pd
2import numpy as np
3from scipy.optimize from curve_fit
4
5def gauss_function(x, amp, mu, sigma):
6 """ガウス関数
7 Args:
8 x(array-like): データ
9 a(float): 振幅
10 mu(float): 平均
11 sigma(float): 標準偏差
12 Returns:
13 f(ndarray): ガウス関数
14 """
15 # 分子と分母に分けて計算
16 n = (x - mu)**2
17 d = 2 * sigma**2
18 f = amp * np.exp(-n/d)
19 return f
20
21def fit(data: pd.DataFrame, x: str, y: str) :
22 """
23 Args:
24 data(pd.DataFrame): 測定データ
25 x(str): X軸に使うカラム名
26 y(str): Y軸に使うカラム名
27 """
28
29 copied = data.copy()
30
31 func = gaus_function
32 x_data = copied[x]
33 y_data = copied[y]
34 p_init = [a0, mu0, sigma0]
35
36 popt, pcov = curve_fit(func, x_data, y_data, p_init)
37 perr = np.sqrt(np.diag(pcov))
38
39 amp, mu, sigma = popt
40 amp_error, mu_error, sigma_error = perr
41
42 print(f"Amplitude: {amp} +/- {amp_error}")
43 print(f"Mean: {mu} +/- {mu_error}")
44 print(f"Sigma: {sigma} +/- {sigma_error}")
45
46 xmin = x_data.min()
47 xmax = x_data.max()
48 x_fit = np.arange(xmin, xmax, 0.1)
49 y_fit = func(x_fit, mu, sigma)
50
51 return popt, perr, x_fit, y_fit