Разбивка данных от месяцев до недель в SAS

Я застрял с проблемой, когда у меня есть две таблицы, одна по месяцам, а другая по неделям. Вот формат таблиц:

     Table1

     Customer            Date1          Sales

      1                 Jan2018        1110
      1                 Feb2018        1245
      1                 Mar2018        1320
      1                 Apr2018        1100   
      ...



              Table2

                 Customer              Date2           

                   1                  01Jan2018
                   1                  08Jan2018
                   1                  15Jan2018    
                   1                  22Jan2018
                   1                  29Jan2018
                   1                  05Feb2018
                   1                  12Feb2018       
                   1                  19Feb2018       
                   1                  26Feb2018        
                   1                  05Mar2018
                   ...

Я хочу создать новый столбец для продаж в Table2, который будет содержать дезагрегированные значения продаж из Table1. Я хочу разделить продажи на количество дней в этом месяце, а затем соответственно присвоить значения неделям. Таким образом, продажи на неделе 01 января 2018 составят (1110/31) * 7. Недели, находящиеся в переходном периоде, получат значения обоих месяцев. Например, 29 января 2018 года имеет 3 дня в январе 2018 года и 4 дня в феврале 2018 года. Продажи за один день в январе 2018 года составили 31 октября 2018 года, а продажи за один день в феврале 2018 года - 1245/28.

Таким образом, продажи на неделе 29 января 2018 будут 3 * (1110/31) + 4 * (1245/28).

Я хочу сделать это для каждого отдельного клиента.

Итоговая таблица должна быть

               Result Table

              Customer      Date               Sales           
              1             01Jan2018          250.6      i.e (1110/31)*7
              1             08Jan2018          250.6
              1             15Jan2018          250.6 
              1             22Jan2018          250.6 
              1             29Jan2018          282.27
              1             05Feb2018          311.25 
              1             12Feb2018          311.25    
              1             19Feb2018          311.25
              1             26Feb2018          133.39 + 170.32

Спасибо!

Как работает 29 января 2018 года 3 дня в январе 2018 года и 4 дня в феврале 2018 года.?

Parfait 29.09.2018 23:35

Исходя из вашего желания, вы не получите точной картины продаж, если будете переводить деньги из месяца в неделю. Вы разделяете его на равные пропорции или применяете вес? Как рассчитать вес? Таким образом, в ваших расчетах будет двусмысленность. Это означает, что он не покажет правильный результат. Почему бы вам не объединить еженедельные продажи с ежемесячными продажами и не изменить расчеты?

samkart 30.09.2018 09:08

У вас есть SAS ETS? Я считаю, что и PROC EXPAND, и / или TIMESERIES сделают это за вас, если у вас есть этот модуль.

Reeza 01.10.2018 01:03
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
1
3
135
1

Ответы 1

В программировании DATA Step вам понадобятся некоторые данные FORWARD вместо данных LAG. Прямое значение может быть эмулировано путем создания представления для тех же данных, начиная с одного наблюдения вперед (obs = 2). После понимания семантики переименования это всего лишь вопрос простой «бухгалтерии».

data customer_months;
attrib Customer length=8 Date1 informat=monyy. format=monyy7.; input 
Customer   Date1  Sales; datalines;
1        Jan2018  1110
1        Feb2018  1245
1        Mar2018  1320
1        Apr2018  1100
run;

* week data, also with computation for month the week is in;
data customer_weeks;
attrib Customer length=8 Date2 informat=date9. format=date9.; input
Customer  Date2;
Date1 = intnx('month', Date2, 0);
datalines;
  1      01Jan2018
  1      08Jan2018
  1      15Jan2018
  1      22Jan2018
  1      29Jan2018
  1      05Feb2018
  1      12Feb2018
  1      19Feb2018
  1      26Feb2018
  1      05Mar2018
run;

* next months sales keyed on prior month value;
data customer_next_months_view / view=customer_next_months_view;
  set customer_months;
  Date1 = intnx('month',Date1,-1);  * the month this record will be a forward for;
  rename Sales=Sales_next_month;
  if _n_ > 1;
run;

* merge original and forward data, rename for making clear the variable roles;
data combined;
  length disag_sales 8;

  merge 
    customer_months  (rename=Sales=Sales_this_month)
    customer_next_months_view
    customer_weeks
  ;
  by Date1;

  days_in_this_month = intck('day',intnx('month',Date1,0),intnx('month',Date1,1));
  days_in_next_month = intck('day',intnx('month',Date1,1),intnx('month',Date1,2));

  day_rate_this_month = Sales_this_month / days_in_this_month;
  day_rate_next_month = Sales_next_month / days_in_next_month;

  if Date2 then 
    if month(Date2) = month(Date2+6) then 
      week_days_this_month = 7;
    else
      week_days_this_month = intck('day', Date2, intnx('month', Date2, 1));

  week_days_next_month = 7 - week_days_this_month;

  dollars_this_week_this_month = week_days_this_month * day_rate_this_month;
  dollars_this_week_next_month = week_days_next_month * day_rate_next_month;

  * desired estimated disaggregated sales;    
  disag_sales = sum (dollars_this_week_this_month,dollars_this_week_next_month);
run;

Другие вопросы по теме