Squeak.ru - шаблоны программирования

Рассчитайте разницу во времени, если разница больше часа, пометьте как «отсутствует», начертите разрыв на линейном графике в этой области.

У меня есть базовый кадр данных pandas в python, который принимает данные и строит линейный график. Каждая точка данных включает время. Если с файлом данных все работает хорошо, в идеале каждая временная метка отличается друг от друга примерно на 30 минут. В некоторых случаях данные не приходят более часа. В это время я хочу пометить этот период как «отсутствующий» и построить прерывистый линейный график, явно показывающий, где пропали данные.

Мне трудно понять, как это сделать, и даже искать решение, поскольку проблема довольно специфична. Данные «живые», они постоянно обновляются, поэтому я не могу просто указать определенную область и отредактировать ее в качестве обходного пути.

Что-то похожее на это:

Пример

Код, используемый для создания столбца даты и времени:

#convert first time columns into one datetime column
df['datetime'] = pd.to_datetime(df[['year', 'month', 'day', 'hour', 'minute', 'second']])

Я понял, как рассчитать разницу во времени, что потребовало создания нового столбца. Вот этот код на всякий случай:

df['timediff'] = (df['datetime']-df['datetime'].shift().fillna(pd.to_datetime("00:00:00", format="%H:%M:%S")))

Основной взгляд на фрейм данных:

datetime               l1    l2    l3
2019-02-03 01:52:16   0.1   0.2   0.4
2019-02-03 02:29:26   0.1   0.3   0.6
2019-02-03 02:48:03   0.1   0.3   0.6
2019-02-03 04:48:52   0.3   0.8   1.4
2019-02-03 05:25:59   0.4   1.1   1.7
2019-02-03 05:44:34   0.4   1.3   2.2

Я просто не уверен, как создать прерывистый «живой» сюжет с разницей во времени.

Заранее спасибо.


  • Во-первых, у вас есть ошибка. Ваше первое значение в timediff равно 43497 days 01:52:16. Во-вторых, что должна представлять ось y на вашем графике? Очевидно, x представляет момент времени 01.03.2019
  • хм, я сначала не заметил. не уверен, что это имеет значение, так как остальные верны, и я сосредотачиваюсь только на часах? ось y - это просто l1 и l3, которые представляют собой проценты 01.03.2019
  • Я имел в виду, что не уверен, что бы вы хотели, чтобы отображался целевой график. Что бы вы хотели, чтобы ось y отображала на желаемом графике? Что он измеряет? Это сумма l1+l2+l3? 02.03.2019
  • Я рисую две линии, l1 и l3, числа - это y-шнуры для каждого x-шнура (время) 02.03.2019

Ответы:


1

Не совсем то, что вам нужно, но быстрое и элегантное решение — повторная выборка ваших данных.

df = df.set_index('datetime')
df
                      l1   l2   l3
datetime                          
2019-02-03 01:52:16  0.1  0.2  0.4
2019-02-03 02:29:26  0.1  0.3  0.6
2019-02-03 02:48:03  0.1  0.3  0.6
2019-02-03 04:48:52  0.3  0.8  1.4
2019-02-03 05:25:59  0.4  1.1  1.7
2019-02-03 05:44:34  0.4  1.3  2.2
df.resample('30T').mean()['l1'].plot(marker='*')

сюжет с повторной выборкой


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

from datetime import timedelta

# get difference between consecutive timestamps
dt = df.index.to_series()
td = dt - dt.shift()

# generate a new group index every time the time difference exceeds
# an hour
gp = np.cumsum(td > timedelta(hours=1))

# get current axes, plot all groups on the same axes
ax = plt.gca()
for _, chunk in df.groupby(gp):
    chunk['l1'].plot(marker='*', ax=ax)

разрезанный участок

Кроме того, вы можете добавить «дыры» в свои данные.

# find samples which occurred more than an hour after the previous
# sample
holes = df.loc[td > timedelta(hours=1)]

# "holes" occur just before these samples
holes.index -= timedelta(microseconds=1)

# append holes to the data, set values to NaN
df = df.append(holes)
df.loc[holes.index] = np.nan

# plot series
df['l1'].plot(marker='*')

участок с дырками

01.03.2019
  • Я думаю, что я хочу сделать отверстия, но я получаю ключевую ошибку с df.set_index('datetime') (KeyError: 'datetime'). Я использую set_index с datetime для повторной выборки ранее в коде, чтобы получить некоторые средние и максимальные значения, так что это может быть проблемой, но я не уверен. 09.03.2019
  • @ user279955, если ваш фрейм данных уже проиндексирован по отметке времени, вы можете пропустить этот шаг. 09.03.2019
  • индексация кажется правильной, когда я печатаю каждый шаг, но при этом я получаю ключевую ошибку. Когда я не получаю эту ошибку: TypeError: '›' не поддерживается между экземплярами 'float' и 'datetime.timedelta' 09.03.2019
  • то есть я вижу, что новый индекс настроен так, чтобы каждая разница во времени была точной. ошибка появляется в следующем экземпляре df[ ' _ ' ], например, когда я перехожу к графику 09.03.2019

  • 2

    Решено с помощью моего нового столбца timediff и функции df.loc.

    df['timediff'] = (df['datetime']-df['datetime'].shift().fillna(pd.to_datetime("00:00:00", format="%H:%M:%S")))
    

    Благодаря этому я смог собрать разницу во времени для каждой строки.

    Затем, используя df.loc, я смог найти значения в столбцах l1 и l2, где timediff превышал час, и затем создать nan. В результате в сюжете в тот момент времени отсутствовала линия, как я и хотел.

    missing_l1 = df['l1'].loc[df['timediff'] > timedelta(hours=1)] = np.nan
    missing_l2 = df['l2'].loc[df['timediff'] > timedelta(hours=1)] = np.nan
    
    12.03.2019

    3

    Редактировать: @Igor Raush дал лучший ответ, но я все равно оставляю его, так как визуализация немного отличается.

    Посмотрите, поможет ли это вам:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Track the time delta in seconds
    # I used total_seconds() and not seconds as seconds are limited to the amount of secs in one day
    df['timediff'] = (df['datetime'] - df['datetime'].shift(1)).dt.total_seconds().cumsum().fillna(0)
    # Create a dataframe of all the possible seconds in the time range
    all_times_df = pd.DataFrame(np.arange(df['timediff'].min(), df['timediff'].max()), columns=['timediff']).set_index('timediff')
    # Join the dataframes and fill nulls with 0s, so the values change only where data has been received
    live_df = all_times_df.join(df.set_index('timediff')).ffill()
    # Plot only your desired columns
    live_df[['l1', 'l3']].plot()
    plt.show()
    

    Вывод

    01.03.2019
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...