如何使用Python在数据集中的列中查找动态函数的根

我是python的初学者,我需要将R中的一些代码转换为Python。

我需要基于动态函数在数据集中的每一行找到一个根,R中的代码是:

library(rootsolve
library(dplyr)
library(plyr)

 dataset = data.frame(A = c(10,20,30),B=c(20,10,40),FX = c("A+B-x","A-B+x","A*B-x"))

 sol<- adply(dataset,1,summarize,solution_0= uniroot.all(function(x)(eval(parse(text=as.character(FX),dataset))),lower = -10000,upper = 10000,tol = 0.00001))

此代码返回[30,-10,1200]作为每行的解决方案。

在python中,我阅读了有关sciPy包优化的文档,但没有找到对我有用的代码:

我尝试了以下类似的解决方案,但没有成功:

import pandas as pd
from scipy.optimize import fsolve as fs

data = {'A': [10,30],'B': [20,40],'FX': ["A+B-x","A*B-x"]}
df = pd.DataFrame(data)

def func(FX):
    return(exec(FX))

fs(func(df.FX),x0=0,args=df) 

有人知道如何解决吗?

非常感谢。

abiaoa 回答:如何使用Python在数据集中的列中查找动态函数的根

SymPy是Python的符号数学库。您的问题可以通过以下方式解决:

import pandas as pd
from sympy import Symbol,solve
from sympy.parsing.sympy_parser import parse_expr

data = {'A': [10,20,30],'B': [20,10,40],'FX': ["A+B-x","A-B+x","A*B-x"]}

df = pd.DataFrame(data)

x = Symbol("x",real=True)

for index,row in df.iterrows():
    F = parse_expr(row['FX'],local_dict={'A': row['A'],'B': row['B'],'x':x})
    print (row['A'],row['B'],row['FX'],"-->",F,solve(F,x))

这将输出:

10 20 A+B-x --> 30 - x --> [30]
20 10 A-B+x --> x + 10 --> [-10]
30 40 A*B-x --> 1200 - x --> [1200]

请注意,SymPy的Solve返回解决方案列表。如果您确定始终只有一种解决方案,请使用solve(F,x)[0]。 (请记住,与R不同,Python总是从0开始索引。)

有了列表理解功能,您可以将解决方案编写为:

sol = [ solve(parse_expr(row['FX'],'x':x}),x)[0] for _,row in df.iterrows() ]

如果列数很多,还可以创建带有循环的字典:dict({c:row[c] for c in df.columns},**{'x':x}) )。如果要在列表推导中组合字典,则需要使用奇怪的**语法。有关字典的联合,请参见this post

cols = df.columns # change this if you won't need all columns
sol = [ solve(parse_expr(row['FX'],local_dict=dict({c:row[c] for c in cols},**{'x':x}) ),x)[0].evalf() for _,row in df.iterrows() ]

PS:SymPy通常将解决方案保持为符号形式,因为它更喜欢精确的表达式。当有分数或平方根,不会立即进行评估。要获取评估形式,请像在evalf()中一样使用solve(F,x)[0].evalf()

本文链接:https://www.f2er.com/3120980.html

大家都在问