Skip to content

Commit

Permalink
Barclays namespace and a more complete import and basic processing of…
Browse files Browse the repository at this point in the history
… all statements
  • Loading branch information
stathissideris committed Sep 14, 2011
1 parent 672b2ed commit f2f66ec
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 29 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ pom.xml
.lein-failures
.lein-deps-sum
/data/
/src/moneyz/local.clj
51 changes: 51 additions & 0 deletions src/moneyz/barclays.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
(ns moneyz.barclays
(:use (incanter core charts io))
(:require [clojure.set :as set])
(:import (java.text SimpleDateFormat)))

(defn parse-date [date] (.parse (SimpleDateFormat. "dd/MM/yyyy") date))
(defn parse-dates [dates] (map parse-date dates))
(defn to-millis [dates] (map #(.getTime %) dates))
(def process-dates (comp to-millis parse-dates))

(defn get-csvs [path]
(filter #(.endsWith % ".csv")
(map #(.getAbsolutePath %)
(.listFiles (java.io.File. path)))))

(defn merge-statements
[d1 d2]
(dataset
(:column-names d1)
(sort-by :Date (distinct (concat (:rows d1) (:rows d2))))))

(defn split-by-account [statement]
(into {}
(map
(fn [[key d]] [key (dataset (:column-names statement) d)])
(group-by :Account (:rows statement)))))

(defn calculate-balance-column [statement]
(reverse (reductions + (reverse (map :Amount (:rows statement))))))

(defn add-balance-column [statement]
(let [balance-column (calculate-balance-column statement)]
(-> statement
(assoc :column-names (conj (:column-names statement) :Balance))
(assoc :rows
(into [] (map
(fn [row bal] (assoc row :Balance bal))
(:rows statement) balance-column))))))

(defn read-statement [filename]
(read-dataset filename :header true))

(defn import-statements [data-path & [aliases]]
(let [r (split-by-account
(reduce merge-statements
(map read-statement
(get-csvs data-path))))
r (zipmap (keys r) (map add-balance-column (vals r)))]
(if aliases
(set/rename-keys r aliases)
r)))
30 changes: 1 addition & 29 deletions src/moneyz/core.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
(ns moneyz.core
(:use (incanter core charts io))
(:import (java.text SimpleDateFormat)))
(:use (incanter core charts io)))

#_(defn read-data
"Use incanter's read-dataset instead."
Expand All @@ -11,10 +10,6 @@
rows (rest data)]
(incanter.core.Dataset. (into [] columns) rows)))

(defn parse-date [date] (.parse (SimpleDateFormat. "dd/MM/yyyy") date))
(defn parse-dates [dates] (map parse-date dates))
(defn to-millis [dates] (map #(.getTime %) dates))
(def process-dates (comp to-millis parse-dates))

(def d1
(read-dataset
Expand All @@ -26,29 +21,6 @@
"/Users/sideris/devel/moneyz/data/2011-09-05-statement export.csv"
:header true))

(defn merge-statements
[d1 d2]
(dataset
(:column-names d1)
(sort-by :Date (distinct (concat (:rows d1) (:rows d2))))))

(defn group-by-account [statement]
(into {}
(map
(fn [[key d]] [key (dataset (:column-names statement) d)])
(group-by :Account (:rows statement)))))

(defn calculate-balance-column [statement]
(reverse (reductions + (reverse (map :Amount (:rows statement))))))

(defn add-balance-column [statement]
(let [balance-column (calculate-balance-column statement)]
(-> statement
(assoc :column-names (conj (:column-names statement) :Balance))
(assoc :rows
(into [] (map
(fn [row bal] (assoc row :Balance bal))
(:rows statement) balance-column))))))

(def d (group-by-account (merge-statements d1 d2)))

Expand Down

0 comments on commit f2f66ec

Please sign in to comment.