Как вывести данные за час, сгруппированные по дням? - PullRequest
0 голосов
/ 29 мая 2019

Фон: от большого DataFrame Я отфильтровал записи для year=2013, month=June, недели с 3 по 9 (с понедельника по воскресенье). Затем я сгруппировал данные по day, hour и user_type и повернул таблицу, чтобы получить DataFrame, который выглядит следующим образом:

   Day  Hour  Casual  Registered  Casual_percentage
0  3    0     14      19          42.42
1  3    1     8       8           50.00
2  3    2     1       3           25.00
3  3    3     2       1           66.67
4  3    4     1       3           25.00
5  3    5     1       17          5.56
.  .    .     .       .           .

Для каждого дня у меня есть 24 часа, поэтому для дня 4 (вторник) данные начинаются как:

.  .    .     .       .           .  
21 3    21    32      88          26.67
22 3    22    26      64          28.89
23 3    23    23      30          43.40
24 4    0     10      11          47.62
25 4    1     1       5           16.67
26 4    2     1       1           50.00
.  .    .     .       .           .

Как я могу построить Casual и Registered переменных для Hour, для каждого из 7 Day с? Нужно ли создавать 7 разных сюжетов и выравнивать их по одной фигуре?

Текущий код. Я чувствую, что я далеко. Я также попытался создать вторую ось x (для Days), используя документацию .

def make_patch_spines_invisible(ax):
    ax.set_frame_on(True)
    ax.patch.set_visible(False)
    for sp in ax.spines.values():
        sp.set_visible(False)

fig, ax1 = plt.subplots(figsize=(10, 5))
ax1.set(xlabel='Hours', ylabel='Total # of trips started')

ax1.plot(data.Hour, data.Casual, color='g')
ax1.plot(data.Hour, data.Registered, color='b')


"""This part is trying to create the 2nd x-axis (Days)"""
ax2 = ax1.twinx()
#offset the bottom spine
ax2.spines['bottom'].set_position(('axes', -.5))
make_patch_spines_invisible(ax2)
#show bottomm spine
ax2.spines['bottom'].set_visible(True)
ax2.set_xlabel("Days")


plt.show()

Выход: enter image description here

Конечная цель

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Я думаю, что это будет проще, если вы работаете с datetime объектами, а не Day, Hour строками.
Таким образом, вы сможете использовать указатели и форматеры отметок даты наряду с основными и второстепенными тиками .

Даже если вы не упомянули об этом, я предполагаю, что вы можете использовать pandas для работы с фреймами данных.
Я создал новый фрейм данных, многократно копируя предоставленные вами данные и вырезая некоторые из них (это не так важно).
Здесь я перестроил даты из предоставленной вами информации, но я предлагаю работать непосредственно с ними (я полагаю, что в исходном фрейме данных есть какое-то поле, похожее на дату).

import pandas as pd
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates

df = pd.read_csv("mydataframe.csv")
df["timestamp"] = "2013-06-" + df["Day"].astype(str).str.zfill(2) + "-" + df["Hour"].astype(str).str.zfill(2)
df["timestamp"] = pd.to_datetime(df["timestamp"], format="%Y-%m-%d-%H")


fig, ax1 = plt.subplots(figsize=(10, 5))
ax1.set(xlabel='', ylabel='Total # of trips started')
ax1.plot(df["timestamp"], df.Casual, color='g')
ax1.plot(df["timestamp"], df.Registered, color='b')

ax1.xaxis.set(
    major_locator=mdates.DayLocator(),
    major_formatter=mdates.DateFormatter("\n\n%A"),
    minor_locator=mdates.HourLocator((0, 12)),
    minor_formatter=mdates.DateFormatter("%H"),
)
plt.show()

Выход:

formatted dataframe

0 голосов
/ 30 мая 2019

Предполагая, что ваши данные упорядочены по индексу (например, 0 - 24 - это день 3, 25 - 48 - это день 4 и т. Д.), Вы можете отобразить значения индекса, а не часы в вашем коде:

ax1.plot(data.index.values, df.Casual, color='g')
ax1.plot(data.index.values, df.Registered, color='b')

Это даст график, аналогичный тому, что вы ищете в качестве конечного продукта (заметьте, я использовал поддельные данные):

enter image description here

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