График для непрерывных данных в Python - PullRequest
0 голосов
/ 14 мая 2018

У меня есть CSV-файл с 2 столбцами:

  • col1- Timestamp данные (гггг-мм-дд чч: мм: сс.мс (данные за 8 месяцев))

  • col2: данные по теплу (непрерывная переменная).

Поскольку существует почти 50 тыс. Записей, я хотел бы разделить col1 (временная метка col) на месяцы или недели, а затем применить коробочный график к тепловым данным с временной меткой.Я пробовал в R, это занимает много времени.Нужна помощь, чтобы сделать в Python.Я думаю, что мне нужно использовать seaborn.boxplot.

Пожалуйста, руководство.

1 Ответ

0 голосов
/ 14 мая 2018

Группировка по частоте, затем построение групп

Сначала Считайте данные CSV в кадр данных Pandas

import numpy as np
import Pandas as pd
from matplotlib import pyplot as plt

# assumes NO header line in csv
df = pd.read_csv('\file\path', names=['time','temp'], parse_dates=[0])

Я буду использовать некоторые фальшивые данные, 30-дневные почасовые выборки.

heat = np.random.random(24*30) * 100
dates = pd.date_range('1/1/2011', periods=24*30, freq='H')
df = pd.DataFrame({'time':dates,'temp':heat})

Установить метки времени в качестве индекса DataFrame

df = df.set_index('time')

Теперь сгруппируйте по нужному периоду, семь дней для этого примера

gb = df.groupby(pd.Grouper(freq='7D'))

Теперь вы можете строить каждую группу отдельно

for g, week in gb2:
    #week.plot()
    week.boxplot()
    plt.title(f'Week Of {g.date()}')
    plt.show()
    plt.close()

И ... я не знал, что ты мог бы сделать это, но это круто

ax = gb.boxplot(subplots=False)
plt.setp(ax.xaxis.get_ticklabels(),rotation=30)
plt.show()
plt.close()

Weekly Temps


heat = np.random.random(24*300) * 100
dates = pd.date_range('1/1/2011', periods=24*300, freq='H')
df = pd.DataFrame({'time':dates,'temp':heat})
df = df.set_index('time')

Чтобы разделить данные на пять периодов времени, получите еженедельные блокпосты каждого:

Определите общий промежуток времени; разделить на пять; создать частотный псевдоним; затем групповой

dt = df.index[-1] - df.index[0]
dt = dt/5
alias = f'{dt.total_seconds()}S'
gb = df.groupby(pd.Grouper(freq=alias))

Каждая группа - это DataFrame, поэтому итерируйте по группам; создайте еженедельно групп из каждой и составьте для них график.

for g,d_frame in gb:
    gb_tmp = d_frame.groupby(pd.Grouper(freq='7D'))
    ax = gb_tmp.boxplot(subplots=False)
    plt.setp(ax.xaxis.get_ticklabels(),rotation=90)
    plt.show()
    plt.close()

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

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

n = len(df) // 5
for tmp_df in (df[i:i+n] for i in range(0, len(df), n)):
    gb_tmp = tmp_df.groupby(pd.Grouper(freq='7D'))
    ax = gb_tmp.boxplot(subplots=False)
    plt.setp(ax.xaxis.get_ticklabels(),rotation=90)
    plt.show()
    plt.close()

Псевдонимы частот
pandas.read_csv ()
pandas.Grouper ()

...