pandas:找到函数的根

时间:2015-03-20 21:16:37

标签: pandas

我在pandas中有一些数据框,其中列可以被视为索引的平滑函数:

       f     g
 x  ------------
0.1 f(0.1) g(0.1)
0.2 f(0.2) g(0.2)

...

我想知道某些x的{​​{1}}值 - 其中f(x) = y是给定的,我不一定要{{1}我正在寻找。

基本上我想在pandas中找到一条线和一个数据系列的交集。有没有最好的方法呢?

1 个答案:

答案 0 :(得分:2)

假设您的DataFrame看起来像这样:

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,你可以create an interpolation function

import scipy.interpolate as interpolate
func = interpolate.interp1d(x, df['f'], kind='linear')

然后use a root finder解决f(x)-y=0 x:

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

请注意,您需要一些数据模型。上面是线性插值器, interp1d隐含地强加了未知函数的模型 生成数据。

如果您已经拥有模型功能(例如unknown_func),那么您可以使用它而不是func返回的interp1d。如果 你有一个参数化的模型函数,而不是你可以使用的interp1d optimize.curve_fit找到最合适的参数。如果你确实选择了 为了插值,还有许多其他选择(例如二次或三次) 插值)也可以用于插值。选择什么取决于您认为最能为数据建模的内容。