如何使用 Python 查找基于数据集列的动态函数的根
How to find a root of a dynamic function based in columns of a dataset using 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))
此代码 return [30,-10,1200] 作为每一行的解决方案。
在 python 中,我阅读了 sciPy 包的优化文档,但我没有找到适合我的代码:
我尝试了如下解决方案,但没有成功:
import pandas as pd
from scipy.optimize import fsolve as fs
data = {'A': [10,20,30],
'B': [20,10,40],
'FX': ["A+B-x","A-B+x","A*B-x"]}
df = pd.DataFrame(data)
def func(FX):
return(exec(FX))
fs(func(df.FX),x0=0,args=df)
有人知道如何解决这个问题吗?
非常感谢。
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 解决了 returns 解决方案列表。如果您确定总是只有一种解决方案,请使用 solve(F, x)[0]
。 (请记住,与 R 不同,Python 总是从 0 开始索引。)
通过列表理解,您可以将解决方案写成:
sol = [ solve(parse_expr(row['FX'], local_dict={'A': row['A'], 'B': row['B'], '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()
.
我是 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))
此代码 return [30,-10,1200] 作为每一行的解决方案。
在 python 中,我阅读了 sciPy 包的优化文档,但我没有找到适合我的代码:
我尝试了如下解决方案,但没有成功:
import pandas as pd
from scipy.optimize import fsolve as fs
data = {'A': [10,20,30],
'B': [20,10,40],
'FX': ["A+B-x","A-B+x","A*B-x"]}
df = pd.DataFrame(data)
def func(FX):
return(exec(FX))
fs(func(df.FX),x0=0,args=df)
有人知道如何解决这个问题吗?
非常感谢。
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 解决了 returns 解决方案列表。如果您确定总是只有一种解决方案,请使用 solve(F, x)[0]
。 (请记住,与 R 不同,Python 总是从 0 开始索引。)
通过列表理解,您可以将解决方案写成:
sol = [ solve(parse_expr(row['FX'], local_dict={'A': row['A'], 'B': row['B'], '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()
.