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)
我正在使用 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)