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/->html
x-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
nil
get-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"
nil
Scroll 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"
nil
Scroll 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"}
nil
Scroll 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%
))
xxxxxxxxxx
male-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%
))
xxxxxxxxxx
female-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