Могу ли я отображать ТОЛЬКО последовательные минуты в наборе данных с прерывистым временным рядом?

#python #pandas #plotly

#python #pandas #график

Вопрос:

Я хочу иметь возможность соединять точки на этих графиках, но я хочу соединять графики ТОЛЬКО там, где разница во временных рядах последовательна (интервалы в 1 минуту). То, что я сделал, это извлек конкретные точки интереса из базы данных временных рядов, используя метод маскирования в Python и Pandas dataframe, и нанес их с помощью plotly. Когда данные находятся с интервалом в 1 минуту, они выглядят очень близко друг к другу на графике. Вот как выглядят графики в настоящее время. введите описание изображения здесь

Кажется, я не могу найти какой-либо способ сделать это, за исключением этой ссылки, чтобы поместить «None» между последовательными частями. Я знаю, что мог бы выполнить цикл for и добавить «None» между данными, когда timedelta составляет> 1 минуты, но я надеялся, что у plotly есть какой-то способ просто сделать это, установив параметр для интервалов оси X.

 fig.add_trace(go.Scatter(
    x=x,
    y=[10, 20, None, 15, 10, 5, 15, None, 20, 10, 10, 15, 25, 20, 10],
    name = '<b>No</b> Gaps', # Style name/legend entry with html tags
    connectgaps=True # override default to connect the gaps
  

Пробелы на красных линиях являются примером того, как я хочу, чтобы график выглядел. Взято из документации plotly.
введите описание изображения здесь

Комментарии:

1. Это помогло бы увидеть ваш код и некоторые данные. Я думаю , что это можно сделать, когда вы выполняете маскировку в python / pandas None , затем вставляете туда.

2. Я не уверен, что именно вы ищете. Вопросы «Я хочу делать то, что указано в документации, но без этих шагов», как правило, не одобряются. Вы ищете совет о том, как вставлять None значения в масштабе? Есть ли причина, по которой в вашей трассировке не может быть пропущенных значений? Вы пытаетесь выполнить некоторые манипуляции с отдельными сегментами?

Ответ №1:

 # The idea is to create a consecutive set where missing pieces are `nan`

import pandas as pd
import plotly.graph_objects as go

# ----- this is to create sample data -----

timeX = pd.to_datetime(['2020-01-01 00:00',
    '2020-01-01 00:01',
    '2020-01-01 00:02',  #mind the gap
    '2020-01-01 00:05',
    '2020-01-01 00:06',  #mind the gap
    '2020-01-01 00:11',
    '2020-01-01 00:12',
    '2020-01-01 00:13'])
valuesY = [2,3,2,4,5,3,1,2]

df = pd.DataFrame(data=[timeX,valuesY]).T
df.columns = ['timeX','valuesY']

# ------ here I create a consecutive range (of minutes) ----

startX = min(df['timeX'])
endX = max(df['timeX'])
daterange = pd.date_range(start=startX,end=endX,freq='1Min')
ef = pd.DataFrame(data=daterange, columns=['timeX'])

# ------ by merging with left join on timeX missing matches become nan

ef = ef.merge(df, on='timeX', how='left')

# ------ eliminating the connectgaps feature shows the connected parts only

fig = go.Figure(data=go.Scatter(
    x=ef['timeX'],
    y=ef['valuesY'],
    name = 'with Gaps')) # override default to connect the gaps

fig.show()
  

Комментарии:

1. Спасибо! Это именно та помощь, в которой я нуждался! Волшебный трюк здесь заключается в объединении столбцов для принудительного ввода значений nan. Гениально!

Ответ №2:

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

Вставка None , вероятно, была бы моим первым выбором при создании таких графиков. Если вы хотите больше контроля над отдельными сегментами строки, вы можете попробовать что-то вроде

  1. разделите данные на сегменты (что само по себе является сложной процедурой), при этом каждый сегмент становится отдельным экземпляром трассировки / разброса в списке трассировок рисунка. (Обычно я предпочитаю использовать go.Figure(data=[<list of traces>]) формат, а не вызовы Figure.add_trace() , но YMMV.)
  2. Используйте legendgroup showlegend line опции и и, чтобы разные сегменты выглядели как одна и та же трассировка для просмотра, но на самом деле были отдельными трассировками внутри.