Создание графика временной шкалы с фреймом данных с сгруппированными значениями, нуждающимися в цикле for - PullRequest
1 голос
/ 31 января 2020

Если у меня есть фрейм данных:

values               start time   end time
Ed, Taylor, Liv       0:00:00      0:00:15 
Ed, Liv, Peter        0:00:15      0:00:30
Taylor, Liv, Peter    0:00:30      0:00:49
Ed, Liv, Peter        0:00:49      0:01:02

Как я могу перебрать значения и создать временную шкалу (наиболее вероятно в matplotlib, возможно, plt.broken_barh ()), которая отображает отрезки времени, в которых они находятся в столбце "значения?" Например, ось X будет охватывать 0:00:00 до 0:01:02 (минимальное и максимальное значения присутствуют), а полоса для Ed будет go с 0:00:00 до 0:00:15, 0: С 00:15 до 0:30, отсутствовать с 0:00:30 до 0:00:49 и возвращаться с 0:00:49 до 0:01:02. После итерации по Ed, Taylor, Liv, а затем Peter (значения, которые будут содержаться в values.unique ()) будут преобразованы в fini sh с графиком с 4 столбцами с отсутствующими сегментами, где нет временных рядов значение для элемента "values"

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

1 Ответ

1 голос
/ 01 февраля 2020

Способ установки фрейма данных не так прост в использовании. Поскольку все имена объединены в составную строку, их необходимо разделить, чтобы их можно было использовать.

Метки времени можно преобразовать в pandas отметки времени, используя pd.to_datatime.

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

from matplotlib import pyplot as plt
import pandas as pd
from datetime import datetime
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

df = pd.DataFrame([['Ed, Taylor, Liv', '0:00:00', '0:00:15'],
                   ['Ed, Liv, Peter', '0:00:15', '0:00:30'],
                   ['Taylor, Liv, Peter', '0:00:30', '0:00:49'],
                   ['Ed, Liv, Peter', '0:00:49', '0:01:02']],
                  columns=['values', 'start time', 'end time'])
df['start time'] = pd.to_datetime(df['start time'])
df['end time'] = pd.to_datetime(df['end time'])

persons_set = set(name.strip() for names in df['values'] for name in names.split(","))
persons = {p: i for i, p in enumerate(sorted(persons_set))}
print(persons)
for person in persons:
    periods = []
    for names, start, end in zip(df['values'], df['start time'], df['end time']):
        if person in set(name.strip() for name in names.split(",")):
            periods.append((start, end - start))
    plt.broken_barh(periods, (persons[person] - 0.45, 0.9),
                    facecolors=plt.cm.plasma(persons[person] / len(persons)))

plt.yticks(range(len(persons)), persons)
plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...