Как создать график с накоплением совокупных взносов отдельных лиц с течением времени?

#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()
  

График с накоплением MatPlotLib