Выравнивание панелей данных панд как панелей - PullRequest
0 голосов
/ 27 апреля 2018

У меня 12 фреймов одинаковой формы за 12 лет сбора данных. Мне нужно использовать это в качестве панели для отображения различных значений столбца по оси временных рядов (лет). Следовательно, я думаю, что я должен выровнять эти рамки как панели.

  1. Может ли кто-нибудь помочь мне с выравниванием данных в виде панелей?
  2. Это правильный способ сделать это, чтобы подготовиться к прокладке вдоль 3-го измерения?

enter image description here

Некоторые примеры данных:

# for 2015
Grave Crimes    Cases Recorded  Mistake of Law fact
Abduction       725             3
Kidnapping      246             6
Arson           466             1
Mischief        436             1
House Breaking  12707           21
Grievous Hurt   1299            3

# for 2016
Grave Crimes    Cases Recorded  Mistake of Law fact
Abduction       738             4
Kidnapping      297             9
Arson           486             4
Mischief        394             1
House Breaking  10287           14
Grievous Hurt   1205            0

# for 2017
Grave Crimes    Cases Recorded  Mistake of Law fact
Abduction       647             2
Kidnapping      251             10
Arson           418             3
Mischief        424             0
House Breaking  8913            12
Grievous Hurt   1075            1

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Предполагая, что ваши DataFrames названы как df15, df16, df17, вы можете создать панель с ними как:

pnl = pd.Panel({2015: df15, 2016: df16, 2017: df17})

После этого вы можете сделать 3D-сюжет, упомянутый в вашем вопросе, следующим образом:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

for i in range(2015, 2018):
    ax.bar(pnl.major_axis.values, pnl[i]['Cases Recorded'], zdir='y', zs=i)

ax.yaxis.set_ticks(range(2015, 2018))
ax.yaxis.set_ticklabels(range(2015, 2018))

example of a 3D-plot of your data

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

Даже если набор данных имеет трехмерную или более структурированную структуру, часто бывает хорошим выбором создать хорошо спроектированный двухмерный график. 3D часто привлекает внимание, но чтобы проинформировать целевую аудиторию и показать определенные свойства данных, вы почти сойдете с 2d. Имея это в виду, подход Ами Тавори был бы лучшим путем, поскольку структуру данных легче обрабатывать:

df15['year'] = 2015
df16['year'] = 2016
df17['year'] = 2017
df = pd.concat([df15, df16, df17]).set_index(['Grave Crimes', 'year'])

f, ax = plt.subplots(1)
for i, y in enumerate(range(2015, 2018)):
    data = df.groupby('year').get_group(y)['Cases Recorded']
    ax.bar(np.arange(6)+.2*i, data.values, width=.2, label=str(y))
ax.legend()
ax.set_xticklabels(data.index, rotation=15)

example for 2D-plot of your data

0 голосов
/ 27 апреля 2018

Хотя панели позволяют добавлять измерения, иерархическая индексация является более распространенной заменой. Например, из Python Data Science Handbook :

В то время как Pandas предоставляет объекты Panel и Panel4D, которые изначально обрабатывают трехмерные и четырехмерные данные (см. В разделе: Данные панели), на практике гораздо более распространенным является использование иерархической индексации (также известной как многоуровневая индексация). индексирование) для включения нескольких уровней индекса в один индекс. Таким образом, многомерные данные могут быть компактно представлены в рамках знакомых одномерных серий и двухмерных объектов DataFrame.

В вашем случае

У меня 12 фреймов одинаковой формы за 12 лет сбора данных. Мне нужно использовать это как панель для отображения различных значений столбца по оси временных рядов (годы).

Скажите, что ваши DataFrames находятся в df_2015, df_2016 и df_2017. Вы можете сделать следующее:

df_2015['year'] = 2015
df_2016['year'] = 2016
df_2017['year'] = 2017
df = pd.concat([df_2015, df_2016, df_2017]).set_index(['Grave Crimes', 'year'])

Теперь, чтобы получить данные за все годы для 'Abduction', например, используйте

df[df.index.get_level_values(0) == 'Abduction']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...