Skip to content

Commit aaeb99e

Browse files
committed
WIP timeseries data
1 parent 43d4df0 commit aaeb99e

File tree

6 files changed

+3688
-3575
lines changed

6 files changed

+3688
-3575
lines changed

cljs-om/externs/misc.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
var moment = {};
1+
var moment = function (a) {};
22
moment.fromNow = function (bool) {};
3+
moment.unix = function () {};
34

45
var BirdWatch = {};
56
BirdWatch.WordCloud = function (w, h, maxEntries, addSearch, elem) {};

cljs-om/src/cljs_om/core.cljs

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
(def word-cloud (.WordCloud js/BirdWatch cloud-w (* cloud-w 0.7) 250 (fn [e]) "#wordCloud"))
2828

2929
;;; refresh BarChart and time series chart occasionally (could potentially be more elegant)
30-
(js/setInterval #(ts/update ts/graph-with-legend) 5000)
30+
(js/setInterval #(ts/update ts/graph-with-legend app-state) 5000)
3131
;(js/setInterval #(.updateBarchart js/BirdWatch (clj->js (take 25 (:words-sorted-by-count @app-state)))) 1000)
3232
(js/setInterval #(.updateBarchart js/BirdWatch (clj->js (wc/get-words app-state 25))) 1000)
3333

@@ -36,7 +36,7 @@
3636
(def prev-tweets-chan (chan 10000))
3737

3838
(go-loop []
39-
(let [[t chan] (alts! [tweets-chan prev-tweets-chan] {:priority true})]
39+
(let [[t chan] (alts! [tweets-chan prev-tweets-chan] :priority)]
4040
(tweets/add-tweet t app-state word-cloud)
4141
(recur)))
4242

cljs-om/src/cljs_om/timeseries.cljs

+60-21
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,68 @@
3131
#_(.render ts-chart)
3232
#_(def hover-detail (Rickshaw.Graph.HoverDetail. (clj->js {:graph ts-chart})))
3333

34-
(defn random-data [] (let [series-data (array (array))
35-
random (Rickshaw.Fixtures.RandomData. 150)]
36-
(dotimes [i 100] (.addData random series-data))
37-
series-data))
34+
(defn random-data []
35+
(let [series-data (array (array))
36+
random (Rickshaw.Fixtures.RandomData. 150)]
37+
(dotimes [i 100] (.addData random series-data))
38+
series-data))
3839

3940
;; https://gist.github.com/msgodf/8495781
4041
(def graph-with-legend
41-
(let [series-data (array (array))
42-
random (Rickshaw.Fixtures.RandomData. 150)]
43-
(dotimes [i 10] (.addData random series-data))
44-
(doto
45-
(Rickshaw.Graph. (clj->js {:element ts-elem
46-
:renderer "bar"
47-
:width ts-w
48-
:height 100
49-
:series [{:color "steelblue"
50-
:data (nth series-data 0)
51-
:name "Tweets"}]}))
52-
(.render))))
53-
54-
(defn update [chart]
55-
(aset graph-with-legend "series" "0" "data" (nth (random-data) 0))
56-
(.update chart))
42+
(doto
43+
(Rickshaw.Graph. (clj->js {:element ts-elem
44+
:renderer "bar"
45+
:width ts-w
46+
:height 100
47+
:series [{:color "steelblue"
48+
:data (nth (random-data) 0)
49+
:name "Tweets"}]}))
50+
(.render)))
5751

58-
;(js/setInterval #(update graph-with-legend) 5000)
52+
(defn floor [x] (Math/floor x))
5953

54+
(defn date-round [s]
55+
"return function that rounds the provided seconds since epoch down to the nearest time interval s
56+
e.g. (date-round 60) creates a function that takes seconds t and rounds them to the nearest minute"
57+
(fn [t] (* s (floor (/ t s)))))
58+
59+
(def m 60)
60+
(def hr (* 60 m))
61+
(def day (* 24 hr))
62+
63+
(defn grouper [newest oldest]
64+
(cond
65+
(> (- newest oldest) (* 20 day)) (date-round (* 24 60 60)) ;round by nearest day
66+
(> (- newest oldest) (* 5 day)) (date-round (* 6 60 60)) ;round by nearest quarter day
67+
(> (- newest oldest) (* 10 hr)) (date-round (* 60 60)) ;round by nearest hour
68+
(> (- newest oldest) (* 2 hr)) (date-round (* 15 60)) ;round by nearest quarter hour
69+
:else (date-round 60))) ;round by nearest minute
70+
71+
(defn ts-data [app]
72+
(let [state @app
73+
by-id (util/tweets-by-order :tweets-map :by-id)
74+
tweets-by-id (by-id state 10000)
75+
oldest (js/moment. (:created_at (last tweets-by-id)))
76+
newest (js/moment. (:created_at (first tweets-by-id)))
77+
rounder (grouper (.unix newest) (.unix oldest))
78+
]
79+
(print "oldest" (.toLocaleString oldest))
80+
(print "oldest unix" (.unix oldest))
81+
(print "oldest min rounded unix" (round-min (.unix oldest)))
82+
(print "oldest min rounded parsed" (.toLocaleString (.unix js/moment (round-min (.unix oldest)))))
83+
(print "oldest hr rounded unix" (round-hr (.unix oldest)))
84+
(print "oldest hr rounded parsed" (.toLocaleString (.unix js/moment (round-hr (.unix oldest)))))
85+
(print "oldest day rounded unix" (round-day (.unix oldest)))
86+
(print "oldest day rounded parsed" (.toLocaleString (.unix js/moment (round-day (.unix oldest)))))
87+
(print "oldest rounded unix" (rounder (.unix oldest)))
88+
(print "oldest rounded parsed" (.toLocaleString (.unix js/moment (rounder (.unix oldest)))))
89+
(print "---")
90+
(print "newest" (.toLocaleString newest))
91+
(print "newest" (.unix newest))
92+
(print "---")
93+
))
94+
95+
(defn update [chart app]
96+
(ts-data app)
97+
(aset graph-with-legend "series" "0" "data" (nth (random-data) 0))
98+
(.update chart))

cljs-om/src/cljs_om/ui.cljs

+5-10
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,11 @@
1212
(render [this]
1313
(dom/span nil (:count app)))))
1414

15-
(defn tweets-by-order [tweets-map order]
16-
"find top n tweets by specified order"
17-
(fn [app n]
18-
(vec (map (fn [m] ((keyword (first m))(tweets-map app))) (take n (order app))))))
19-
20-
(def find-tweets {:by-id (tweets-by-order :tweets-map :by-id)
21-
:by-followers (tweets-by-order :tweets-map :by-followers)
22-
:by-retweets (tweets-by-order :retweets :by-retweets)
23-
:by-favorites (tweets-by-order :retweets :by-favorites)
24-
:by-rt-since-startup (tweets-by-order :retweets :by-rt-since-startup)})
15+
(def find-tweets {:by-id (util/tweets-by-order :tweets-map :by-id)
16+
:by-followers (util/tweets-by-order :tweets-map :by-followers)
17+
:by-retweets (util/tweets-by-order :retweets :by-retweets)
18+
:by-favorites (util/tweets-by-order :retweets :by-favorites)
19+
:by-rt-since-startup (util/tweets-by-order :retweets :by-rt-since-startup)})
2520

2621
(defn sort-button-js [app key]
2722
#js {:onClick (fn [e] (om/update! app [:sorted] key))

cljs-om/src/cljs_om/util.cljs

+5
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,8 @@
7777
:by-rt-since-startup (priority-map-by >)
7878
:by-id (priority-map-by >)
7979
:words-sorted-by-count (priority-map-by >)})
80+
81+
(defn tweets-by-order [tweets-map order]
82+
"find top n tweets by specified order"
83+
(fn [app n]
84+
(vec (map (fn [m] ((keyword (first m))(tweets-map app))) (take n (order app))))))

0 commit comments

Comments
 (0)