【问题标题】:Python/Plotly: How to extract 'm' and 'b' from OLS line?Python/Plotly:如何从 OLS 行中提取“m”和“b”?
【发布时间】:2020-01-29 21:25:55
【问题描述】:

我正在使用 Plotly lib 可视化我的 OLS 回归线并尝试从 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 函数中执行或不使用正则表达式?

感谢您的帮助!

【问题讨论】:

  • 我尝试过使用 .split(
    )
    - 它让我可以提取 'Observations = 0.000411 * Date + -603422.036990',但不完全是我想要的...... .

标签: python regex string plotly text-extraction


【解决方案1】:

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

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)

【讨论】:

  • 谢谢,使用fit_results.params[0]fit_results.params[1] 正是我想要的!
  • 这就是我们构建它的目的!抱歉,文档中的内容不够清楚:)
【解决方案2】:

我不熟悉 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)

【讨论】:

  • 是的,我希望有一种更简单的方法而不使用正则表达式,因为我不熟悉它;但是,您的解决方案适用于这种情况,因为我不会有科学记数法中的数字或其他任何意想不到的数字......谢谢!
  • 正则表达式往往非常有用,但起初令人生畏。我已经用替代方法编辑了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2015-02-19
  • 1970-01-01
  • 2015-01-31
相关资源
最近更新 更多