(defun discretize (tbl n &key (using #'ewd) (cautions (make-caution))) (labels ((col1 (col) (if (header-numericp (first col)) (funcall using (rest col) n cautions) (rest col)))) (let* ((headers (counted-all (table-columns tbl))) (egs (table-egs tbl)) (data (cons headers egs)) (columns (transpose data)) (discretized (mapcar #'col1 columns))) (table-copy tbl (reverse (transpose discretized)))))) (defun logc (data n &optional (cautions (make-caution))) (log-continuous data n cautions)) (defun ewd (data n &optional (cautions (make-caution))) (equal-width-discretization data n cautions)) (defun efd (data n &optional (cautions (make-caution))) (equal-frequency-discretization data n cautions)) (defun sane-numbers (data &optional (cautions (make-caution)) (sortp t)) (let (numbers) (dolist (datum data (if sortp (sort (copy-list numbers) #'<) numbers)) (unless (unknownp datum) (if (ok (numberp datum) cautions "~a not a number" datum) (push datum numbers)))))) (deftest test-discretize () (labels ((nums (n tbl) (mapcar #'(lambda (x) (nth n x)) (table-egs tbl)))) (let ((tmp (with-output-to-string (s) (dotimes (i 10) (format s "~a = ~a~%" i (efd1 i '(4 8 9)))))) (raw (weather-numerics)) (ewd (discretize (weather-numerics) 3 :using #'ewd)) (efd (discretize (weather-numerics) 3 :using #'efd))) (check (equalp '(1 1 1 1 1 2 2 3 3 4 34 34) (sane-numbers '(1 1 3 1 3 2 34 1 1 ? 2 34 4))) (samep tmp " 0 = 4 1 = 4 2 = 4 3 = 4 4 = 4 5 = 8 6 = 8 7 = 8 8 = 8 9 = 9") (equalp (breaks '(1 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 7 8 9 10 11 12) 3) '(3 6 7 10 12)) (equalp '(2 2 2 2 6 6 6 6 9 9 9) (equal-frequency-discretization '(1 1 1 2 3 4 5 6 7 8 9) 3 ))) (equalp (nums 2 ewd) '(96.0 75.333336 96.0 75.333336 85.666664 75.333336 96.0 75.333336 75.333336 85.666664 96.0 96.0 96.0 85.666664)) (equalp (nums 2 efd) '(96 75 90 75 90 75 96 75 75 90 96 90 90 90)))))