Python 如何将statsmodels公式和参数保存为文本,以便以后进行预测?

Python 如何将statsmodels公式和参数保存为文本,以便以后进行预测?,python,regression,curve-fitting,statsmodels,Python,Regression,Curve Fitting,Statsmodels,python中的Statsmodels提供了一种很好的方法,可以使用各种R样式的公式进行线性拟合,并根据结果进行预测。进行预测所需的一切都应该包含在公式和拟合参数列表中。我只想保存这些(例如,在文本配置文件或其他脚本中,这样就不会有pickle等) 那么,只要给出原始公式和拟合参数,有没有简单的方法重建模型并进行预测 我也愿意选择statsmodels的替代方案 例如: 将numpy导入为np 将statsmodels.formula.api作为sm导入 作为pd进口熊猫 将matplotlib

python中的Statsmodels提供了一种很好的方法,可以使用各种R样式的公式进行线性拟合,并根据结果进行预测。进行预测所需的一切都应该包含在公式和拟合参数列表中。我只想保存这些(例如,在文本配置文件或其他脚本中,这样就不会有pickle等)

那么,只要给出原始公式和拟合参数,有没有简单的方法重建模型并进行预测

我也愿意选择
statsmodels
的替代方案

例如:

将numpy导入为np
将statsmodels.formula.api作为sm导入
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
#示例数据
x=np.mgrid[-1:1:10000j]
y=np.sin(x*5)
z=1+2*x+3*y+4*x*y+5*x**2+6*y**2+(np.random.rand(len(x))-.5)
df=pd.DataFrame(data=np.c_uux,y,z],columns=['x','y','z'])
#拟合数据
公式='z~1+x*y+I(x**2)+I(y**2)'
结果=sm.ols(公式,数据=df).fit()
打印(result.summary())
#以文本格式保存公式和参数
保存的_公式='z~'+'+'.join(result.params.index).replace('Intercept','1')#(这是必需的吗?)
已保存的参数=result.params.values
打印(保存的公式)
打印(保存的参数)
#加载公式/参数

model=result.predict#我一直在深入挖掘,它看起来像是
statsmodels
使用
patsy
作为函数语言,并生成数组来进行矩阵运算。因此,可以用patsy手动重新实现“预测”功能,如下所示:

# Save formula and params in text freindly way                                                                                        
#saved_formula = 'z ~ ' + '+'.join(result.params.index).replace('Intercept','1') # (is this necessary?)                               
saved_formula = formula                                                                                                               
saved_params = result.params.to_dict()                                                                                                
                                                                                                                                      
# Load the formula/params                                                                                                             
import patsy                                                                                                                          
def predict(data, formula) :                                                                                                          
    formula_rhs = formula.split('~')[1].strip()                                                                                       
    x_data = patsy.dmatrix(formula_rhs, data=df)                                                                                      
    ordered_terms = x_data.design_info.term_names                                                                                     
    ordered_params = list(map(saved_params.get, ordered_terms))                                                                       
    return x_data @ ordered_params                                                                                                  
                                                                                                                                      
model = lambda x : predict(x, saved_formula) 
这可以简化一点,但我担心重构矩阵中的参数顺序可能与原始矩阵不同。不确定这是否真的会引起关注,但我认为我所做的并不是。我更改了要保存为字典的参数。生成新的数据矩阵,然后在我知道列的顺序后,我从保存的参数dict中提取参数
# Save formula and params in text freindly way                                                                                        
#saved_formula = 'z ~ ' + '+'.join(result.params.index).replace('Intercept','1') # (is this necessary?)                               
saved_formula = formula                                                                                                               
saved_params = result.params.to_dict()                                                                                                
                                                                                                                                      
# Load the formula/params                                                                                                             
import patsy                                                                                                                          
def predict(data, formula) :                                                                                                          
    formula_rhs = formula.split('~')[1].strip()                                                                                       
    x_data = patsy.dmatrix(formula_rhs, data=df)                                                                                      
    ordered_terms = x_data.design_info.term_names                                                                                     
    ordered_params = list(map(saved_params.get, ordered_terms))                                                                       
    return x_data @ ordered_params                                                                                                  
                                                                                                                                      
model = lambda x : predict(x, saved_formula) 
import json
saved_params_string = json.dumps(saved_params)
json.loads(saved_params_string)