Plotly: как показать линию тренда для данных временных рядов, используя plotly express? - PullRequest
1 голос
/ 06 мая 2020

Используя встроенный фрейм данных "tips" в plotly express, я сначала создаю столбец datetime.

import plotly.express as px
import pandas as pd
from datetime import datetime

df_tips = px.data.tips()
datelist = pd.date_range(datetime.today(), periods=df_tips.shape[0]).tolist()
df_tips['date'] = datelist

Использование столбца datetime в качестве оси x дает ошибку:

px.scatter(df_tips,x='date',y='tip',trendline='ols')    
...
TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32]

Использование любого другого столбца - нет. Есть ли хороший способ сделать это?

1 Ответ

0 голосов
/ 07 мая 2020

Самый безопасный подход - запустить регрессию на сериализованном представлении ваших дат, а затем настроить ось x для отображения в виде строк. Под сериализованным представлением я подразумеваю, например, подход, предложенный Ben.T в его комментарии, или тот, который используется в Plot best fit line with plotly . Затем вы можете настроить макет оси x, используя:

fig.update_xaxes(tickangle=45,
                 tickmode = 'array',
                 tickvals = df_tips['date'][0::40],
                 ticktext= [d.strftime('%Y-%m-%d') for d in datelist[0::40]])

Часть df_tips['date'][0::40] гарантирует, что между каждой отметкой есть некоторое пространство.

График 1:

enter image description here

Этот подход даже хорошо работает, если вы хотите использовать другие измерения вашего набора данных, например: fig = px.scatter(df_tips,x='date',y='tip', color = 'sex', trendline='ols') :

Участок 2:

enter image description here

Полный код:

import plotly.express as px
import pandas as pd
from datetime import datetime

df_tips = px.data.tips()
df_tips['date'] = df_tips.index
datelist = pd.date_range(datetime.today(), periods=df_tips.shape[0]).tolist()

fig = px.scatter(df_tips,x='date',y='tip', trendline='ols')
fig = px.scatter(df_tips,x='date',y='tip', color = 'sex', trendline='ols')  

fig.update_xaxes(tickangle=45,
                 tickmode = 'array',
                 tickvals = df_tips['date'][0::40],
                 ticktext= [d.strftime('%Y-%m-%d') for d in datelist])

fig.show()
...