Python/Plotly: 如何从 OLS 行中提取 'm' 和 'b'?

Python/Plotly: How to extract 'm' and 'b' from OLS line?

我正在使用 Plotly 库可视化我的 OLS 回归线并尝试提取“m”和“b' 来自悬停模板中显示的 y=mx+b 方程的值...

这是它在可视化时在悬停模板中的显示方式:

使用 ols_fcast_fig.data[1].hovertemplate 它为我打印出来:

'<b>OLS trendline</b><br>Observations = 0.000411 * Date + -603422.036990<br>R<sup>2</sup>=0.952751<br><br>Date=%{x}<br>Observations=%{y} <b>(trend)</b>'

现在,我需要获取 0.000411-603422.036990 值。但是,我需要以动态方式获取它们,因为这些值会发生变化(因此不使用 [#:#] 索引位置)。 请让我知道如何以动态方式提取它们, 这样第一个值在“=”之后和“*”之前,第二个值在“+”之后和“<br 之前>'. 因此,是否可以在 Plotly 函数内或不使用正则表达式来完成?

感谢帮助!

我不熟悉 OLS 和 Plotly,我认为可能有一种更简单的方法来访问这些值,但只是为了从文本中提取它们,您可以使用像这样的 regex :

import re
text = '<b>OLS trendline</b><br>Observations = 0.000411 * Date + -603422.036990<br>R<sup>2</sup>=0.952751<br><br>Date=%{x}<br>Observations=%{y} <b>(trend)</b>'

numbers = re.findall("(-?\d[\d.]+)", text)
first_value = numbers[0] # 0.000411
second_value = numbers[1] # -603422.036990

请注意,这不适用于科学记数法中的数字,或者文本中要提取的数字之前还有其他数字(如果需要,可以通过使模式更复杂来解决这两个问题)

不使用正则表达式你可以做类似的事情

first_value = text.split('Observations = ', 1)[1].split(' ')[0]
second_value = text.split('Date + ', 1)[1].split("<br")[0]

但我建议不要使用这种方法,因为它很快就会变得混乱和脆弱

另一种选择是使用 parse

n1, n2 = parse.search("<br>Observations = {} * Date + {}<br>", text)

您可以直接访问这些数字,您不需要解析任何字符串

Plotly Express 存储 statsmodels 拟合的结果。查看 https://plot.ly/python/linear-fits/#fitting-multiple-lines-and-retrieving-the-model-parameters

对于只有一个方面的简单情况,这将打印两个参数:

import plotly.express as px

df = px.data.tips()
fig = px.scatter(df, x="total_bill", y="tip", trendline="ols")    
fit_results = px.get_trendline_results(fig).px_fit_results.iloc[0]
print(fit_results.params)