Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 2.68 KB | None | 0 0
  1. module Basics
  2.     using Dates
  3.     using JuliaDB
  4.     using JuliaDBMeta
  5.     using Lazy: @>
  6.  
  7.     export rfm
  8.  
  9.     function rfm(tbl::IndexedTable, end_cal::Union{Date, Nothing} = Date("2018-12-31", DateFormat("y-m-d")))
  10.         cols = Dict(:PANALOKARD_NO => :pk, :POST_DATE => :date, :AMOUNT => :amount);
  11.         elog_tbl = @> tbl begin
  12.             select((:PANALOKARD_NO, :POST_DATE, :AMOUNT))
  13.             renamecol(cols...)
  14.             reindex(:pk)
  15.         end
  16.        
  17.         elog_tbl = setcol(elog_tbl, :date => map(x -> Date(string(x), DateFormat("yyyymmdd")), select(elog_tbl, :date)));
  18.        
  19.         if !(end_cal isa Nothing)
  20.             elog_tbl = filter(t -> t.date <= end_cal, elog_tbl);
  21.         end
  22.        
  23.         # merge transactions to day
  24.         dat = groupby((s_amt = :amount => sum,), elog_tbl, (:pk, :date));
  25.        
  26.         # extract repeat transactions elog
  27.         dat1 = @apply dat begin
  28.             @groupby :pk (; subtable = _)
  29.             @filter length(:subtable) > 1
  30.             flatten
  31.         end
  32.        
  33.         # filter repeat transactions first date
  34.         first_date = @apply dat1 begin
  35.             @groupby :pk {
  36.                 mindate = minimum(:date),
  37.                 amount = :s_amt[argmin(:date)]
  38.             }
  39.         end
  40.        
  41.         # compute sufficient stats for repeat transactions
  42.         mxdate = maximum(select(dat, :date));
  43.         dat1 = @apply dat1 begin
  44.             @groupby :pk {
  45.                 x = length(_) - 1,
  46.                 mx = sum(:s_amt),
  47.                 tx = ((maximum(:date) - minimum(:date)) / Day(365)) * 12,
  48.                 tcal = ((mxdate - minimum(:date)) / Day(365)) * 12
  49.             }
  50.         end
  51.        
  52.         upmx = select(dat1, :mx) - select(first_date, :amount);
  53.        
  54.         dat1 = @> dat1 begin
  55.             insertcol(3, :upmx, upmx)
  56.             renamecol((:mx => :oldmx, :upmx => :mx))
  57.             @select (:pk, :x, :mx, :tx, :tcal)
  58.         end
  59.        
  60.         # extract non-repeat transactions and compute sufficient statistics
  61.         dat2 = @apply dat begin
  62.             @groupby :pk (; subtable = _)
  63.             @filter length(:subtable) == 1
  64.             flatten
  65.         end
  66.        
  67.         dat2 = @apply dat2 begin
  68.             @groupby :pk {
  69.                 x = length(_) - 1,
  70.                 mx = 0,
  71.                 tx = ((maximum(:date) - minimum(:date)) / Day(365)) * 12,
  72.                 tcal = ((mxdate - minimum(:date)) / Day(365)) * 12
  73.             }
  74.         end
  75.        
  76.         cbsfinal = merge(dat1, dat2);
  77.         cbsfinal = renamecol(cbsfinal, Dict(:mx => Symbol("m.x"), :tx => Symbol("t.x"), :tcal => Symbol("T.cal")))
  78.         return cbsfinal    
  79.     end
  80. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement