Линейная регрессия в Pandas Groupby с freq = 'W-MON' - PullRequest
0 голосов
/ 28 мая 2019

У меня есть данные за период более года.Мне интересно сгруппировать данные по неделям и получить наклон двух переменных по неделям.Вот как выглядят данные:

Date               | Total_Sales| Products
2015-12-30 07:42:50| 2900       | 24
2015-12-30 09:10:10| 3400       | 20
2016-02-07 07:07:07| 5400       | 25
2016-02-07 07:08:08| 1000       | 64

Так что в идеале я хотел бы выполнять линейную регрессию для total_sales и продуктов для каждой недели этих данных и записывать наклон.Это работает, когда в данных представлена ​​каждая неделя, но у меня возникают проблемы, когда в данных пропущено несколько недель.Я знаю, что мог бы сделать это, превратив дату в номер недели, но чувствую, что результат будет искажен, потому что есть данные за год.

Вот код, который у меня пока есть:

df['Date']=pd.to_datetime(vals['EventDate']) - pd.to_timedelta(7,unit='d')
df.groupby(pd.Grouper(key='Week', freq='W-MON')).apply(lambda v: linregress(v.Total_Sales, v.Products)[0]).reset_index()

Однако я получаю следующую ошибку:

ValueError: Inputs must not be empty.

Я ожидаю, что результат будет выглядеть следующим образом:

Date       | Slope
2015-12-28 | -0.008     
2016-02-01 | -0.008

1 Ответ

0 голосов
/ 28 мая 2019

Я предполагаю, что это происходит из-за того, что python не может правильно сгруппировать, а также не может распознать дату и время как ключ, поскольку столбец Date также имеет различную метку времени.

Попробуйте следующий код. У меня это сработало:

df['Date']=pd.to_datetime(df['Date'])  #### Converts Date column to Python Datetime

df['daysoffset'] = df['Date'].apply(lambda x: x.weekday())
#### Return the day of the week as an integer, where Monday is 0 and Sunday is 6.

df['week_start'] = df.apply(lambda x: x['Date'].date()-timedelta(days=x['daysoffset']), axis=1)  
#### x.['Date'].date() removes timestamp and considers only Date
#### the line assigns date corresponding to last Monday to column 'week_start'.


df.groupby('week_start').apply(lambda v: stats.linregress(v.Total_Sales,v.Products) 
[0]).reset_index()
...