;;; -*- Mode: Lisp -*- ;;; ;;; $Header: /home/gene/library/website/docsrc/mpg/RCS/report4.lisp,v 395.4 2008/06/13 15:05:16 gene Exp $ ;;; ;;; Copyright (c) 2004, 2007-2008 Gene Michael Stover. All rights reserved. ;;; ;;; Create HTML & CSV reports of miles per gallon. ;;; (setf (logical-pathname-translations "CL-LIBRARY") (list (list "CYBERTIGGYR;TIME;TIME.LISP" "/home/gene/library/website/docsrc/pdl/time.lisp") (list "CYBERTIGGYR;*;*.LISP" "/home/gene/src/*/src/*.lisp"))) (load (translate-logical-pathname "CL-LIBRARY:CYBERTIGGYR;TIME;TIME.LISP")) (import 'cybertiggyr-time:*format-time-date*) (import 'cybertiggyr-time:*format-time-iso8601-long*) (import 'cybertiggyr-time:format-time) (import 'cybertiggyr-time:parse-time) (defstruct record car when gallons price-per-gallon dollars odometer) (defun record-after-p (a b) "If the WHEN of one record occurs before that of the other, the one with the earlier WHEN comes first. If their WHEN values are equivalent, the one with the lower ODOMETER comes first." (declare (type record a b)) (or (> (record-when a) (record-when b)) (and (= (record-when a) (record-when b)) (> (record-odometer a) (record-odometer b))))) (defun my-parse-time (x) "Parse X into a Universal Time. If X is a list, it must have three elements: year, month, & day, in that order. If X is a string, we hand it to CYBERTIGGYR-TIME:PARSE-TIME." (etypecase x (list (assert (eql 3 (length x))) (encode-universal-time 1 2 3 ; seconds minutes hours (third x) ; day of month (second x) ; month (first x))) ; year (string (parse-time x)))) (defun data (when gallons price-per-gallon dollars odometer car) (declare (type string when) (type number gallons price-per-gallon dollars odometer)) (assert (my-parse-time when)) (assert (not (minusp gallons))) (assert (not (minusp price-per-gallon))) (assert (not (minusp dollars))) (assert (not (minusp odometer))) (make-record :when (my-parse-time when) :gallons gallons :price-per-gallon price-per-gallon :dollars dollars :odometer odometer :car car)) (format t "~&;; Making big fat DATA table") (force-output) (defvar *data-time-start* (get-universal-time)) (defvar *db* (list ;; date gallons pergal price miles car (data '(2008 6 10) 8.558 4.299 36.79 59810 "1999 Suzuki Swift") (data '(2008 5 21) 8.387 3.979 33.37 59472 "1999 Suzuki Swift") (data '(2008 5 5) 8.282 3.769 31.21 59179 "1999 Suzuki Swift") (data '(2008 4 22) 8.615 3.699 31.87 58895 "1999 Suzuki Swift") (data '(2008 4 8) 8.248 3.599 29.68 58600 "1999 Suzuki Swift") (data '(2008 3 30) 7.407 3.439 25.47 58389 "1999 Suzuki Swift") (data '(2008 3 16) 7.552 3.589 27.10 58096 "1999 Suzuki Swift") (data '(2008 3 2) 8.273 3.549 29.36 57841 "1999 Suzuki Swift") (data '(2008 2 10) 8.577 3.179 27.27 57574 "1999 Suzuki Swift") (data '(2008 1 24) 8.443 3.129 26.42 57291 "1999 Suzuki Swift") (data '(2008 1 9) 7.368 3.299 24.31 57013 "1999 Suzuki Swift") (data '(2007 12 24) 8.136 3.119 25.38 56784 "1999 Suzuki Swift") (data '(2007 12 8) 4.555 3.269 14.89 56504 "1999 Suzuki Swift") (data '(2007 12 2) 9.163 3.279 30.05 56351 "1999 Suzuki Swift") (data '(2007 11 17) 4.315 3.339 14.41 56047 "1999 Suzuki Swift") (data '(2007 11 10) 9.028 3.339 30.14 55903 "1999 Suzuki Swift") (data '(2007 10 27) 8.840 3.199 28.28 55584 "1999 Suzuki Swift") (data '(2007 10 15) 8.479 2.999 25.43 55272 "1999 Suzuki Swift") (data '(2007 9 27) 8.667 2.919 25.30 54993 "1999 Suzuki Swift") (data '(2007 9 16) 7.543 2.839 21.41 54667 "1999 Suzuki Swift") (data '(2007 9 6) 7.879 2.899 22.84 54356 "1999 Suzuki Swift") (data '(2007 8 28) 8.927 2.739 24.45 54029 "1999 Suzuki Swift") (data '(2007 8 19) 3.723 2.859 10.64 53664.5 "1999 Suzuki Swift") (data '(2007 8 14) 7.390 2.799 20.68 53515 "1999 Suzuki Swift") (data '(2007 8 8) 7.094 2.859 20.28 53196 "1999 Suzuki Swift") (data '(2007 7 26) 8.514 2.899 24.68 52925 "1999 Suzuki Swift") (data '(2007 7 9) 8.808 3.099 27.30 52628 "1999 Suzuki Swift") (data '(2007 6 24) 9.082 3.079 27.96 52301 "1999 Suzuki Swift") (data '(2007 6 7) 9.273 3.279 30.41 51972 "1999 Suzuki Swift") (data '(2007 5 24) 7.868 3.399 26.74 51636 "1999 Suzuki Swift") (data '(2007 5 14) 4.877 3.459 16.87 51346 "1999 Suzuki Swift") (data '(2007 5 7) 8.636 3.459 29.87 51186 "1999 Suzuki Swift") (data '(2007 4 23) 8.270 3.189 26.37 50861 "1999 Suzuki Swift") (data "2007-apr-09" 9.059 3.079 27.89 50568 "1999 Suzuki Swift") (data "2007-mar-27" 8.993 2.929 26.43 50247 "1999 Suzuki Swift") (data "2007-mar-14" 8.336 2.819 23.50 49924 "1999 Suzuki Swift") (data "2007-mar-01" 7.609 2.689 20.46 49633 "1999 Suzuki Swift") (data "2007-feb-19" 7.268 2.599 18.89 49363 "1999 Suzuki Swift") (data "2007-feb-07" 7.779 2.639 20.53 49106 "1999 Suzuki Swift") (data "2007-jan-24" 7.912 2.759 21.83 48845 "1999 Suzuki Swift") (data "2007-jan-12" 6.746 2.819 19.02 48576 "1999 Suzuki Swift") (data "2007-jan-01" 8.986 2.759 24.79 48345 "1999 Suzuki Swift") (data "2006-dec-14" 7.404 2.769 20.50 48069 "1999 Suzuki Swift") (data "2006-dec-05" 6.448 2.729 17.60 47804 "1999 Suzuki Swift") (data "2006-nov-26" 3.003 2.669 8.02 47586 "1999 Suzuki Swift") (data "2006-nov-21" 7.708 2.729 21.04 47483 "1999 Suzuki Swift") (data "2006-nov-09" 7.619 2.639 20.11 47217 "1999 Suzuki Swift") (data "2006-oct-31" 7.676 2.559 19.64 46956 "1999 Suzuki Swift") (data "2006-oct-17" 8.347 2.669 22.28 46708 "1999 Suzuki Swift") (data "2006-sep-28" 8.649 2.819 24.38 46431 "1999 Suzuki Swift") (data "2006-sep-02" 9.052 3.019 27.33 46173 "1999 Suzuki Swift") (data "2006-aug-02" 8.775 3.059 26.84 45883 "1999 Suzuki Swift") (data "2006-jul-09" 9.110 3.189 29.05 45603 "1999 Suzuki Swift") (data "2006-may-12" 9.506 3.199 30.41 45036 "1999 Suzuki Swift") (data "2006-apr-19" 9.023 2.849 25.71 44736 "1999 Suzuki Swift") (data "2006-mar-23" 9.044 2.539 22.96 44459 "1999 Suzuki Swift") (data "2006-feb-28" 8.664 2.239 19.40 44182 "1999 Suzuki Swift") (data "2006-feb-02" 9.008 2.279 20.53 43923 "1999 Suzuki Swift") (data "2006-jan-11" 8.543 2.159 18.44 43682 "1999 Suzuki Swift") (data "2005-dec-16" 8.904 2.179 19.40 43418 "1999 Suzuki Swift") (data "2005-nov-23" 8.839 2.299 20.32 43167 "1999 Suzuki Swift") (data "2005-oct-28" 9.107 2.749 25.04 42911 "1999 Suzuki Swift") (data "2005-oct-10" 8.333 2.889 24.07 42625 "1999 Suzuki Swift") (data "2005-sep-22" 8.810 2.959 26.07 42320 "1999 Suzuki Swift") (data "2005-aug-26" 8.924 2.789 24.89 41986 "1999 Suzuki Swift") (data "2005-aug-09" 8.890 2.719 24.17 41666 "1999 Suzuki Swift") (data "2005-jul-24" 9.423 2.519 23.74 41333 "1999 Suzuki Swift") (data "2005-jul-03" 9.139 2.459 22.47 40995 "1999 Suzuki Swift") (data "2005-jun-15" 9.310 2.349 21.87 40659 "1999 Suzuki Swift") (data "2005-may-25" 8.977 2.439 21.89 40341 "1999 Suzuki Swift") (data "2005-may-09" 8.617 2.479 21.36 40028 "1999 Suzuki Swift") (data "2005-apr-18" 8.731 2.499 21.82 39728 "1999 Suzuki Swift") (data "2005-mar-28" 8.815 2.279 20.09 39447 "1999 Suzuki Swift") (data "2005-mar-08" 9.045 2.153 19.53 39143 "1999 Suzuki Swift") (data "2005-feb-17" 9.048 1.999 18.09 38831 "1999 Suzuki Swift") (data "2005-jan-31" 9.211 1.929 17.77 38524 "1999 Suzuki Swift") (data "2005-jan-12" 8.976 1.799 16.15 38213 "1999 Suzuki Swift") (data "2004-dec-23" 8.753 1.859 16.27 37920 "1999 Suzuki Swift") (data "2004-dec-09" 7.936 1.959 15.55 37631 "1999 Suzuki Swift") (data "2004-nov-22" 7.952 2.059 16.37 37357 "1999 Suzuki Swift") (data "2004-nov-07" 4.211 2.059 8.67 37076 "1999 Suzuki Swift") (data "2004-nov-01" 5.414 2.099 11.36 36951 "1999 Suzuki Swift") (data "2004-oct-21" 6.749 2.099 14.17 36761 "1999 Suzuki Swift") (data "2004-oct-10" 8.475 2.089 17.70 36531 "1999 Suzuki Swift") (data "2004-Sep-27" 8.533 2.049 17.48 36201 "1999 Suzuki Swift") (data "2004-Sep-10" 9.403 2.089 19.64 35866 "1999 Suzuki Swift") (data "19990521" 2.551 1.419 3.62 93 "1999 Suzuki Swift") (data "19990531" 5.234 1.389 7.27 233 "1999 Suzuki Swift") (data "19990606" 4.103 1.389 4.70 377 "1999 Suzuki Swift") (data "19990622" 6.990 1.429 9.99 661 "1999 Suzuki Swift") (data "19990715" 7.524 1.469 11.05 931 "1999 Suzuki Swift") (data "19990808" 6.955 1.499 10.43 1196 "1999 Suzuki Swift") (data "19990815" 4.854 1.499 7.28 1417 "1999 Suzuki Swift") (data "19990829" 7.090 1.499 10.63 1664 "1999 Suzuki Swift") (data "19990916" 7.844 1.499 11.76 1946 "1999 Suzuki Swift") (data "19991012" 7.796 1.469 11.45 2225 "1999 Suzuki Swift") (data "19991101" 8.561 1.449 12.40 2526 "1999 Suzuki Swift") (data "19991116" 8.407 1.899 15.96 2818 "1999 Suzuki Swift") (data "19991129" 7.337 1.399 10.26 3080 "1999 Suzuki Swift") (data "19991213" 8.127 1.419 11.53 3388 "1999 Suzuki Swift") (data "19991227" 7.161 1.439 10.30 3635 "1999 Suzuki Swift") (data "20000120" 8.500 1.479 12.57 3924 "1999 Suzuki Swift") (data "20000212" 8.778 1.489 13.07 4232 "1999 Suzuki Swift") (data "20000227" 6.137 1.499 9.20 4481 "1999 Suzuki Swift") (data "20000227" 7.102 1.549 11.00 4768 "1999 Suzuki Swift") (data "20000228" 7.497 1.659 12.44 5090 "1999 Suzuki Swift") (data "20000301" 8.296 1.819 15.09 5446 "1999 Suzuki Swift") (data "20000302" 5.811 1.759 10.22 5745 "1999 Suzuki Swift") (data "20000304" 8.145 1.599 13.02 6376 "1999 Suzuki Swift") (data "20000325" 8.862 1.779 15.45 6682 "1999 Suzuki Swift") (data "20000413" 8.675 1.699 14.74 7007 "1999 Suzuki Swift") (data "20000423" 6.923 1.699 11.76 7288 "1999 Suzuki Swift") (data "20000501" 8.234 1.739 14.32 7627 "1999 Suzuki Swift") (data "20000510" 7.994 1.699 13.58 7928 "1999 Suzuki Swift") (data "20000523" 8.214 1.699 13.96 8282 "1999 Suzuki Swift") (data "20000601" 7.654 1.669 12.77 8592 "1999 Suzuki Swift") (data "20000612" 7.236 1.669 12.08 8874 "1999 Suzuki Swift") (data "20000622" 8.536 1.669 14.25 9232 "1999 Suzuki Swift") (data "20000629" 8.291 1.649 13.67 9613 "1999 Suzuki Swift") (data "20000711" 8.018 1.729 13.86 9938 "1999 Suzuki Swift") (data "20000723" 8.486 1.729 14.67 10298 "1999 Suzuki Swift") (data "20000804" 8.369 1.729 14.47 10651 "1999 Suzuki Swift") (data "20000813" 5.677 1.729 9.82 10904 "1999 Suzuki Swift") (data "20000819" 7.19 1.719 12.36 11210 "1999 Suzuki Swift") (data "20000828" 8.386 1.789 15.00 11594 "1999 Suzuki Swift") (data "20000908" 8.031 1.829 14.69 11929 "1999 Suzuki Swift") (data "20000920" 7.920 1.799 14.25 12269 "1999 Suzuki Swift") (data "20001002" 7.530 1.799 13.55 12580 "1999 Suzuki Swift") (data "20001010" 7.609 1.799 13.69 12905 "1999 Suzuki Swift") (data "20001020" 8.428 1.799 15.16 13242 "1999 Suzuki Swift") (data "20001026" 4.847 1.669 8.09 13435 "1999 Suzuki Swift") (data "20001027" 6.695 1.829 12.25 13724 "1999 Suzuki Swift") (data "20001103" 7.730 1.769 13.67 14105 "1999 Suzuki Swift") (data "20001113" 8.755 1.729 15.14 14425 "1999 Suzuki Swift") (data "20001127" 8.4 2.249 18.98 14764.5 "1999 Suzuki Swift") (data "20001205" 8.224 1.729 14.22 15092 "1999 Suzuki Swift") (data "20001215" 8.217 1.729 14.21 15433 "1999 Suzuki Swift") (data "20010101" 8.400 1.599 13.43 15738.5 "1999 Suzuki Swift") (data "20010203" 8.537 1.629 13.91 16084 "1999 Suzuki Swift") (data "20010210" 3.874 1.459 5.65 16242 "1999 Suzuki Swift") (data "20010220" 8.301 1.629 13.52 16598 "1999 Suzuki Swift") (data "20010307" 8.414 1.629 13.71 16935 "1999 Suzuki Swift") (data "20010329" 8.692 1.629 14.16 17267.5 "1999 Suzuki Swift") (data "20010419" 8.783 1.629 14.31 17625 "1999 Suzuki Swift") (data "20010511" 8.254 1.629 13.45 17942 "1999 Suzuki Swift") (data "20010524" 8.751 1.629 14.26 18298 "1999 Suzuki Swift") (data "20010607" 8.192 1.679 13.75 18622.5 "1999 Suzuki Swift") (data "20010702" 8.948 1.699 15.20 18907 "1999 Suzuki Swift") (data "20010909" 8.248 1.749 14.43 19407 "1999 Suzuki Swift") (data "20011010" 8.742 1.799 15.73 19650 "1999 Suzuki Swift") (data "20011218" 8.178 1.279 10.46 20436 "1999 Suzuki Swift") (data "20020411" 9.065 1.459 13.23 21490 "1999 Suzuki Swift") (data "20020530" 8.365 1.479 12.37 21982 "1999 Suzuki Swift") (data "20020626" 8.867 1.539 13.65 22264.75 "1999 Suzuki Swift") (data "20020717" 8.985 1.499 13.47 22545.5 "1999 Suzuki Swift") (data "20020801" 9.041 1.549 14.00 22861 "1999 Suzuki Swift") (data "20020822" 9.213 1.519 13.99 23168 "1999 Suzuki Swift") (data "20020911" 9.013 1.519 13.69 23476 "1999 Suzuki Swift") (data "20021028" 9.116 1.439 13.12 24298 "1999 Suzuki Swift") (data "20021112" 8.828 1.499 13.23 24597 "1999 Suzuki Swift") (data "20021205" 8.845 1.499 13.26 24859 "1999 Suzuki Swift") (data "20021213" 5.246 1.469 7.71 25027 "1999 Suzuki Swift") (data "20030101" 8.624 1.379 11.89 25271 "1999 Suzuki Swift") (data "20030121" 9.231 1.359 12.54 25532 "1999 Suzuki Swift") (data "20030207" 7.602 1.589 12.08 25795 "1999 Suzuki Swift") (data "20030301" 8.837 1.859 16.43 26059 "1999 Suzuki Swift") (data "20030319" 8.857 1.899 16.82 26335 "1999 Suzuki Swift") (data "20030330" 4.097 1.889 7.74 26471 "1999 Suzuki Swift") (data "20030421" 8.920 1.749 15.60 26732 "1999 Suzuki Swift") (data "20030508" 9.329 1.639 15.29 27029 "1999 Suzuki Swift") (data "20030602" 8.313 1.529 12.71 27301 "1999 Suzuki Swift") (data "20030715" 9.237 1.589 14.68 27849.5 "1999 Suzuki Swift") (data "20030622" 8.994 1.529 13.75 27568 "1999 Suzuki Swift") (data "20030806" 9.128 1.599 14.60 28153 "1999 Suzuki Swift") (data "20030827" 8.890 2.009 17.86 28440 "1999 Suzuki Swift") (data "20030911" 9.010 1.879 16.93 28802 "1999 Suzuki Swift") (data "20030925" 7.171 1.799 12.90 29125 "1999 Suzuki Swift") (data "20031005" 9.018 1.719 15.50 29411 "1999 Suzuki Swift") (data "20031014" 8.984 1.669 14.99 29735 "1999 Suzuki Swift") (data "20031027" 8.958 1.589 14.23 30078 "1999 Suzuki Swift") (data "20031106" 9.457 1.599 15.12 30413 "1999 Suzuki Swift") (data "20031117" 8.329 1.569 13.07 30703 "1999 Suzuki Swift") (data "20031126" 9.113 1.499 13.66 31028 "1999 Suzuki Swift") (data "20031209" 8.532 1.519 12.96 31344 "1999 Suzuki Swift") (data "20031219" 9.340 1.619 15.12 31680 "1999 Suzuki Swift") (data "20040109" 8.979 1.549 13.91 31970 "1999 Suzuki Swift") (data "20040204" 8.802 1.639 14.43 32247 "1999 Suzuki Swift") (data "20040226" 8.841 1.719 15.20 32500 "1999 Suzuki Swift") (data "20040316" 9.097 1.839 16.73 32817 "1999 Suzuki Swift") (data "20040420" 9.455 2.049 19.37 33107 "1999 Suzuki Swift") (data "20040506" 8.396 2.189 18.38 33415 "1999 Suzuki Swift") (data "20040610" 8.949 2.309 20.66 34138 "1999 Suzuki Swift") (data "19970925" 14.365 1.659 23.83 262 "Ford Explorer") (data "19970928" 8.266 1.469 12.14 428 "Ford Explorer") (data "19970929" 13.258 1.489 19.74 688 "Ford Explorer") (data "19971018" 12.409 1.499 18.60 1144 "Ford Explorer") (data "19971025" 14.146 1.479 20.92 1397 "Ford Explorer") (data "19971026" 9.941 1.479 14.70 1610 "Ford Explorer") (data "19971101" 13.911 1.529 21.27 1866 "Ford Explorer") (data "19971107" 13.727 1.479 20.30 2111 "Ford Explorer") (data "19971113" 15.134 1.529 23.14 2365 "Ford Explorer") (data "19971122" 13.770 1.429 19.68 2613 "Ford Explorer") (data "19971206" 11.506 1.439 16.56 2816 "Ford Explorer") (data "19971209" 14.728 1.489 21.93 3140 "Ford Explorer") (data "19980104" 14.561 1.479 23.54 3629 "Ford Explorer") (data "19980113" 12.872 1.459 18.78 3850 "Ford Explorer") (data "19980121" 13.639 1.439 19.63 4101 "Ford Explorer") (data "19980131" 14.976 1.319 19.75 4368 "Ford Explorer") (data "19980206" 15.794 1.379 21.78 4679 "Ford Explorer") (data "19980213" 14.511 1.349 19.58 4939 "Ford Explorer") (data "19980223" 16.321 1.359 22.18 5214 "Ford Explorer") (data "19980228" 10.774 1.209 13.03 5441 "Ford Explorer") (data "19980304" 15.463 1.319 20.40 5747 "Ford Explorer") (data "19980310" 15.785 1.199 18.93 6020 "Ford Explorer") (data "19980321" 11.683 1.219 14.24 6510 "Ford Explorer") (data "19980329" 16.163 1.199 19.38 6809 "Ford Explorer") (data "19980405" 15.166 1.179 17.88 7104 "Ford Explorer") (data "19980411" 11.613 1.159 13.46 7328 "Ford Explorer") (data "19980411" 14.386 1.209 17.39 7621 "Ford Explorer") (data "19980418" 15.496 1.199 18.58 7922 "Ford Explorer") (data "19980426" 15.689 1.139 17.87 8214 "Ford Explorer") (data "19980504" 16.304 1.319 21.50 8504 "Ford Explorer") (data "19980514" 14.943 1.339 20.01 8806 "Ford Explorer") (data "19980603" 16.012 1.149 18.40 9372 "Ford Explorer") (data "19980607" 16.122 1.139 18.36 9689 "Ford Explorer") (data "19980611" 10.177 1.169 11.90 9902 "Ford Explorer") (data "19980611" 11.172 1.199 13.40 10150 "Ford Explorer") (data "19980612" 11.976 1.169 14.00 10404 "Ford Explorer") (data "19980612" 7.420 1.339 9.94 10573 "Ford Explorer") (data "19980613" 6.685 1.339 8.95 10707 "Ford Explorer") (data "19980613" 8.103 1.399 11.34 10896 "Ford Explorer") (data "19980617" 14.933 1.359 20.29 11185 "Ford Explorer") (data "19980618" 8.121 1.299 10.55 11346 "Ford Explorer") (data "19980618" 12.681 1.159 14.70 11606 "Ford Explorer") (data "19980618" 9.174 1.199 11.00 11812 "Ford Explorer") (data "19980619" 8.934 1.129 10.09 11989 "Ford Explorer") (data "19980630" 14.857 1.219 18.11 12290 "Ford Explorer") (data "19980705" 12.999 1.349 17.54 12535 "Ford Explorer") (data "19980710" 15.306 1.149 17.59 12825 "Ford Explorer") (data "19980720" 15.985 1.199 19.17 13124 "Ford Explorer") (data "19980803" 14.884 1.199 17.85 13421 "Ford Explorer") (data "19980808" 14.854 1.119 16.62 13695 "Ford Explorer") (data "19980818" 15.769 1.219 19.22 13968 "Ford Explorer") (data "19980821" 10.057 1.139 11.45 14173 "Ford Explorer") (data "19980827" 15.404 1.219 18.78 14461 "Ford Explorer") (data "19980911" 14.958 1.099 16.44 15317 "Ford Explorer") (data "19980915" 14.349 1.099 15.77 15639 "Ford Explorer") (data "19980919" 15.941 1.159 20.27 15960 "Ford Explorer") (data "19980924" 15.449 1.179 18.21 16777 "Ford Explorer") (data "19980930" 13.707 1.189 16.30 16557 "Ford Explorer") (data "19981006" 13.692 1.199 16.21 16837 "Ford Explorer") (data "19981015" 16.208 1.099 17.81 17455 "Ford Explorer") (data "19981021" 14.978 1.149 17.21 17770 "Ford Explorer") (data "19981028" 14.141 1.129 15.97 18052 "Ford Explorer") (data "19981103" 12.467 1.169 14.57 18302 "Ford Explorer") (data "19981108" 12.930 1.149 14.86 18551 "Ford Explorer") (data "19981113" 15.271 1.129 17.24 18871 "Ford Explorer") (data "19981117" 11.428 1.149 13.13 19094 "Ford Explorer") (data "19981123" 13.789 1.129 15.57 19362 "Ford Explorer") (data "19981130" 13.191 1.149 15.16 19608 "Ford Explorer") (data "19981203" 15.132 1.149 17.39 19907 "Ford Explorer") (data "19981213" 12.960 1.169 15.15 20479 "Ford Explorer") (data "19981217" 14.817 1.099 16.28 20762 "Ford Explorer") (data "19981231" 14.794 1.149 17.00 21031 "Ford Explorer") (data "19990107" 15.139 1.099 16.64 21327 "Ford Explorer") (data "19990112" 13.695 1.149 15.74 21601 "Ford Explorer") (data "19990118" 13.334 1.099 14.65 21863 "Ford Explorer") (data "19990121" 15.256 1.099 16.77 22151 "Ford Explorer") (data "19990126" 14.108 1.119 15.79 22436 "Ford Explorer") (data "19990130" 14.129 1.079 15.25 22703 "Ford Explorer") (data "19990204" 13.797 1.129 15.58 22975 "Ford Explorer") (data "19990209" 11.699 1.099 12.86 23213 "Ford Explorer") (data "19990215" 15.806 1.039 16.42 23519 "Ford Explorer") (data "19990219" 13.640 1.099 14.99 23787 "Ford Explorer") (data "19990223" 14.496 1.059 15.35 24085 "Ford Explorer") (data "19990228" 14.784 1.059 15.66 24359 "Ford Explorer") (data "19990309" 13.288 1.089 14.47 24904 "Ford Explorer") (data "19990315" 13.681 1.199 16.40 25166 "Ford Explorer") (data "19990316" 7.484 1.139 8.52 25322 "Ford Explorer") (data "19990322" 14.783 1.159 17.13 25614 "Ford Explorer") (data "19990326" 14.286 1.259 17.99 25922 "Ford Explorer") (data "19990331" 2.081 1.279 2.66 26191 "Ford Explorer") (data "19990401" 13.408 1.399 18.76 26213 "Ford Explorer") (data "19990407" 15.494 1.399 21.68 26518 "Ford Explorer") (data "19990418" 12.746 1.459 18.60 27073 "Ford Explorer") (data "19990426" 14.419 1.499 21.61 27347 "Ford Explorer") (data "19990507" 13.436 1.399 18.80 27567 "Ford Explorer") (data "19990518" 15.434 1.419 21.90 27831 "Ford Explorer") (data "19950110" 17.024 0 23.48 94008.5 "Mercury Cougar") (data "19950115" 14.749 0 21.81 94402.8 "Mercury Cougar") (data "19950118" 17.617 0 26.41 94765.3 "Mercury Cougar") (data "19950122" 15.272 0 22.59 95145.9 "Mercury Cougar") (data "19950128" 16.963 0 24.24 95536.1 "Mercury Cougar") (data "19950202" 13.860 0 21.05 95919.9 "Mercury Cougar") (data "19950208" 16.089 0 23.80 96274.1 "Mercury Cougar") (data "19950215" 14.630 0 21.93 96622.3 "Mercury Cougar") (data "19950219" 14.643 0 21.95 96963.8 "Mercury Cougar") (data "19950224" 17.428 0 25.43 97339.9 "Mercury Cougar") (data "19950310" 18.280 1.489 27.22 97692.0 "Mercury Cougar") (data "19950325" 13.057 0 20.00 98058.3 "Mercury Cougar") (data "19950402" 13.342 1.499 20.00 98364.7 "Mercury Cougar") (data "19950409" 16.501 1.449 23.91 98717.1 "Mercury Cougar") (data "19950417" 15.104 1.329 20.07 99046.7 "Mercury Cougar") (data "19950410" 16.529 1.399 23.12 99822.1 "Mercury Cougar") (data "19950520" 16.679 1.379 23.00 100142.1 "Mercury Cougar") (data "19950530" 18.967 1.419 26.91 100590.5 "Mercury Cougar") (data "19950619" 15.249 1.319 20.11 101292.4 "Mercury Cougar") (data "19950624" 10.689 1.569 16.77 101531.6 "Mercury Cougar") (data "19950630" 15.938 1.599 25.48 101941.3 "Mercury Cougar") (data "19950711" 18.905 1.539 29.09 102304.2 "Mercury Cougar") (data "19950722" 15.560 1.399 21.77 102708.5 "Mercury Cougar") (data "19950728" 16.162 1.389 22.45 103050.0 "Mercury Cougar") (data "19950804" 18.480 1.449 26.78 103476.6 "Mercury Cougar") (data "19950812" 11.754 1.539 18.09 103772.9 "Mercury Cougar") (data "19950827" 17.364 1.499 26.03 104129.9 "Mercury Cougar") (data "19950912" 13.807 1.379 19.04 104425.1 "Mercury Cougar") (data "19950923" 19.558 1.259 24.62 104732.1 "Mercury Cougar") (data "19951010" 18.440 1.299 23.95 105116.2 "Mercury Cougar") (data "19951017" 11.772 1.389 16.35 105398.5 "Mercury Cougar") (data "19951027" 14.904 1.389 20.70 105711.0 "Mercury Cougar") (data "19951029" 12.477 1.499 18.70 106051.7 "Mercury Cougar") (data "19951031" 16.052 1.299 20.85 106402.3 "Mercury Cougar") (data "19951109" 15.863 1.269 20.13 106797.9 "Mercury Cougar") (data "19951117" 15.636 1.379 21.56 107114.0 "Mercury Cougar") (data "19951126" 18.305 1.439 26.34 107472.2 "Mercury Cougar") (data "19951210" 16.016 1.259 20.16 107828.6 "Mercury Cougar") (data "19951217" 16.213 1.239 20.09 108090.7 "Mercury Cougar") (data "19951224" 14.673 1.299 19.06 108388.8 "Mercury Cougar") (data "19951225" 16.562 1.269 21.02 108768.3 "Mercury Cougar") (data "19960111" 11.809 1.379 16.28 109073.3 "Mercury Cougar") (data "19960119" 18.169 1.319 23.96 109354.1 "Mercury Cougar") (data "19960209" 20.269 1.329 26.94 109665.9 "Mercury Cougar") (data "19960218" 13.492 1.379 18.61 109940.7 "Mercury Cougar") (data "19960220" 19.084 1.279 24.41 110319.4 "Mercury Cougar") (data "19960307" 18.036 1.349 24.33 110652.8 "Mercury Cougar") (data "19960313" 18.327 1.359 24.91 111005.0 "Mercury Cougar") (data "19960320" 19.257 1.369 26.36 111431.8 "Mercury Cougar") (data "19960324" 15.719 1.379 21.68 111689.6 "Mercury Cougar") (data "19960403" 16.344 1.449 23.68 112057.5 "Mercury Cougar") (data "19960407" 12.270 1.399 17.17 112300.5 "Mercury Cougar") (data "19960414" 16.555 1.499 24.81 112651.2 "Mercury Cougar") (data "19960430" 17.566 1.619 28.41 113439.5 "Mercury Cougar") (data "19960505" 11.803 1.599 18.87 113710.1 "Mercury Cougar") (data "19960513" 11.507 1.679 19.32 114037.1 "Mercury Cougar") (data "19960520" 17.570 1.639 28.80 114241.5 "Mercury Cougar") (data "19960602" 18.948 1.699 30.66 114770.9 "Mercury Cougar") (data "19960608" 12.78 1.579 20.19 115013.3 "Mercury Cougar") (data "19960613" 16.831 1.619 27.25 115384.8 "Mercury Cougar") (data "19960629" 18.191 1.619 29.45 115712.1 "Mercury Cougar") (data "19960710" 17.770 1.579 28.06 116061.0 "Mercury Cougar") (data "19960711" 9.230 1.529 14.12 116320.9 "Mercury Cougar") (data "19960711" 6.980 1.579 11.02 116487.7 "Mercury Cougar") (data "19960711" 7.032 1.429 10.05 116693.8 "Mercury Cougar") (data "19960712" 6.235 1.599 9.97 116805.7 "Mercury Cougar") (data "19960712" 9.045 1.319 11.93 117017.6 "Mercury Cougar") (data "19960713" 8.817 1.319 11.63 117283.1 "Mercury Cougar") (data "19960713" 7.193 1.279 9.20 117479.2 "Mercury Cougar") (data "19960714" 8.50 1.179 10.03 118033.5 "Mercury Cougar") (data "19960714" 5.876 1.199 7.05 118230.6 "Mercury Cougar") (data "19960729" 16.689 1.259 21.01 118515.4 "Mercury Cougar") (data "19960813" 18.305 1.259 23.05 118817.0 "Mercury Cougar") (data "19960903" 18.436 1.259 23.21 119113.6 "Mercury Cougar") (data "19960921" 16.435 1.259 20.69 119644.1 "Mercury Cougar") (data "19960928" 12.5 1.399 17.54 119928.2 "Mercury Cougar") (data "19961014" 18.954 1.239 23.48 120266.5 "Mercury Cougar") (data "19960102" 16.442 1.259 20.70 120554.2 "Mercury Cougar") (data "19961110" 15.154 1.229 18.62 120817.9 "Mercury Cougar") (data "19961129" 20.311 1.299 26.38 121172.3 "Mercury Cougar") (data "19961213" 18.498 1.299 24.03 121533.4 "Mercury Cougar") (data "19961229" 13.558 1.289 17.48 121778.5 "Mercury Cougar") (data "19970119" 16.937 1.289 21.83 122124.7 "Mercury Cougar") (data "19970128" 16.382 1.289 21.12 122465.4 "Mercury Cougar") (data "19970217" 11.300 1.329 15.03 122674.3 "Mercury Cougar") (data "19970224" 14.850 1.399 20.78 123015.1 "Mercury Cougar") (data "19970307" 15.400 1.399 21.54 123300.6 "Mercury Cougar") (data "19970325" 18.266 1.339 24.46 123858.9 "Mercury Cougar") (data "19970407" 13.862 1.299 18.01 124150.0 "Mercury Cougar") (data "19970411" 15.361 1.319 20.26 124456.6 "Mercury Cougar") (data "19970420" 13.021 1.329 17.30 124724.1 "Mercury Cougar") (data "19970420" 6.494 1.269 8.24 124902.7 "Mercury Cougar") (data "19970430" 15.091 1.269 19.15 125251.7 "Mercury Cougar") (data "19970511" 14.528 1.399 20.32 125519.9 "Mercury Cougar") (data "19970524" 17.554 1.299 22.80 125801.0 "Mercury Cougar") (data "19970614" 11.563 1.299 15.02 126329.0 "Mercury Cougar") (data "19970614" 11.91 1.299 15.48 126598.0 "Mercury Cougar") (data "19970710" 15.34 1.379 21.17 127275.2 "Mercury Cougar") (data "19970712" 13.4 1.429 19.13 127550.1 "Mercury Cougar") (data "19970724" 17.209 1.319 22.70 127930.1 "Mercury Cougar") (data "19970803" 16.383 1.249 20.46 128280.9 "Mercury Cougar") (data "19970809" 12.94 1.33 17.34 128593.8 "Mercury Cougar") (data "19970818" 15.603 1.399 21.83 128991.2 "Mercury Cougar") (data "19970829" 16.885 1.459 24.64 129331.4 "Mercury Cougar") (data "19970915" 15.293 1.459 22.31 129668.4 "Mercury Cougar"))) (defvar *data-time-end* (get-universal-time)) (format t "...done!") (force-output) (format t "~&;; ~D records in ~D seconds." (length *db*) (- *data-time-end* *data-time-start*)) (defun days (a b) "Return the number of days between the two records A & B." (declare (type record a b)) (/ (max (- (record-when a) (record-when b) 1)) ; seconds 60.0 ; minutes 60.0 ; hours 24.0)) ; days (defun miles (a b) "Return the number of miles between the two records A & B." (- (record-odometer a) (record-odometer b))) (defun make-line (a &optional (b nil)) "Return an ordered list of the elements in an output row. A is the current record. B is the previous record." (list (format-time nil "%Y-%m-%d" (record-when a)) (record-odometer a) (record-dollars a) (record-gallons a) (miles a b) (days a b) (/ (miles a b) (record-gallons a)) (/ (record-dollars a) (record-gallons a)) (/ (record-dollars a) (miles a b)) (/ (record-dollars a) (days a b)) (record-car a))) (defun print-html-row (strm when odometer dollars gallons miles days mpg dpg dpm dpd car) (declare (ignore car)) (format strm "
| date | ") (format strm "odometer | ") (format strm "dollars | ") (format strm "gallons | ") (format strm "miles | ") (format strm "days | ") (format strm "mile/gallon | ") (format strm "dollar/gallon | ") (format strm "dollar/mile | ") (format strm "dollar/day |
|---|
by Gene Michael Stover
") (format strm "Copyright © 2003--2005, 2007--2008 by") (format strm "~&Gene Michael Stover. All rights reserved. Permission") (format strm "~&to copy, transmit,") (format strm "~&store, & view this document") (format strm "~&unmodified & in its entirety is granted.") (format strm "
") (format strm "1999 May to present
")
(format strm "Washington, USA
1997 August to 1999 May
")
(format strm "Washington, USA
1995 January to 1997 August
")
(format strm "~&in California, Tennessee, & Washington (state).
As you can see, I've kept pretty decent records since") (format strm "~&1995, but I've made some mistakes. If you see a value that") (format strm "~&is clearly impossible, then I must have made an error in") (format strm "~&data entry. The most likely error might be forgetting to") (format strm "~&enter a gasoline purchase in my database. An example of") (format strm "~&such an impossible value would be a negative dollar/day.
") (format strm "Each row records a gasoline purchase.
") (format strm "The columns are:
") (format strm "End.
") (format strm "root") (format strm "
") (format strm "") (format strm "") (truename strm))) (defun print-csv-row (strm &rest fields) ;; I'd like to use FORMAT's ~{~} controls to iterate over ;; fields, but we must ensure that we write numbers as ;; floating point or fixed point, never as ratios. So ;; we must iterate over FIELDS. (format strm "~{~A~^,~}~&" (loop for x in fields collect (format nil (if (numberp x) "~,6F" "~A") x)))) (defun rpt-csv (&optional (pn (make-pathname :directory '(:relative) :name "mpg" :type "csv"))) (with-open-file (strm pn :direction :output :if-exists :rename-and-delete) (format strm "~{~A~^,~}~&" '(date odometer dollars gallons miles days "MILE/GALLON" "DOLLAR/GALLON" "DOLLAR/MILE" "DOLLAR/DAY")) (maplist #'(lambda (lst2) (when (rest lst2) (apply #'print-csv-row strm (make-line (first lst2) (second lst2))))) (sort (copy-list *db*) #'record-after-p)) (truename strm))) (defun rpt () (list (rpt-html) (rpt-csv))) ;;; --- ene of file ---