我在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中找到一条线和一个数据系列的交集。有没有最好的方法呢?
答案 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
找到最合适的参数。如果你确实选择了
为了插值,还有许多其他选择(例如二次或三次)
插值)也可以用于插值。选择什么取决于您认为最能为数据建模的内容。