Professional fighting and the world of Clojure // Exploring fighters and their fights with the Clojure programming language.
NOTE: This was written in a Gorilla REPL and is known to not format/indent Clojure code correctly with certain fonts
Part 1 Viewable https://cdn.rawgit.com/runexec/ufc-clojure/master/html/part1.html?cdn=1
Part 1 Raw https://github.com/runexec/ufc-clojure
(ns ufc (:require [gorilla-plot.core :as plot] [gorilla-renderable.core :as r] [gorilla-repl.html :as h] [clojure.pprint :refer [pprint print-table]] [clojure.data.json :as json] [clojure.string :as s] [hiccup.core :refer [html]]));; Define the default dataset file(def stats-json-fp "complete-fighter-stats.json");; Define the default JSON key(def entry-point "Default JSON key for main data" "fighters");; Function gets the JSON value of entry-point(defn stats* "Loads JSON file and returns entry-point value." ([fp] (stats* fp entry-point)) ([fp entry-point] (-> fp slurp json/read-str (get entry-point {}))));; Create a version of stats* that caches the results(let [f (memoize stats*)] (defn stats "Loads JSON file and returns cached entry-point value." ([] (f stats-json-fp)) ([^:String fp] (f fp entry-point)) ([^:String fp ^:String entry-point] (f fp entry-point))));; Bruteforce numeric type enforcement(defn enforce-type "Integer first, Float second, original object on fail" [x] (try (Integer/parseInt x) (catch Exception ex (try (Float/parseFloat x) (catch Exception ex x)))));; The function used to modify fighter-without-fights fn(defn recursive-enforce-type "recursively calls enforce-type on a fighter map" [x] (reduce merge (for [[k v] x :let [f (if-not (map? v) enforce-type recursive-enforce-type)]] (hash-map k (f v)))));; Add recursive-enforce-type to this fn(defn fighter-without-fights "Returns a fighter without fights collection" [fighter-map] (recursive-enforce-type (dissoc fighter-map "Fights")))(defn ->numerics "Recursively filters for numeric values from a fighter map" [x] (let [data (recursive-enforce-type x)] (reduce merge (for [[k v] data] (if-not (map? v) (if-not (number? v) {} (hash-map k v)) (->numerics v))))))(defn without "Removes values from a fighter map" [x & ks] (apply dissoc x ks))(defn ->numeric-map "Returns numeric map without IDs" [x] (-> x fighter-without-fights ->numerics (without "MMAID" "WeightClassID" "FighterID")))(defn ->html [x] (h/html-view (html x)))#'ufc/->htmlx-gen-get-it fn makes a xform that calls enforce-type on a specified collection value. (def x-...) forms call x-gen-get-it to create a representative xformxxxxxxxxxx(defn x-gen-get-it [get-in-coll] (map #(-> % (get-in get-in-coll 0) enforce-type)))(def x-age (x-gen-get-it ["Age"]))(def x-previous (x-gen-get-it ["Previous"]))(def x-current (x-gen-get-it ["Current"]))(def x-striking-defense (x-gen-get-it ["StrikingDefense"]))(def x-no-contests (x-gen-get-it ["NoContests"]))(def x-takedown-defense (x-gen-get-it ["TakedownDefense"]))(def x-kd-average (x-gen-get-it ["KDAverage"]))(def x-takedown-average (x-gen-get-it ["TakedownAverage"]))(def x-weight (x-gen-get-it ["Weight"]))(def x-wins (x-gen-get-it ["Wins"]))(def x-draws (x-gen-get-it ["Draws"]))(def x-reach (x-gen-get-it ["Reach"]))(def x-height (x-gen-get-it ["Height"]))(def x-takedown-accuracy (x-gen-get-it ["TakedownAccuracy"]))(def x-slpm (x-gen-get-it ["SLpM"]))(def x-submissions-average (x-gen-get-it ["SubmissionsAverage"]))(def x-losses (x-gen-get-it ["Losses"]))(def x-average-fight-time-seconds (x-gen-get-it ["AverageFightTime_Seconds"]))(def x-striking-accuracy (x-gen-get-it ["StrikingAccuracy"]))(def x-sapm (x-gen-get-it ["SApM"]))(def x-numeric-map (map ->numeric-map));; Testing the above by using x-age and x-losses;; on a random fighter.(let [fighter (rand-nth (stats)) fm (->numeric-map fighter) finto #(first (into [] % [fm]))] (println (format "Someone is %s years old with %s losses" (finto x-age) (finto x-losses))))Someone is 29 years old with 3 losses
nilget-numeric-stats fn chains x-numeric-map with an arbitrary xform and returns a lazy transformer for all fighters.xxxxxxxxxx(defn get-numeric-stats [xform] (sequence (comp x-numeric-map xform) (stats)));; Testing with x-age(->> x-age get-numeric-stats rand-nth (format "%s is a random age") pprint)"34 is a random age"
nilScroll beyond the code if you just want the chart
frequent fn takes a mixed or single type collection.
Returns a collection of distinct values and a count of each occurrence
within the provided collection. Examplel => {:value "abc" :count 1}frequent-chart fn takes a collection and some optional charting options. Returns a chart displaying the results of frequent.xxxxxxxxxx;; Freq finding fn(defn frequent [coll] (let [uniq (-> coll distinct sort) freq (fn [x coll] (let [t (transient [])] (doseq [v coll] (if (= x v) (conj! t v))) (count t)))] (map #(hash-map :value % :count (freq % coll)) uniq)));; Similar to plot/histogram(defn frequent-chart [coll & opts] (let [freq (frequent coll) labels (map :value freq) plots (map :count freq) data [labels plots] call (if-not (seq opts) data (into data opts))] (apply plot/bar-chart call)));; Generate chart(let [ages (get-numeric-stats x-age) sorted-ages (sort ages) opts [:plot-size 600 :aspect-ratio 2.5] xys (map #(let [{x :value y :count} %] [x y]) (frequent ages))] ;; Chart Header [(->html [:div [:h1 "Age of fighters"] [:h2 "x = age"] [:h2 "y = number of fighters"]]) ;; Bar Chart (plot/compose (apply frequent-chart ages :color "red" opts) ;; Line Graph (apply plot/list-plot xys :color "brown" :joined true opts))])[Age of fighters
x = age
y = number of fighters
]Scroll beyond the code if you just want the chart
xxxxxxxxxx;; Gender identifiers(defn female? [fighter] (boolean (try (re-find (re-pattern ".*women.*") (-> fighter (get-in ["UFCWeightClass" "Description"] "default-is-male") s/lower-case)) (catch NullPointerException ex ;; Fighter has a nil description ;; assuming male false))))(defn male? [fighter] (not (female? fighter)));; Fighters grouped by gender(def females (filter female? (stats)))(def males (filter male? (stats)));; Chart found/diffs(let [cm (count males) cf (count females) more (if (= cm cf) ["There are an equal amount." 0] (condp = (max cm cf) cf ["More women than men" (- cf cm)] cm ["More men than women" (- cm cf)]))] ;; Chart Header [(->html [:h1 "Gender of Fighters"]) ;; Diff Chart (plot/bar-chart ["Female" "Male"] [(count females) (count males)] :color "purple") ;; Diff Footer (->html [:div [:h2 {:style "color:red;"} (first more)] [:h2 {:style "color:blue;"} (str "Diff Amount: " (second more))]])])[Gender of Fighters
More men than women
Diff Amount: 514
]Scroll beyond the code if you just want the chart
mf-header fn generates chart/graph header information with or without optional color arguments.mf-compare fn compares two fighters of the opposite gender and returns a single chart.xxxxxxxxxx;; Comparative colors(def male-color "deepskyblue")(def female-color "crimson")(def tied-color "green");; Legend Header fn(defn mf-header ([] (mf-header male-color female-color tied-color)) ([male-color female-color tied-color] ;; Header Local HTML Header fn (let [-html (fn [s color] [:h2 {:style (format "color:%s;" color)} s])] ;; Return HTML (->html [:div (-html "Female" female-color) (-html "Male" male-color) (-html "Tied (when applied)" tied-color) (-html "Zero/Blank" "black")]))));; Compare and Chart fn(defn mf-compare ([label male female] (mf-compare label male male-color female female-color tied-color)) ([label male male-color female female-color tied-color] ;; Local Charting fn (let [chart (fn [color value] (plot/bar-chart [label] [value] :opacity 0.60 :aspect-ratio 0.25 :plot-size 80 :color color)) ;; Default Value Display Order default [(chart female-color female) (chart male-color male)]] ;; Greatest Value Set Behind Lowest (if not tied) (if (= male female) (chart tied-color male) (apply plot/compose (if (< male female) default (reverse default)))))));; Age comparison between two random fighters;; one male;; one female(let [k "Age" rand-age #(-> % rand-nth ->numeric-map (get k))] ;; Chart Header [(->html [:h1 "Comparing Genders - An Example"]) (mf-header) (->html [:h2 "Some random fighters"]) ;; Comparison Chart (mf-compare k (rand-age males) (rand-age females))])[Comparing Genders - An Example
Female
Male
Tied (when applied)
Zero/Blank
Some random fighters
]Scroll beyond the code if you just want the chart
x
;; Not the same as get-numeric-stats(defn numeric-map-attr [data xform] (let [xform (map #(sequence (comp x-numeric-map xform) [%]))] (sequence xform data)))(let [age #(numeric-map-attr % x-age) females (age females) males (age males) xcapable (fn [f] #(->> % (mapcat identity) (apply f))) xmax (xcapable max) xmin (xcapable min)] [(->html [:h1 "Youngest & Oldest Fighters"]) (mf-header) (mf-compare "Oldest" (xmax males) (xmax females)) (mf-compare "Youngest" (xmin males) (xmin females))])[Youngest & Oldest Fighters
Female
Male
Tied (when applied)
Zero/Blank
]Scroll beyond the code if you just want the chart
xxxxxxxxxx;; Mean, Median, Mode, and Range(defn mean [& xs] (float (/ (reduce + xs) (count xs))))(defn median [& xs] (let [sz (count xs) sz (if-not (odd? sz) sz (inc sz)) half (dec (float (quot sz 2)))] (if (<= sz 2) (first xs) (-> xs sort (nth half)))))(defn mode [& xs] (let [t (transient {:count 0 :value 0})] (doseq [x xs :let [found (filter #{x} xs) c (count found)]] (if (< (:count t) c) (assoc! t :count c :value x))) (:value t)))(defn range* [& xs] (let [[l g] ((juxt first last) (sort xs))] (- g l)));; Generic Male & Female Comparison Chart(defn mf-compare-* [f label male female] (let [f (partial apply f)] (mf-compare label (f male) (f female))));; Chart fn for Mean, Median, Mode, and Range(defn mf-mean [male female] (mf-compare-* mean "Mean" male female))(defn mf-median [male female] (mf-compare-* median "Median" male female))(defn mf-mode [male female] (mf-compare-* mode "Mode" male female))(defn mf-range [male female] (mf-compare-* range* "Range" male female));; A combination of calculations(defn m3r [male female] (for [[t f] [["Mean" mf-mean] ["Median" mf-median] ["Mode" mf-mode] ["Range" mf-range]]] (f male female)));; An Example of M3R[(->html [:h1 "Fake Numbers - A M3R Example"]) (mf-header) (m3r [1 2 3] [4 5 6])][Fake Numbers - A M3R Example
Female
Male
Tied (when applied)
Zero/Blank
( )]Scroll beyond the code if you just want the chart
xxxxxxxxxx(defn numeric-map-attr-x* [data xform] (reduce into [] (numeric-map-attr data xform)))(defn females-numeric-x [xform] (numeric-map-attr-x* females xform))(defn fnx [xform] (females-numeric-x xform))(defn males-numeric-x [xform] (numeric-map-attr-x* males xform))(defn mnx [xform] (males-numeric-x xform))[(->html [:h1 "Fighter Age M3R"]) (mf-header) (m3r (mnx x-age) (fnx x-age))][Fighter Age M3R
Female
Male
Tied (when applied)
Zero/Blank
( )](map (fn [[s x]] (vector (->html [:h1 (format "Fighter %s M3R" s)]) (mf-header) (m3r (mnx x) (fnx x)))) [["Age" x-age] ["AverageFightTime_Seconds" x-average-fight-time-seconds] ["Current" x-current] ["Draws" x-draws] ["Height" x-height] ["KDAverage" x-kd-average] ["Losses" x-losses] ["NoContests" x-no-contests] ["Previous" x-previous] ["Reach" x-reach] ["SApM" x-sapm] ["SLpM" x-slpm] ["StrikingAccuracy" x-striking-accuracy] ["StrikingDefense" x-striking-defense] ["SubmissionsAverage" x-submissions-average] ["TakedownAccuracy" x-takedown-accuracy] ["TakedownDefense" x-takedown-defense] ["Weight" x-weight] ["Wins" x-wins]])([Fighter Age M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter AverageFightTime_Seconds M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Current M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Draws M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Height M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter KDAverage M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Losses M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter NoContests M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Previous M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Reach M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter SApM M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter SLpM M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter StrikingAccuracy M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter StrikingDefense M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter SubmissionsAverage M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter TakedownAccuracy M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter TakedownDefense M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Weight M3R
Female
Male
Tied (when applied)
Zero/Blank
( )] [Fighter Wins M3R
Female
Male
Tied (when applied)
Zero/Blank
( )])Scroll beyond the code if you just want the chart
xxxxxxxxxx(def x-weight-class (map #(get-in % ["UFCWeightClass" "Description"])))(let [call #(frequent (sequence x-weight-class %)) all (call (stats))] (for [{title :value v :count} (sort-by :count all) :when title] [(->html [:div [:h1 title] [:h2 "y = # of fighters"]]) (plot/bar-chart [title] [v] :plot-size 80 :aspect-ratio 0.30)]))([Women's Bantamweight
y = # of fighters
] [Flyweight
y = # of fighters
] [Heavyweight
y = # of fighters
] [Light Heavyweight
y = # of fighters
] [Bantamweight
y = # of fighters
] [Featherweight
y = # of fighters
] [Middleweight
y = # of fighters
] [Welterweight
y = # of fighters
] [Lightweight
y = # of fighters
])xxxxxxxxxx(def x-fighting-out-of (map #(get % "FightingOutOf")))(def x-fighting-out-of-city (comp x-fighting-out-of (map #(get % "City"))))(def x-fighting-out-of-state (comp x-fighting-out-of (map #(get % "State"))))(def x-fighting-out-of-country (comp x-fighting-out-of (map #(get % "Country"))))(->> females (sequence x-fighting-out-of-city) (take 3) (reduce #(str %1 ", " %2)) (str "First 3 Example: Fighting out of => ") pprint)"First 3 Example: Fighting out of => Las Vegas, Victoria, San Diego"
nilScroll beyond the code if you just want the chart
xxxxxxxxxx(defn chart-horizontal-percent-bars [xform limit data data-color bar-color] (as-> data x (sequence xform x) (frequent x) (sort-by :count x) (reverse x) (take limit x) (let [cs (map :count x) amount (reduce + cs) per (memoize (fn [count] (Float/parseFloat (format "%3.3f" (* 100.0 (float (/ count amount)))))))] (->html (into [:table {:style "tr td {border-style:none;padding:10px;}"}] (for [{:keys [value count]} x :let [p (per count)]] [:tr [:td (or value "No Record :(")] [:td p "%"] [:td.container (for [f (range 0.001 101)] [:span {:style (format "background:%s;" (if (<= f p) data-color bar-color))} " "])]])))))) (chart-horizontal-percent-bars x-fighting-out-of-city 20 females female-color "black")Las Vegas 12.5% Spokane 8.333% Glendale 8.333% Victoria 4.167% Venice 4.167% Utrecht 4.167% Temecula 4.167% Sioux Falls 4.167% San Diego 4.167% Salvador 4.167% Port Colborne 4.167% Pleasant Hill 4.167% Niteroi 4.167% Moscow 4.167% Montreal 4.167% Marituba 4.167% Kelowna 4.167% Gaffney 4.167% Colorado Springs 4.167% Cleveland 4.167%
xxxxxxxxxx(defn recursive-flatten-map [init-map m] (if-not (seq m) init-map (let [[k v] (first m)] (if-not (map? v) (recur (assoc init-map k v) (rest m)) (recur init-map (into (rest m) v))))))(defn flatten-fighter [fighter] (as-> fighter f (without f "Fights") (recursive-flatten-map {} f) (let [t (transient {:fighter f})] (doseq [x ["Abbreviation" "AverageFightTime" "Current" "DOB" "Description" "FighterID" "CareerStats" "MMAID" "Name" "NickName" "Previous" "WeightClassID" "Type"] :let [f (:fighter t)]] (assoc! t :fighter (without f x))) (:fighter t))))(-> females rand-nth flatten-fighter pprint){"Age" "30",
"Country" "USA",
"StrikingDefense" "57.73",
"NoContests" "0",
"TakedownDefense" "60.00",
"KDAverage" "0.0000",
"TakedownAverage" "2.7493",
"Weight" "135",
"Wins" "9",
"Draws" "0",
"Reach" "66.0",
"Height" "66",
"TakedownAccuracy" "50.00",
"SLpM" "3.6334",
"SubmissionsAverage" "0.3235",
"City" "Lafayette",
"State" "Louisiana",
"LastName" "Carmouche",
"Losses" "5",
"AverageFightTime_Seconds" "696",
"Stance" "Orthodox",
"FirstName" "Liz",
"StrikingAccuracy" "55.61",
"SApM" "2.9757"}
nilScroll beyond the code if you just want the chart
xxxxxxxxxx(extend-type clojure.lang.LazyTransformer r/Renderable (render [self] {:type :list-like :open "<span class='clj-lazy-seq'>(</span>" :close "<span class='clj-lazy-seq'>)</span>" :separator " " :items (map r/render self) :value (pr-str self)}))(defn chart-horizontal-fighters [limit fighters title-prefix data-color bar-color] (let [data (map flatten-fighter fighters) ks (-> data rand-nth keys) xform (fn [x] (map #(get % x)))] (sequence (comp (map #(vector (name %) (xform %))) (map (fn [[title xform]] (lazy-seq [(->html [:h1 (str title-prefix " " title)]) (chart-horizontal-percent-bars xform limit data data-color bar-color)])))) (sort ks))))(def female-horizontal-charts (chart-horizontal-fighters 5 females "Female Top 5" female-color "black"))(def male-horizontal-charts (chart-horizontal-fighters 5 males "Male Top 5" male-color "black"))(def horizontal-charts (chart-horizontal-fighters 5 (stats) "All Fighters Top 5" "orange" "black"))horizontal-charts((All Fighters Top 5 Age
30 21.509% 32 20.755% 31 20.377% 27 18.868% 28 18.491%
) (All Fighters Top 5 AverageFightTime_Seconds
900 79.13% No Record :( 9.565% 609 4.348% 741 3.478% 713 3.478%
) (All Fighters Top 5 City
Rio de Janeiro 39.024% Sao Paulo 19.512% San Diego 14.634% Salvador 14.634% Makhachkala 12.195%
) (All Fighters Top 5 Country
USA 62.222% Brazil 22.889% Canada 6.222% United Kingdom 4.667% Japan 4.0%
) (All Fighters Top 5 Draws
0 83.944% 1 13.264% 2 2.094% 7 0.349% 3 0.349%
) (All Fighters Top 5 FirstName
Chris 24.39% Mike 21.951% Matt 19.512% Josh 17.073% Anthony 17.073%
) (All Fighters Top 5 Height
69 21.549% 72 21.212% 71 19.529% 70 18.855% 68 18.855%
) (All Fighters Top 5 KDAverage
0.0000 91.971% No Record :( 4.015% 1.0000 2.19% 0.3333 1.095% 12.6761 0.73%
) (All Fighters Top 5 LastName
Silva 36.364% Johnson 22.727% Santos 18.182% Miller 13.636% de Lima 9.091%
) (All Fighters Top 5 Losses
2 23.662% 3 21.972% 1 21.972% 4 16.338% 5 16.056%
) (All Fighters Top 5 NoContests
0 84.495% 1 14.286% 2 1.22%
) (All Fighters Top 5 Reach
74.0 21.739% 70.0 20.435% 71.0 19.565% 73.0 19.13% 72.0 19.13%
) (All Fighters Top 5 SApM
No Record :( 42.308% 0.0000 19.231% 2.7333 15.385% 3.1333 11.538% 1.2667 11.538%
) (All Fighters Top 5 SLpM
No Record :( 37.931% 0.0000 20.69% 2.7333 13.793% 1.8000 13.793% 1.4000 13.793%
) (All Fighters Top 5 Stance
Orthodox 74.39% Southpaw 17.422% No Record :( 5.749% Switch 2.265% Open Stance 0.174%
) (All Fighters Top 5 State
No Record :( 50.691% California 25.346% England 8.756% Texas 7.834% New York 7.373%
) (All Fighters Top 5 StrikingAccuracy
No Record :( 48.148% 50.00 14.815% 0.00 14.815% 42.68 11.111% 40.00 11.111%
) (All Fighters Top 5 StrikingDefense
No Record :( 42.857% 66.67 17.857% 33.33 14.286% 100.00 14.286% 71.71 10.714%
) (All Fighters Top 5 SubmissionsAverage
0.0000 86.957% No Record :( 4.783% 0.5000 4.348% 1.0000 2.174% 2.0000 1.739%
) (All Fighters Top 5 TakedownAccuracy
No Record :( 31.863% 0.00 25.0% 50.00 15.196% 33.33 15.196% 100.00 12.745%
) (All Fighters Top 5 TakedownAverage
0.0000 70.0% 2.0000 9.333% 1.0000 8.667% No Record :( 7.333% 3.0000 4.667%
) (All Fighters Top 5 TakedownDefense
No Record :( 30.286% 100.00 24.571% 0.00 17.714% 66.67 14.286% 50.00 13.143%
) (All Fighters Top 5 Weight
155 25.734% 170 23.476% 135 20.316% 185 15.35% 145 15.124%
) (All Fighters Top 5 Wins
8 21.649% 12 21.134% 11 20.103% 9 19.588% 14 17.526%
))xxxxxxxxxxmale-horizontal-charts((Male Top 5 Age
30 21.912% 32 20.717% 31 19.92% 27 19.522% 28 17.928%
) (Male Top 5 AverageFightTime_Seconds
900 78.846% No Record :( 8.654% 609 4.808% 741 3.846% 713 3.846%
) (Male Top 5 City
Rio de Janeiro 40.0% Sao Paulo 20.0% San Diego 15.0% Salvador 12.5% Makhachkala 12.5%
) (Male Top 5 Country
USA 62.028% Brazil 23.349% Canada 5.425% United Kingdom 4.953% Japan 4.245%
) (Male Top 5 Draws
0 83.241% 1 13.812% 2 2.21% 7 0.368% 3 0.368%
) (Male Top 5 FirstName
Chris 24.39% Mike 21.951% Matt 19.512% Josh 17.073% Anthony 17.073%
) (Male Top 5 Height
72 21.575% 69 20.89% 71 19.521% 70 19.178% 68 18.836%
) (Male Top 5 KDAverage
0.0000 91.968% No Record :( 3.614% 1.0000 2.41% 0.3333 1.205% 12.6761 0.803%
) (Male Top 5 LastName
Silva 36.364% Johnson 22.727% Santos 18.182% Miller 13.636% de Lima 9.091%
) (Male Top 5 Losses
2 23.952% 3 21.557% 1 21.557% 4 16.766% 5 16.168%
) (Male Top 5 NoContests
0 84.375% 1 14.338% 2 1.287%
) (Male Top 5 Reach
74.0 21.681% 71.0 19.912% 70.0 19.912% 72.0 19.469% 73.0 19.027%
) (Male Top 5 SApM
No Record :( 37.5% 0.0000 20.833% 2.7333 16.667% 3.1333 12.5% 1.2667 12.5%
) (Male Top 5 SLpM
No Record :( 33.333% 0.0000 22.222% 2.7333 14.815% 1.8000 14.815% 1.4000 14.815%
) (Male Top 5 Stance
Orthodox 74.449% Southpaw 18.382% No Record :( 4.596% Switch 2.39% Open Stance 0.184%
) (Male Top 5 State
No Record :( 50.952% California 24.762% England 9.048% Texas 7.619% New York 7.619%
) (Male Top 5 StrikingAccuracy
No Record :( 44.0% 50.00 16.0% 0.00 16.0% 42.68 12.0% 40.00 12.0%
) (Male Top 5 StrikingDefense
No Record :( 38.462% 66.67 19.231% 33.33 15.385% 100.00 15.385% 71.71 11.538%
) (Male Top 5 SubmissionsAverage
0.0000 86.73% 0.5000 4.739% No Record :( 4.265% 1.0000 2.37% 2.0000 1.896%
) (Male Top 5 TakedownAccuracy
No Record :( 31.383% 0.00 24.468% 33.33 16.489% 50.00 14.894% 66.67 12.766%
) (Male Top 5 TakedownAverage
0.0000 70.588% 2.0000 9.559% 1.0000 8.824% No Record :( 6.618% 3.0000 4.412%
) (Male Top 5 TakedownDefense
No Record :( 29.814% 100.00 24.845% 0.00 16.149% 66.67 15.528% 33.33 13.665%
) (Male Top 5 Weight
155 27.603% 170 25.182% 185 16.465% 145 16.223% 135 14.528%
) (Male Top 5 Wins
12 21.622% 8 21.081% 11 20.541% 9 18.919% 14 17.838%
))xxxxxxxxxxfemale-horizontal-charts((Female Top 5 Age
31 25.0% 28 25.0% 32 18.75% 26 18.75% 34 12.5%
) (Female Top 5 AverageFightTime_Seconds
900 60.0% 299 13.333% No Record :( 13.333% 820 6.667% 810 6.667%
) (Female Top 5 City
Spokane 28.571% No Record :( 28.571% Winona 14.286% Wilmington 14.286% Whitesburg 14.286%
) (Female Top 5 Country
USA 58.621% Canada 17.241% Brazil 13.793% No Record :( 6.897% Russia 3.448%
) (Female Top 5 Draws
0 96.667% 1 3.333%
) (Female Top 5 FirstName
Jessica 33.333% Sarah 22.222% Alexis 22.222% Valerie 11.111% Shayna 11.111%
) (Female Top 5 Height
66 37.5% 67 29.167% 65 16.667% 69 12.5% 73 4.167%
) (Female Top 5 KDAverage
0.0000 82.143% No Record :( 7.143% 0.9269 3.571% 0.8621 3.571% 0.8577 3.571%
) (Female Top 5 LastName
de Randamie 20.0% Zingano 20.0% Tate 20.0% Smith 20.0% Rousey 20.0%
) (Female Top 5 Losses
3 25.0% 1 25.0% 0 20.833% 2 16.667% 5 12.5%
) (Female Top 5 NoContests
0 86.667% 1 13.333%
) (Female Top 5 Reach
66.0 43.75% No Record :( 18.75% 70.0 12.5% 68.5 12.5% 68.0 12.5%
) (Female Top 5 SApM
No Record :( 33.333% 8.2000 16.667% 6.6221 16.667% 6.2949 16.667% 5.4162 16.667%
) (Female Top 5 SLpM
No Record :( 33.333% 7.0993 16.667% 6.9333 16.667% 6.9195 16.667% 6.6221 16.667%
) (Female Top 5 Stance
Orthodox 73.333% No Record :( 26.667%
) (Female Top 5 State
Washington 23.077% California 23.077% No Record :( 23.077% Ontario 15.385% British Columbia 15.385%
) (Female Top 5 StrikingAccuracy
No Record :( 33.333% 83.33 16.667% 80.00 16.667% 63.97 16.667% 57.83 16.667%
) (Female Top 5 StrikingDefense
No Record :( 33.333% 75.19 16.667% 69.53 16.667% 69.32 16.667% 66.47 16.667%
) (Female Top 5 SubmissionsAverage
0.0000 77.273% No Record :( 9.091% 5.7284 4.545% 2.0513 4.545% 1.5000 4.545%
) (Female Top 5 TakedownAccuracy
No Record :( 28.571% 0.00 23.81% 100.00 19.048% 50.00 14.286% 40.00 14.286%
) (Female Top 5 TakedownAverage
0.0000 64.286% No Record :( 14.286% 8.2744 7.143% 6.3394 7.143% 6.0201 7.143%
) (Female Top 5 TakedownDefense
0.00 26.316% No Record :( 26.316% 60.00 15.789% 50.00 15.789% 100.00 15.789%
) (Female Top 5 Weight
135 100.0%
) (Female Top 5 Wins
4 26.667% 9 20.0% 8 20.0% 10 20.0% 7 13.333%
))xxxxxxxxxx