Как убрать выходные с участка с помощью Plotly? - PullRequest
1 голос
/ 10 июля 2020

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

Данные выглядят следующим образом:

+-----------------------+---------------------+-------------+-------------+
|          asof         |    INSERTED_TIME    | DATA_SOURCE |    PRICE    |
+-----------------------+---------------------+-------------+-------------+
| 2020-06-17   00:00:00 | 2020-06-17 12:00:15 | DB          | 170.4261757 |
+-----------------------+---------------------+-------------+-------------+
| 2020-06-17   00:00:00 | 2020-06-17 12:06:10 | DB          | 168.9348656 |
+-----------------------+---------------------+-------------+-------------+
| 2020-06-17   00:00:00 | 2020-06-17 12:06:29 | DB          | 168.8412129 |
+-----------------------+---------------------+-------------+-------------+
| 2020-06-17   00:00:00 | 2020-06-17 12:07:27 | DB          | 169.878796  |
+-----------------------+---------------------+-------------+-------------+
| 2020-06-17   00:00:00 | 2020-06-17 12:10:28 | DB          | 169.3685879 |
+-----------------------+---------------------+-------------+-------------+
| 2020-06-17   00:00:00 | 2020-06-17 12:12:14 | DB          | 169.0787045 |
+-----------------------+---------------------+-------------+-------------+
| 2020-06-17   00:00:00 | 2020-06-17 12:12:33 | DB          | 169.7561092 |
+-----------------------+---------------------+-------------+-------------+

График с учетом перерывов на выходных

Использование line function Я получаю график ниже, с прямыми линиями, идущими от конца дня пятницы до утра понедельника. Используя px.scatter, я не получаю линию, но все равно получаю пробел.

import plotly.express as px
import pandas as pd

sampledf = pd.read_excel('sample.xlsx')

fig_sample = px.line(sampledf, x = 'INSERTED_TIME', y= 'PRICE', color = 'DATA_SOURCE')
fig_sample.show()

enter image description here

Attempt with no weekend breaks

fig_sample = px.line(sampledf, x = 'INSERTED_TIME', y= 'PRICE', color = 'DATA_SOURCE')
fig_sample.update_xaxes(
    rangebreaks=[
        dict(bounds=["sat", "mon"]) #hide weekends
    ]
)
fig_sample.show()

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

Использование разрыва диапазона приводит к пустому графику.

Любая помощь приветствуется. Спасибо

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Существует ограничение на 1000 строк при использовании rangebreaks При работе с более чем 1000 строками добавьте параметр render_mode='svg'

В приведенном ниже коде я использовал функцию scatter, но как видите, больших перерывов на выходных больше нет. Кроме того, я исключил время с 23:00 до 11:00

sampledf = pd.read_excel('sample.xlsx')

fig_sample = px.scatter(sampledf, x = 'INSERTED_TIME', y= 'PRICE', color = 'DATA_SOURCE', render_mode='svg')
fig_sample.update_xaxes(
    rangebreaks=[
        { 'pattern': 'day of week', 'bounds': [6, 1]}
        { 'pattern': 'hour', 'bounds':[23,11]}
    ]
)
fig_sample.show()

enter image description here

The values in the plot are different from the original data set, but will work with the data in the original post. Found help здесь

0 голосов
/ 13 июля 2020

Похоже, что ось x на пустом графике даже не имеет правильного диапазона, поскольку она начинается в другом году. Трудно объяснить поведение, не глядя на точный ввод данных, но вы можете начать с рабочего, более простого набора данных и попытаться проверить различия (попробуйте построить отфильтрованную версию данных с выбранными точками или проверить различия в dtypes DataFrame, et c).

Вы увидите ожидаемое поведение с более простым набором данных:

import plotly.express as px
import pandas as pd
from datetime import datetime
d = {'col1': [datetime(2020, 5, d) for d in range(1, 30)],
     'col2': [d if (d + 3) % 7 not in (5, 6) else 0 for d in range(1, 30)]}
df = pd.DataFrame(data=d)
df.set_index('col1')

df_weekdays = df[df['col1'].dt.dayofweek.isin([0,1,2,3,4])]

f = px.line(df, x='col1', y='col2')
f.update_xaxes(
    rangebreaks=[
        dict(bounds=["sat", "mon"]), #hide weekends
    ]
)
f.show()

with breaks

For the DataFrame without weekends, df_weekdays, it's a similar image:

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

...