#python-3.x #pandas #seaborn
#python-3.x #панды #сиборн
Вопрос:
Учитывая набор точек данных о показателях продаж отдельных лиц, я пытаюсь создать график с накоплением, показывающий общий объем продаж с течением времени, разделенный на вклад отдельных продавцов.
import datetime
import random
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
data = []
for _ in range(100):
name = random.choice(['Alice', 'Bob', 'Carol', 'Dave', 'Eve'])
date = datetime.date(2020,1,1) datetime.timedelta(days=random.randint(0,20))
sales = random.randint(0,20)
data.append((name,date,sales))
df = pd.DataFrame(data, columns=['Name', 'Date', 'Sales'])
.set_index('Date')
.sort_values('Date')
df['Total Sales']= df['Sales'].cumsum()
df['Total Sales by person'] = df.groupby('Name')['Sales'].cumsum()
У меня почти получилось с двумя разными подходами, но я не вижу, как его завершить. Кто-нибудь может помочь или предложить альтернативный подход?
Подход 1. используйте seaborn для построения линейного графика. Просто и красиво, но я не могу заставить его складываться
sns.lineplot(data=df, x='Date', y='Total Sales by person', hue='Name')
plt.show()
Подход 2. превратите данные в сводную таблицу, затем используйте график области pandas. Он правильно складывается в те дни, когда каждый продавец что-то продал, но каждый «NaN» вызывает проблемы.
pt = pd.pivot_table(df, columns=['Name'], index=['Date'], values=['Total Sales by person'])
pt.plot.area()
plt.show()
>>> pt.head(10)
Total Sales by person
Name Alice Bob Carol Dave Eve
Date
2020-01-01 NaN 11.0 15.000000 11.0 3.0
2020-01-03 NaN NaN 34.000000 20.0 NaN
2020-01-04 NaN 34.0 52.000000 28.0 NaN
2020-01-05 19.0 57.0 NaN NaN 15.0
2020-01-06 22.0 72.5 NaN 36.0 34.0
2020-01-07 NaN NaN 52.000000 50.0 35.0
2020-01-08 34.0 NaN 62.500000 NaN 51.0
2020-01-09 53.0 92.0 80.000000 64.5 60.0
2020-01-10 53.0 107.5 95.666667 75.0 NaN
2020-01-11 NaN 120.0 136.666667 77.0 67.0
Есть яркие идеи?
Ответ №1:
Решил это. Сначала мне нужно было создать сводную таблицу только с данными о продажах, заполнить все пропущенные значения 0, ЗАТЕМ добавить совокупную сумму. Окончательный код:
df = pd.DataFrame(data, columns=['Name', 'Date', 'Sales'])
.set_index('Date')
.sort_values('Date')
pt = pd.pivot_table(df, columns=['Name'], index=['Date'], values=['Sales'], fill_value=0)
pt = pt.cumsum()
pt.plot.area()
plt.show()