Python / Plotly: как извлечь 'm' и 'b' из строки OLS? - PullRequest
0 голосов
/ 30 января 2020

Я использую Plotly lib для визуализации моей линии регрессии OLS и пытаюсь извлечь значения ' m ' и ' b ' из y = mx + b уравнение, которое отображается в шаблоне наведения ...

Вот как оно отображается в шаблоне наведения при визуализации:

enter image description here

Используя 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 и * Значения 1026 * -603422.036990 . Однако мне нужно получить их динамически c способом, так как эти значения будут меняться (поэтому без использования позиций индекса [#: #]). Пожалуйста, дайте мне знать, как я могу извлечь их динамически c, так, чтобы первое значение было после '=' и до '*', а второе значение после '+' и до '<<em> br > '. Таким образом, можно ли выполнять функции Plotly или без использования регулярных выражений?

Помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы можете получить доступ к этим номерам напрямую, вам не нужно разбирать любые строки !

Plotly Express сохраняет результаты подгонки statsmodels. Проверьте https://plot.ly/python/linear-fits/#fitting -multiple-line-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)
1 голос
/ 30 января 2020

Я не знаком с OLS и Plotly, и я думаю, что, вероятно, есть более простой способ получить доступ к этим значениям, но просто для извлечения их из текста вы можете использовать регулярное выражение , как этот :

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

Обратите внимание, что это не будет работать с числами в научной нотации c или если есть другие числа перед теми, которые вы хотите извлечь в тексте (обе проблемы можно решить, если необходимо, шаблон более сложный)

Без использования регулярных выражений вы можете сделать что-то вроде

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)
...