Как временной ряд считать по дням. |
Здравствуйте, гость ( Вход | Регистрация )
Как временной ряд считать по дням. |
1.11.2017 - 23:24
Сообщение
#16
|
|
Группа: Пользователи Сообщений: 902 Регистрация: 23.08.2010 Пользователь №: 22694 |
/ меланхолично/
Вообще-то для обсуждения эконометрических заморочек существуют форумы по эконометрике. А на врачебном форуме чьи-то страдания по поводу чьих-то продаж - однозначно магарычовая тема. Жаль только, 2004-й цены сбивает... |
|
2.11.2017 - 15:50
Сообщение
#17
|
|
Группа: Пользователи Сообщений: 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
Сообщение
#18
|
|
Группа: Пользователи Сообщений: 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 |
|
2.11.2017 - 22:20
Сообщение
#19
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
Я Вас правильно понял, теперь уже можно делать форекаст на сплитованном датасете df.sales.t?
# проверки на стационарность adf.test(df.sales.t, alternative = "stationary") #forecast auto.arima(df.sales.t, seasonal=FALSE) fit2 = arima(df.sales.t, order=c(1,1,7)) # fcast <- forecast(fit2, h=1) # 1day ahead Сообщение отредактировал kont - 2.11.2017 - 22:21 |
|
3.11.2017 - 00:01
Сообщение
#20
|
|
Группа: Пользователи Сообщений: 1091 Регистрация: 26.08.2010 Пользователь №: 22699 |
Я Вас правильно понял, теперь уже можно делать форекаст на сплитованном датасете df.sales.t? # проверки на стационарность adf.test(df.sales.t, alternative = "stationary") #forecast auto.arima(df.sales.t, seasonal=FALSE) fit2 = arima(df.sales.t, order=c(1,1,7)) # fcast <- forecast(fit2, h=1) # 1day ahead Тут всё забавнее... Поскольку пока у нас только 1 месяц, то дни недели трудно интерпретировать недели, и мы можем дни месяца слить вместе с днями недели Код > res_hosvd <- hosvd(as.tensor(df.sales.t.all), ranks=c(30,899,30)) |======================================================================| 100% > 1-res_hosvd$fnorm_resid/fnorm(as.tensor(df.sales.t.all)) [1] 0.9953629 > res_hosvd <- hosvd(as.tensor(df.sales.t.all), ranks=c(30,900,30)) |======================================================================| 100% > 1-res_hosvd$fnorm_resid/fnorm(as.tensor(df.sales.t.all)) [1] 1 Но ассортимент товаров реально состоит из 900 позиций (с точки зрения стоимости и сочетаемости продаж). Это точно не синтетика какая то? |
|
3.11.2017 - 01:00
Сообщение
#21
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
Нет, это обычные продовольственные товары, как вы сказали, макароны, куры.. до хоть джек дениелс и кола))
Я ратую за модель ARIMA ... обосновываю это тем, что аддитивные модели больше для прогнозов по месячным данным. Да и на стаковерфлоу, люди тоже советуют АРИМУ. вернее stats.stackexchange.com/ https://stats.stackexchange.com/questions/1...series-analysis Сообщение отредактировал kont - 3.11.2017 - 11:33 |
|
3.11.2017 - 11:59
Сообщение
#22
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
стал писать цикл для анализа, сможете помочь, разобраться, пожалуйста. выдал ошибкуmy_forecast <- function(x){ model <- arima(x, order = c(1, 1, 1)) fcast <- forecast(model, 1) return(fcast) } prog=lapply(df.sales.t[1:1], my_forecast) Error in arima(x, order = c(1, 1, 1)) : too few non-missing observations Сообщение отредактировал kont - 3.11.2017 - 14:08 |
|
3.11.2017 - 15:34
Сообщение
#23
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
сможете помочь по этой ошибке?
|
|
6.11.2017 - 16:45
Сообщение
#24
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
p2004r, можно Вас последний раз потревожить? С остальными ошибками сам разобрался.
А суть вывода данных. пример, см. скрин df.sales.t <- acast(mydat, DAY ~ ART ~ STORE , value.var="SALES", fill=0) View(df.sales.t ) у нас обычный датафрем по строкам даты, по столбцам ок, хочу записать этот датафрейм в csv g=as.data.frame(df.sales.t[,1,1:10]) Как результат совершенно не те столбцы Код > g 956 958 961 974 980 999 1053 1082 1094 1122 01.ноя.15 108.0 0.0 0.0 0.0 0 0.0 216.0 0.0 0 0 02.ноя.15 0.0 0.0 97.0 0.0 0 0.0 0.0 0.0 0 0 03.ноя.15 0.0 0.0 97.0 99.9 0 0.0 0.0 0.0 106 0 04.ноя.15 108.0 0.0 97.0 0.0 0 0.0 108.0 0.0 0 0 05.ноя.15 0.0 0.0 0.0 99.9 0 0.0 0.0 0.0 0 0 06.ноя.15 216.0 0.0 97.0 0.0 106 0.0 0.0 0.0 0 0 07.ноя.15 0.0 0.0 0.0 0.0 106 0.0 0.0 0.0 212 0 08.ноя.15 0.0 99.9 97.0 0.0 0 0.0 108.0 0.0 212 86 09.ноя.15 0.0 0.0 194.0 0.0 0 0.0 108.0 0.0 0 0 10.ноя.15 0.0 0.0 0.0 0.0 106 99.9 0.0 0.0 0 0 11.ноя.15 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0 0 12.ноя.15 0.0 0.0 0.0 99.9 0 0.0 0.0 0.0 212 0 13.ноя.15 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0 0 14.ноя.15 108.0 0.0 97.0 0.0 0 99.9 0.0 89.9 106 0 15.ноя.15 0.0 0.0 0.0 0.0 0 0.0 99.9 0.0 98 0 16.ноя.15 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 294 0 17.ноя.15 199.8 0.0 97.0 0.0 0 0.0 0.0 0.0 98 0 18.ноя.15 0.0 0.0 0.0 89.9 92 0.0 0.0 0.0 196 0 19.ноя.15 0.0 0.0 0.0 0.0 92 0.0 0.0 89.9 98 0 20.ноя.15 0.0 0.0 0.0 0.0 0 0.0 99.9 0.0 98 0 21.ноя.15 0.0 99.9 0.0 0.0 0 0.0 99.9 0.0 98 0 22.ноя.15 0.0 0.0 0.0 89.9 0 0.0 0.0 0.0 0 0 23.ноя.15 92.0 0.0 0.0 89.9 0 89.9 0.0 88.0 0 0 24.ноя.15 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 0 86 25.ноя.15 0.0 0.0 0.0 89.9 0 0.0 92.0 0.0 0 172 26.ноя.15 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 92 86 27.ноя.15 0.0 0.0 0.0 0.0 0 0.0 0.0 0.0 92 0 28.ноя.15 0.0 89.9 0.0 0.0 0 0.0 92.0 0.0 0 0 29.ноя.15 184.0 0.0 89.9 89.9 86 0.0 0.0 0.0 0 0 как мне в датафрейм перевести весь df.sales.t чтобы отображались все 7000 столбцов всё больше мне ничего не надо:) , пожалуйста. |
|
6.11.2017 - 18:47
Сообщение
#25
|
|
Группа: Пользователи Сообщений: 95 Регистрация: 27.12.2015 Пользователь №: 27815 |
2kont
Код as.data.frame(df.sales.t[[b],[/b]1,1:10]) Я, конечно, не знаю, как организованы данные и всё такое, но до запятой - это строчки, после - это столбцы. Чтобы записывались все столбцы, после запятой ничего быть не должно, например df[1:100,] - первые сто строчек, все столбцы. В Вашем примере запятая представляется лишней. Если всё заковырестей, нужно смотреть детальней. |
|
6.11.2017 - 20:25
Сообщение
#26
|
|
Группа: Пользователи Сообщений: 149 Регистрация: 11.02.2014 Пользователь №: 26005 |
> g=as.data.frame(df.sales.t[1:10])
> g df.sales.t[1:10] 1 108 2 0 3 0 4 108 5 0 6 216 7 0 8 0 9 0 10 0 > я получил 10 пер или без запятой t[,1 > g=as.data.frame(df.sales.t[1,1:10]) Error in df.sales.t[1, 1:10] : incorrect number of dimensions > |
|
7.11.2017 - 18:06
Сообщение
#27
|
|
Группа: Пользователи Сообщений: 95 Регистрация: 27.12.2015 Пользователь №: 27815 |
2kont
Структура данных после acast какая? |
|