Форум врачей-аспирантов

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Добавить ответ в эту темуОткрыть тему
> Как временной ряд считать по дням.
100$
сообщение 1.11.2017 - 23:24
Сообщение #16





Группа: Пользователи
Сообщений: 902
Регистрация: 23.08.2010
Пользователь №: 22694



/ меланхолично/

Вообще-то для обсуждения эконометрических заморочек существуют форумы по эконометрике.
А на врачебном форуме чьи-то страдания по поводу чьих-то продаж - однозначно магарычовая тема. Жаль только, 2004-й цены сбивает...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
kont
сообщение 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
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 2.11.2017 - 19:27
Сообщение #18





Группа: Пользователи
Сообщений: 1091
Регистрация: 26.08.2010
Пользователь №: 22699



Цитата(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" ...


Сообщение отредактировал p2004r - 2.11.2017 - 19:47


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
kont
сообщение 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
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
p2004r
сообщение 3.11.2017 - 00:01
Сообщение #20





Группа: Пользователи
Сообщений: 1091
Регистрация: 26.08.2010
Пользователь №: 22699



Цитата(kont @ 2.11.2017 - 22:20) *
Я Вас правильно понял, теперь уже можно делать форекаст на сплитованном датасете 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 позиций (с точки зрения стоимости и сочетаемости продаж).

Это точно не синтетика какая то?


Signature
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
kont
сообщение 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
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
kont
сообщение 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
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
kont
сообщение 3.11.2017 - 15:34
Сообщение #23





Группа: Пользователи
Сообщений: 149
Регистрация: 11.02.2014
Пользователь №: 26005



сможете помочь по этой ошибке?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
kont
сообщение 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 столбцов

всё больше мне ничего не надо:)

help.gif, пожалуйста.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
comisora
сообщение 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,] - первые сто строчек, все столбцы. В Вашем примере запятая представляется лишней. Если всё заковырестей, нужно смотреть детальней.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
kont
сообщение 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
>
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 
comisora
сообщение 7.11.2017 - 18:06
Сообщение #27





Группа: Пользователи
Сообщений: 95
Регистрация: 27.12.2015
Пользователь №: 27815



2kont
Структура данных после acast какая?
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
 

2 страниц V  < 1 2
Добавить ответ в эту темуОткрыть тему