Панды разделены на недельный временной ряд и на месяц - PullRequest
1 голос
/ 08 июля 2019

У меня есть набор данных, который содержит еженедельные данные, но мне нужно вычислить среднее их значение на основе веса строки, если эта неделя пересекает месяц. Например:

  Current_Week             Sales
0 29/Dec/2013-04/Jan/2014  3685.236419
1 05/Jan/2014-11/Jan/2014  3784.023564
2 12/Jan/2014-18/Jan/2014  3726.933727
3 19/Jan/2014-25/Jan/2014  3690.440944
4 26/Jan/2014-01/Feb/2014  3731.523630
5 02/Feb/2014-08/Feb/2014  3753.882783
6 09/Feb/2014-15/Feb/2014  3643.997381
7 16/Feb/2014-22/Feb/2014  3696.243919
8 23/Feb/2014-01/Mar/2014  3718.254426

В конечном итоге желаемый результат:

Month       Sales
1-Jan-2014  3727.09
1-Feb-2014  3703.57

Следует отметить, что для входного фрейма данных в строке 0 мне нужно вычислить weightage из the number of days in that week for that month, чтобы его можно было использовать для вычисления среднего значения продаж позже. Например, за январь месяц

enter image description here

Как видно, ежемесячные продажи за январь рассчитываются путем суммирования всех усредненных продаж, а затем делятся на количество взвешенных дней: 16505.69 / 4.42 = 3727.09

Я знаю, что сначала нужно разбить временной ряд на две строки, если данные пересекают месяц, а затем sum их и aggregate их. Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Предположим, что недели являются последовательными, тогда нам нужно беспокоиться только о начале недель (так как концы начинаются + 1 день):

# get start and end dates of the weeks
time_df = df.Current_Week.str.split('-', expand=True)
time_df.columns = ['start','end']

# convert to datetime 
time_df = time_df.apply(pd.to_datetime)

# combine with original data
new_df = pd.concat((df, time_df), sort=False, axis=1)

# all the dates in range
all_dates = pd.date_range(new_df.start.iloc[0], new_df.end.iloc[-1], freq='D')

# set start as index for interpolate
new_df = (new_df[['Sales','start']]
            .set_index('start')
            .reindex(all_dates)  # resample to all dates
            .ffill()             # fill missing days
            .resample('MS')      # group over the month
            .mean()              # taking mean
     )

Выход:

                  Sales
2013-12-01  3685.236419
2014-01-01  3727.092745
2014-02-01  3703.568527
2014-03-01  3718.254426
0 голосов
/ 08 июля 2019

Месяц продаж и сумма

data.groupby('Month')['sales'].sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...