Добавить график полиномиальной линии тренда [PYTHON]

Я пытаюсь добавить полиномиальную линию тренда к графику с двумя осями Y, линия тренда должна следовать за трассировкой, отображающей недельный столбец в зависимости от времени.

Цель диаграммы — посмотреть на результат с течением времени и определить перегиб в наборе данных при введении новой переменной.

Набор данных:

date  weekly partially fully
3/28/20     2   0   0
4/4/20      5   0   0
4/11/20     3   0   0
4/18/20     6   0   0
4/25/20     2   0   0
5/2/20      3   0   0
5/9/20      5   0   0
5/16/20     1   0   0
5/23/20     0   0   0
5/30/20     2   0   0
6/6/20      2   0   0
6/13/20     0   0   0
6/20/20     0   0   0
6/27/20     0   0   0
7/4/20      0   0   0
7/11/20     0   0   0
7/18/20     0   0   0
7/25/20     1   0   0
8/1/20      0   0   0
8/8/20      0   0   0
8/15/20     0   0   0
8/22/20     1   0   0
8/29/20     1   0   0
9/5/20      1   0   0
9/12/20     0   0   0
9/19/20     0   0   0
9/26/20     0   0   0
10/3/20     0   0   0
10/10/20    0   0   0
10/17/20    0   0   0
10/24/20    4   0   0
10/31/20    4   0   0
11/7/20     15  0   0
11/14/20    6   0   0
11/21/20    2   0   0
11/28/20    1   0   0
12/5/20     4   0   0
12/12/20    4   0   0
12/19/20    7   0   0
12/26/20    0   0   0
1/2/21      7   406 0
1/9/21      5   406 0
1/16/21     11  406 0
1/23/21     8   242 395
1/30/21     2   241 396
2/6/21      5   241 396
2/13/21     4   22  615
2/20/21     6   81  625
2/27/21     2   98  625
3/6/21      3   98  625
3/13/21     1   98  625
3/20/21     2   85  693
3/27/21     5   84  709
4/3/21      5   84  710
4/10/21     2   84  760
4/17/21     3   31  849

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

Весь вспомогательный материал, с которым я столкнулся в своем легкомысленном поиске в Google до сих пор, был очень сложным для чего-то, что, как я знаю, невероятно просто в пакетах электронных таблиц, таких как Excel.

Вот мой код:

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces

fig.add_trace(go.Scatter(x=df['date'], y=df['full'], name="Indicator 2",line=dict(color="Green"),opacity=0.01,fill='tozeroy',), secondary_y=True,)

fig.add_trace(go.Scatter(x=df['date'], y=df['weekly'], name="Weekly",line=dict(color="Red")),secondary_y=False,)

# Add figure title
fig.update_layout(
    title_text="Change over Time",width = 1200, height = 600)

# Set x-axis title
fig.update_xaxes(title_text="xaxis title")

# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b> yaxis1", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b> yaxis2", secondary_y=True)

fig.show()

Это текущий вывод графика:

введите здесь описание изображения

Весьма признателен.


person John Conor    schedule 22.04.2021    source источник
comment
предоставьте свои образцы данных в виде текста, а не изображения   -  person Rob Raymond    schedule 23.04.2021
comment
@RobRaymond, вы можете показать мне, как это сделать? Когда я попытался вставить данные, в него можно было вставить только изображение...   -  person John Conor    schedule 23.04.2021
comment
вставить как текст между тройными обратными галочками. так же, как вы вставили код   -  person Rob Raymond    schedule 23.04.2021
comment
А... facepalm Спасибо! Очень ценю решение тоже.   -  person John Conor    schedule 23.04.2021
comment
@RobRaymond, обновлено (:   -  person John Conor    schedule 23.04.2021


Ответы (1)


  • синтезировали данные, похожие на данные, которые нельзя использовать без OCR
  • вы можете вычислить многочлен, используя numpy, а затем просто построить другую линию
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np

d = pd.date_range("28-mar-2020", freq="W", periods=60)
df = pd.DataFrame({"date":d, "weekly":np.random.randint(0,15,len(d)), "partial":np.random.randint(31,406,len(d)),
              "full":np.random.randint(395,850,len(d))
             }).assign(partial=lambda x: np.where(x.date.dt.year<2021,0, x.partial),
                      full=lambda x: np.where(x.date.lt("1-Feb-2021"),0, x.full))


df["smooth"] = np.polyval(np.polyfit(df["date"].astype(int),df["weekly"], 5), df["date"].astype(int))

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces

fig.add_trace(go.Scatter(x=df['date'], y=df['full'], name="Indicator 2",line=dict(color="Green"),opacity=0.01,fill='tozeroy',), secondary_y=True,)

fig.add_trace(go.Scatter(x=df['date'], y=df['weekly'], name="Weekly",line=dict(color="Red")),secondary_y=False,)
fig.add_trace(go.Scatter(x=df['date'], y=df['smooth'], name="Smooth",line=dict(color="Blue")),secondary_y=False,)


# Add figure title
fig.update_layout(
    title_text="Change over Time",width = 1200, height = 600)

# Set x-axis title
fig.update_xaxes(title_text="xaxis title")

# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b> yaxis1", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b> yaxis2", secondary_y=True)

введите здесь описание изображения

person Rob Raymond    schedule 23.04.2021