Как агрегировать и отображать данные из pandas dataframe? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть этот фрейм данных

df[['payout_date','total_value']].head(10)

    payout_date         total_value
0   2017-02-14T11:00:06  177.313
1   2017-02-14T11:00:06  0.000
2   2017-02-01T00:00:00  0.000
3   2017-02-14T11:00:06  47.392
4   2017-02-14T11:00:06  16.254
5   2017-02-14T11:00:06  125.818
6   2017-02-14T11:00:06  0.000
7   2017-02-14T11:00:06  0.000
8   2017-02-14T11:00:06  0.000
9   2017-02-14T11:00:06  0.000

Я использую этот код для построения агрегированной суммы total_value в определенном диапазоне дат по дням (и по месяцам), но для каждого графикаtotal_value и не суммируется total_value по дням.

(df.set_index('payout_date')
                    .loc['2018-02-01':'2018-02-02']
                    .groupby('payout_date')
                    .agg(['sum'])
                    .reset_index()
                    .plot(x='payout_date', y='total_value',kind="bar"))
plt.show()

Данные не агрегированы, я получаю бар для каждого значения из df:

enter image description here

Как агрегировать total_valueпо дате и по месяцу?

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

Я также пытался добавить .dt.to_period('M') к коду, но я получаю TypeError: Empty 'DataFrame': no numeric data to plot ошибку.

Ответы [ 2 ]

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

Попробуйте следующим образом:

df = df.iloc[1:7]
(df.set_index('payout_date')
                .groupby('payout_date')
                .agg(['sum'])
                .reset_index()
                .plot(x='payout_date', y='total_value',kind="bar"))
plt.show()

Где указатель выбран до

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

Настройка

df = pd.DataFrame({'payout_date': {0: '2017-02-01T11:00:06',   1: '2017-02-01T11:00:06',   2: '2017-02-02T00:00:00',   3: '2017-02-14T11:00:06',   4: '2017-02-14T11:00:06',   5: '2017-02-15T11:00:06',   6: '2017-02-15T11:00:06',   7: '2017-02-16T11:00:06',   8: '2017-02-16T11:00:06',   9: '2017-02-16T11:00:06'},  'total_value':{0: 177.313,   1: 22.0,   2: 25.0,   3: 47.391999999999996,   4: 16.254,   5: 125.818,   6: 85.0,   7: 42.0,8: 22.0,   9: 19.0}})

Использование normalize для группировки по дням:

df.groupby(pd.DatetimeIndex(df.payout_date).normalize()).sum().reset_index()

  payout_date  total_value
0  2017-02-01      199.313
1  2017-02-02       48.000
2  2017-02-14       63.646
3  2017-02-15      210.818
4  2017-02-16       83.000

Расширьте предыдущую команду для построения графика:

df.groupby(
    pd.DatetimeIndex(df.payout_date)      \
    .normalize().strftime('%Y-%m-%d'))    \
    .agg(['sum'])                         \
    .reset_index()                        \
    .plot(x='index', y='total_value', kind='bar')

plt.tight_layout()
plt.show()

Вывод для моих образцов данных:

enter image description here

Если вы хотите применить это кподмножество, вы можете сделать что-то вроде следующего:

tmp = df.loc[(df.payout_date > '2017-02-01') & (df.payout_date < '2017-02-15')]

tmp.groupby(
    pd.DatetimeIndex(tmp.payout_date)                     \
    .normalize().strftime('%Y-%m-%d'))['total_value']     \
    .agg(['sum'])

# Result
                sum
2017-02-01  199.313
2017-02-02   25.000
2017-02-14   63.646

, который будет только суммировать желаемый диапазон.

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