Разбивка данных по месяцам и неделям в SAS - PullRequest
0 голосов
/ 29 сентября 2018

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

     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
                   ...

Я хочу создать новый столбец для продаж в таблице 2, который будет содержать дезагрегированные значения продаж из таблицы 1.Я хочу разделить продажи на количество дней в этом месяце, а затем соответственно присвоить значения неделям.Таким образом, продажи за неделю 01 января 2016 года составляют (1110/31) * 7.Недели, которые находятся в переходном периоде, получат значения обоих месяцевНапример, 29 января 2016 года 3 января в январе 2016 года и 4 февраля в феврале.Продажи одного дня в январе2018 года - 1110/31, а продажи одного дня в феврале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

Спасибо!

1 Ответ

0 голосов
/ 01 октября 2018

При программировании шага DATA вам потребуются некоторые данные «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;
...