Пандас с накоплением гистограммы - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть датафрейм dft с двумя столбцами 'DATE' и 'INVOICE', который выглядит следующим образом, но с гораздо большим количеством строк, охватывающих несколько лет.

        DATE      INVOICE

0   2015-01-29    68.61 
1   2015-01-15    16.54 
2   2015-01-15     4.72 
3   2015-01-14    109.71 

Сначала я отсортировал эти данные по INVOICE размеру, чтобы получить три отдельных кадра данных.

small = dft[(dft['INVOICE'] < 25) & 
(dft['INVOICE'] > 0)]

 medium = dft[(dft['INVOICE'] <= 60) & 
(dft['INVOICE'] >= 25)]

large = dft[(dft['INVOICE'] > 60)]

Затем я суммировал общие расходы по счетам в каждой категории за каждый месяц и преобразовал их в список:

periods = dft.DATE.dt.to_period("M")

small1 = small.groupby(periods).sum().reset_index()
medium1 = medium.groupby(periods).sum().reset_index()
large1 = large.groupby(periods).sum().reset_index()

# Convert Dataframes to lists for plotting
x1 = small1['DATE'].tolist()
x2 = medium1['DATE'].tolist()
x3 = large1['DATE'].tolist()

y1 = small1['INVOICE'].tolist()
y2 = medium1['INVOICE'].tolist()
y3 = large1['INVOICE'].tolist()

Чтобы, наконец, построить гистограмму с разбивкой по месяцам и годам, например, (2015-01) против совокупного размера счета за этот месяц. Моя проблема в том, что эта гистограмма выдает ошибку, так как у списков разных размеров.

indexes = np.arange(len(x1))

p3 = plt.bar(indexes, y1 + y2 + y3)
p2 = plt.bar(indexes, y2 + y1)
p1 = plt.bar(indexes, y1)

plt.show()

1 Ответ

0 голосов
/ 14 ноября 2018

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

вот этап классификации:

def invoice_classifier(amount):
    if amount < 25 and amount > 0: return 'small'
    elif amount <= 60: return 'medium'
    elif amount > 60: return 'large'
# for each row assign a class
df['invoice_class'] = df.apply(lambda r: invoice_classifier(r['INVOICE']), axis=1)

# plotting
df.groupby(by=['DATE', 'invoice_class'])['INVOICE'].sum().unstack('invoice_class').plot(kind='bar', stacked=True)

Это должно быть то, что вы ищете.

редактировать:

пользователь также хотел группировку по месяцам.

df['month_dates'] = df['dates'].dt.to_period('M')
df.groupby(by=['month_dates', 'invoice_class'])['INVOICE'].sum().unstack('invoice_class').plot(kind='bar', stacked=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...