ガウス関数でフィットしたい

\[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