【发布时间】:2022-01-20 04:34:06
【问题描述】:
我想用curve_fit做指数回归,这样我就可以计算出我数据的年增长率了。
x 是年份,y 是资产。如果合适,增长率应该是exp(b) - 1。但它返回 (1.0, 1.0, 1.0) 作为 popt。
import pandas as pd
import numpy as np
import scipy.stats as stats
from datetime import datetime
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
df = pd.DataFrame([
[2011, 255],
[2012, 349],
[2013, 449],
[2014, 554],
[2015, 658]
], columns=['x', 'y'])
def func(x, a, b, c):
return a * np.exp(b * x + c)
popt, pcov = curve_fit(func, df['x'], df['y'])
print('popt', popt)
df['y1'] = func(df['x'], *popt)
print('df\n', df)
plt.plot(df['x'], df['y'])
plt.plot(df['x'], df['y1'], 'g--',
label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.xlabel('x')
plt.xlabel('y')
plt.legend()
plt.show()
输出:
popt [1.0 1.0 1.0]
df
x y y1
0 2011 255 inf
1 2012 349 inf
2 2013 449 inf
3 2014 554 inf
4 2015 658 inf
如果我将 x 更改为 [1, 2, 3, 4, 5],它可能适合。
【问题讨论】:
标签: python scipy scipy-optimize