Цитата(kont @ 2.11.2017 - 15:50)

Зато я понял, что значит утро вечера мудренее, я услышал, то о чем говорил 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" ...