Как временной ряд считать по дням. |
Здравствуйте, гость ( Вход | Регистрация )
Как временной ряд считать по дням. |
1.11.2017 - 16:41
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
Подскажите, мне нужно построить предсказание по дням
test=ts(datas$SALES,start=c(01-11-2015)) test Предсказание я делаю на базе продаж за месяц на день вперед , т.е. зная данные за месяц предсказать объем продаж на 30.11.2015 На всякий случай прикреплю данные переформулирую свой вопрос Usage ts(data = NA, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption("ts.eps"), class = , names = ) если я прогнозирую на один день, что мне указать во фреквенси? Сообщение отредактировал kont - 1.11.2017 - 20:34
Прикрепленные файлы
|
|
2.11.2017 - 15:50
Сообщение
#2
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
Зато я понял, что значит утро вечера мудренее, я услышал, то о чем говорил p2004r. Действительно под вечер глядя ничего не соображал, а Вы правы, я лепил все в одну кучу, мне же нужно сделать форекаст для каждого магазина и каждого артикулла. Я пошел не тензорным путем, он для меня сложен пока, я пошел по старинке
datas=read.csv(sales.csv", sep=";",dec=",") View(datas) str(datas) count_ts = ts(datas[, c('SALES')]) View(count_ts) datas$clean_cnt = tsclean(count_ts) datas$cnt_ma = ma(datas$clean_cnt, order=7) # using the clean count with no outliers datas$cnt_ma30 = ma(datas$clean_cnt, order=30) count_ma = ts(na.omit(datas$cnt_ma), frequency=30) decomp = stl(count_ma, s.window="periodic") deseasonal_cnt <- seasadj(decomp) plot(decomp) adf.test(count_ma, alternative = "stationary") # ряд стационарный , тест Дюке-Фудллера (p<0.01) #count_d1 = diff(deseasonal_cnt, differences = 1) #adf.test(count_d1, alternative = "stationary") # p<0,05 is STACIONARY SERIES auto.arima(deseasonal_cnt, seasonal=FALSE) fit<-auto.arima(deseasonal_cnt, seasonal=FALSE) tsdisplay(residuals(fit), lag.max=45, main='(1,1,0) Model Residuals') fit2 = arima(deseasonal_cnt, order=c(1,1,7)) fcast <- forecast(fit2, h=30) p2004r,теперь когда на меня нашло озорение, сможете подсказать как мне сплит по группам сделать (shop+art) Сообщение отредактировал kont - 2.11.2017 - 15:56 |
|
2.11.2017 - 19:27
Сообщение
#3
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
Зато я понял, что значит утро вечера мудренее, я услышал, то о чем говорил p2004r. Действительно под вечер глядя ничего не соображал, а Вы правы, я лепил все в одну кучу, мне же нужно сделать форекаст для каждого магазина и каждого артикулла. Я пошел не тензорным путем, он для меня сложен пока, я пошел по старинке datas=read.csv(sales.csv", sep=";",dec=",") View(datas) str(datas) count_ts = ts(datas[, c('SALES')]) View(count_ts) datas$clean_cnt = tsclean(count_ts) datas$cnt_ma = ma(datas$clean_cnt, order=7) # using the clean count with no outliers datas$cnt_ma30 = ma(datas$clean_cnt, order=30) count_ma = ts(na.omit(datas$cnt_ma), frequency=30) decomp = stl(count_ma, s.window="periodic") deseasonal_cnt <- seasadj(decomp) plot(decomp) adf.test(count_ma, alternative = "stationary") # ряд стационарный , тест Дюке-Фудллера (p<0.01) #count_d1 = diff(deseasonal_cnt, differences = 1) #adf.test(count_d1, alternative = "stationary") # p<0,05 is STACIONARY SERIES auto.arima(deseasonal_cnt, seasonal=FALSE) fit<-auto.arima(deseasonal_cnt, seasonal=FALSE) tsdisplay(residuals(fit), lag.max=45, main='(1,1,0) Model Residuals') fit2 = arima(deseasonal_cnt, order=c(1,1,7)) fcast <- forecast(fit2, h=30) p2004r,теперь когда на меня нашло озорение, сможете подсказать как мне сплит по группам сделать (shop+art) Он был сделан когда был cast() подготовлен тензор Код df.sales.t <- acast(df.sales, DAY ~ ART ~ STORE , value.var="SALES", fill=0) > str(df.sales.t) num [1:30, 1:7683, 1:30] 108 0 0 108 0 216 0 0 0 0 ... - attr(*, "dimnames")=List of 3 ..$ :8322456 [1:30] "2015-11-01" "2015-11-02" "2015-11-03" "2015-11-04" ... ..$ :8322456 [1:7683] "540" "546" "570" "738" ... ..$ :8322456 [1:30] "956" "958" "961" "974" ... Первая размерность -- день серии, вторая -- артикул товара, третья -- магазин. Соответственно берем для первого магазина, и первого артикула историю за 30 дней. Код > str(df.sales.t[,1,1]) Named num [1:30] 108 0 0 108 0 216 0 0 0 0 ... - attr(*, "names")=8322456 [1:30] "2015-11-01" "2015-11-02" "2015-11-03" "2015-11-04" ... > df.sales.t[,1,1] 2015-11-01 2015-11-02 2015-11-03 2015-11-04 2015-11-05 2015-11-06 2015-11-07 108.0 0.0 0.0 108.0 0.0 216.0 0.0 2015-11-08 2015-11-09 2015-11-10 2015-11-11 2015-11-12 2015-11-13 2015-11-14 0.0 0.0 0.0 0.0 0.0 0.0 108.0 2015-11-15 2015-11-16 2015-11-17 2015-11-18 2015-11-19 2015-11-20 2015-11-21 0.0 0.0 199.8 0.0 0.0 0.0 0.0 2015-11-22 2015-11-23 2015-11-24 2015-11-25 2015-11-26 2015-11-27 2015-11-28 0.0 92.0 0.0 0.0 0.0 0.0 0.0 2015-11-29 2015-11-30 184.0 0.0 Но это на самом деле не весь нужный тензор, нужно обязательно добавить еще измерение по дням недели, это крайне важный фактор для модели. Вот таким образом. Код > df.sales$WDAY <- lubridate::wday(df.sales$DAY)
> str(df.sales) 'data.frame': 873912 obs. of 5 variables: $ DAY : POSIXct, format: "2015-11-01" "2015-11-01" ... $ STORE: int 1534 25039 1612 1053 1612 961 1602 21761 19009 22691 ... $ ART : int 343533 20490 295206 16406274 49495 15309949 242763 188087 16350692 86093 ... $ SALES: num 62.5 686.4 185 32.5 143.1 ... $ WDAY : num 1 1 1 1 1 1 1 1 1 1 ... > df.sales.t <- acast(df.sales, DAY ~ WDAY ~ ART ~ STORE , value.var="SALES", fill=0) > str(df.sales.t) num [1:30, 1:7, 1:7683, 1:30] 108 0 0 0 0 0 0 0 0 0 ... - attr(*, "dimnames")=List of 4 ..$ :8322456 [1:30] "2015-11-01" "2015-11-02" "2015-11-03" "2015-11-04" ... ..$ :8322456 [1:7] "1" "2" "3" "4" ... ..$ :8322456 [1:7683] "540" "546" "570" "738" ... ..$ :8322456 [1:30] "956" "958" "961" "974" ... Сообщение отредактировал p2004r - 2.11.2017 - 19:47 |
|