Pandas 熊猫:寻找函数的根
我在pandas中有一些数据框,其中的列可以看作是索引的平滑函数:Pandas 熊猫:寻找函数的根,pandas,Pandas,我在pandas中有一些数据框,其中的列可以看作是索引的平滑函数: f g x ------------ 0.1 f(0.1) g(0.1) 0.2 f(0.2) g(0.2) ... 我想知道一些f(x)=y的x值,其中y是给定的,我不一定在我要找的x上有点 本质上,我想找到熊猫中一条直线和一个数据系列的交点。有没有最好的方法可以做到这一点?假设您的数据帧如下所示: import numpy as np import pandas as pd def unkno
f g
x ------------
0.1 f(0.1) g(0.1)
0.2 f(0.2) g(0.2)
...
我想知道一些f(x)=y
的x
值,其中y
是给定的,我不一定在我要找的x
上有点
本质上,我想找到熊猫中一条直线和一个数据系列的交点。有没有最好的方法可以做到这一点?假设您的数据帧如下所示:
import numpy as np
import pandas as pd
def unknown_func(x):
return -x ** 3 + 1
x = np.linspace(-10, 10, 100)
df = pd.DataFrame({'f': unknown_func(x)}, index=x)
然后,使用scipy,您可以:
然后求解x的f(x)-y=0
:
import scipy.optimize as optimize
root = optimize.brentq(lambda x: func(x)-y, x.min(), x.max())
请注意,您需要一些数据模型。上面是线性插值器, 隐式地为未知函数施加一个模型 生成数据 如果您已经有一个模型函数(例如
unknown\u func
),那么您可以使用它来代替interp1d
返回的func
。如果
您有一个参数化模型函数,然后可以使用
寻找最佳拟合参数。如果你选择了
要进行插值,还有许多其他选择(例如二次或三次
插值)用于您可能也会使用的插值。选择什么取决于您认为对数据建模最好的方法
import scipy.optimize as optimize
root = optimize.brentq(lambda x: func(x)-y, x.min(), x.max())
import numpy as np
import pandas as pd
import scipy.optimize as optimize
import scipy.interpolate as interpolate
def unknown_func(x):
return -x ** 3 + 1
x = np.linspace(-10, 10, 100)
df = pd.DataFrame({'f': unknown_func(x)}, index=x)
y = 50
func = interpolate.interp1d(x, df['f'], kind='linear')
root = optimize.brentq(lambda x: func(x)-y, x.min(), x.max())
print(root)
# -3.6566397064
print(func(root))
# 50.0
idx = np.searchsorted(df.index.values, root)
print(df.iloc[idx-1:idx+1])
# f
# -3.737374 53.203496
# -3.535354 45.187410