some structures for managing a historic db of Running with Rifles official vanilla invasion stats
with a wrapper command-line interface for interaction
Not available on PyPI (yet... 👀) but the project follows a pythonic app structure.
- Have a recent Python 3 installation, definitely over 3.6 because f-strings are used... a lot. I don't think we have walrus(es: operator) here yet afa (as far as) i can remember.
- Git clone this repo or download it from this GitHub page.
- Make a virtual environment to contain this {project/app}'s dependencies and have it
activated
. - Install (pip ❤️) the requirements from
requirements.txt
into the virtual environment. - Acquire historic data:
- Download the CSV files from rwrtrack-data and put them in a directory
csv_historical/
relative torwrtrack.py
.- due to legacy design choices 😅, the CSV files are stored in a single directory and now GitHub will only show a limited number in the repo browser of rwrtrack-data xd.
- rwrtrack-data is only updated periodically!
If you want to pull data from the official stats endpoints at your leisure you should look intorwrtrack.py get <pages>
and the code inrwrtrack.get
that underpins the command :)
- Migrate the CSV files from
csv_historical
into arwrtrack_history.db
with:
rwrtrack.py _db_migrate_csv
- Migration was made 40x faster in a commit so it should be fairly fast.
- Download the CSV files from rwrtrack-data and put them in a directory
- Verify you have some data in your
rwrtrack_history.db
(it should have been created at the start of first migration if it didn't exist already) with:
rwrtrack.py _dbinfo
- In your terminal/console/powershell/hyperterm(!) you should see something like:
First date: 20170929 Latest date: 20210629 Accounts recorded: 16413 Days recorded: 1315 Number of records: 10350765
- In your terminal/console/powershell/hyperterm(!) you should see something like:
- View rwrtrack command-line help with
rwrtrack.py -h
-h
- print the docopt helpget <pages>
- acquire pages: int of data from the official rwr stats view_players endpoint and save to a CSV format_db_migrate_csv
- migrate CSV files into the db_dbinfo
- print information about the dbanalyse <name> [<dates>]
- perform an analysis for required name (on optional dates - see parameters)rank <metric> [<dates>] [--limit=<int>] [--record-filters=<str>] [--diff-filters=<str>]
- rank records by metric (on optional dates), limtiting by--limit=<int>
and filtering the data with--{record,diff}-filters=<str>
average [<dates>] [--record-filters=<str>] [--diff-filters=<str>]
sum [<dates>] [--record-filters=<str>] [--diff-filters=<str>]
TODO!
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py -h
rwrtrack - a Running with Rifles statistics analysis tool.
Usage:
rwrtrack.py [-q|-v] get [<pages>]
rwrtrack.py [-q|-v] analyse <name> [<dates>]
rwrtrack.py [-q|-v] rank <metric> [<dates>] [--limit=<int>] [--record-filters=<str>] [--diff-filters=<str>]
rwrtrack.py [-q|-v] average [<dates>] [--record-filters=<str>] [--diff-filters=<str>]
rwrtrack.py [-q|-v] sum [<dates>] [--record-filters=<str>] [--diff-filters=<str>]
rwrtrack.py [-q|-v] _dbinfo
rwrtrack.py [-q|-v] _db_migrate_csv
rwrtrack.py [-q|-v] _interact
Options:
-q Quiet mode, reduces logging output to errors and above
-v Verbose output, with full stdout logging
(venv) PS C:\Users\david\projects\rwr\rwrtrack> rwrtrack.py get 1
INFO: Retrieving 1 page(s) of stats from server...
INFO: Writing stats to C:\Users\david\projects\rwr\rwrtrack\csv_historical\2021-08-15.csv
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py _db_migrate_csv
INFO: Starting database migration...
INFO: Setting <FileHandler C:\Users\david\projects\rwr\rwrtrack\rwrtrackpy.log (DEBUG)> to INFO
INFO: Finding CSV files in 'C:\Users\david\projects\rwr\rwrtrack\csv_historical'...
INFO: Inspecting database at 'sqlite:///rwrtrack_history.db'...
INFO: Blank database found, starting new migration...
INFO: Migrating '2017-09-30.csv' -> '2021-08-14.csv'...
INFO: Processing '2017-09-30.csv' as '20170929'...
INFO: Discovered 1000/0 new/updated accounts across 1000 records in 0.01s
INFO: Entered mappings into database in 0.05s
INFO: Migrated '2017-09-30.csv' in 0.06s
...
INFO: Processing '2021-08-14.csv' as '20210813'...
INFO: Discovered 12/9986 new/updated accounts across 9998 records in 0.06s
INFO: Entered mappings into database in 0.31s
INFO: Migrated '2021-08-14.csv' in 0.37s
INFO: Setting <FileHandler C:\Users\david\projects\rwr\rwrtrack\rwrtrackpy.log (INFO)> to DEBUG
INFO: Migration took 415.01 seconds
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py _dbinfo
First date: 20170929 Latest date: 20210813
Accounts recorded: 17025
Days recorded: 1361
Number of records: 10810673
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py analyse "MR. BANG"
INFO: Performing individual analysis for 'MR. BANG'...
'MR. BANG' on 20210813:
┌────────────────────┬────────────┬──────────┐
│ Statistic│ Value│ per hour│
╞════════════════════╪════════════╪══════════╡
│Time played in hours│ 2,003.28│ 1│
│ XP│ 8,752,631│ 4,369.14│
│ Kills│ 640,232│ 319.59│
│ Deaths│ 3,432│ 1.71│
│ Targets destroyed│ 3,822│ 1.91│
│ Vehicles destroyed│ 3,725│ 1.86│
│ Soldiers healed│ 2,909│ 1.45│
│ Team kills│ 5,204│ 2.60│
│Distance moved in km│ 2,118.90│ 1.06│
│ Shots fired│ 1,988,676│ 992.71│
│ Throwables thrown│ 3,726│ 1.86│
├────────────────────┼────────────┼──────────┤
│ Score│ 636,800│ -│
│ K/D│ 186.55│ -│
│ Kills per km│ 302.15│ -│
│ XP per shot fired│ 4.40│ -│
│ XP per kill│ 13.67│ -│
│ Shots per kill│ 3.11│ -│
│ Team kills per kill│ 0.00813│ -│
│ Runs around equator│ 0.05287│ -│
╘════════════════════╧════════════╧══════════╛
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py analyse "MR. BANG" 20170929
INFO: Performing individual analysis for 'MR. BANG'...
'MR. BANG' on 20170929:
┌────────────────────┬────────────┬──────────┐
│ Statistic│ Value│ per hour│
╞════════════════════╪════════════╪══════════╡
│Time played in hours│ 593.10│ 1│
│ XP│ 1,806,579│ 3,045.99│
│ Kills│ 154,522│ 260.53│
│ Deaths│ 2,077│ 3.50│
│ Targets destroyed│ 1,540│ 2.60│
│ Vehicles destroyed│ 1,193│ 2.01│
│ Soldiers healed│ 750│ 1.26│
│ Team kills│ 2,016│ 3.40│
│Distance moved in km│ 1,438.80│ 2.43│
│ Shots fired│ 374,977│ 632.23│
│ Throwables thrown│ 1,479│ 2.49│
├────────────────────┼────────────┼──────────┤
│ Score│ 152,445│ -│
│ K/D│ 74.40│ -│
│ Kills per km│ 107.40│ -│
│ XP per shot fired│ 4.82│ -│
│ XP per kill│ 11.69│ -│
│ Shots per kill│ 2.43│ -│
│ Team kills per kill│ 0.01305│ -│
│ Runs around equator│ 0.03590│ -│
╘════════════════════╧════════════╧══════════╛
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py analyse "MR. BANG" 20170929-20210813
INFO: Performing individual analysis for 'MR. BANG'...
'MR. BANG' from 20170929 to 20210813:
┌────────────────────┬────────────┬──────────┐
│ Statistic│ Value│ per hour│
╞════════════════════╪════════════╪══════════╡
│Time played in hours│ 1,410.18│ 1│
│ XP│ 6,946,052│ 4,925.64│
│ Kills│ 485,710│ 344.43│
│ Deaths│ 1,355│ 0.96│
│ Targets destroyed│ 2,282│ 1.62│
│ Vehicles destroyed│ 2,532│ 1.80│
│ Soldiers healed│ 2,159│ 1.53│
│ Team kills│ 3,188│ 2.26│
│Distance moved in km│ 680.10│ 0.48│
│ Shots fired│ 1,613,699│ 1,144.32│
│ Throwables thrown│ 2,247│ 1.59│
├────────────────────┼────────────┼──────────┤
│ Score│ 484,355│ -│
│ K/D│ 358.46│ -│
│ Kills per km│ 714.17│ -│
│ XP per shot fired│ 4.30│ -│
│ XP per kill│ 14.30│ -│
│ Shots per kill│ 3.32│ -│
│ Team kills per kill│ 0.00656│ -│
│ Runs around equator│ 0.01697│ -│
╘════════════════════╧════════════╧══════════╛
- Specifying no date is like asking for the latest information
- Specifying no limit gives a default limit of 5
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py rank soldiers_healed --limit=10
#1 OWLCAT 8,733
#2 RARE PEPE 8,459
#3 DOGTATO 7,638
#4 JF 2.0 7,527
#5 BUSTNCAPS 6,389
#6 YANKE 5,821
#7 BIG G 5,346
#8 HARLAND 5,317
#9 ::PANDA:: 5,246
#10 AMBULANCE 5,197
- A player must be present in the records data on the first (earlier) date
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py rank xp_per_hour 20210525-20210813 --limit=10
Ranking by 'xp_per_hour' between 20210525 and 20210813:
#1 LINGA 46,947.33
#2 SPIKE SPIEGEL 38,645.88
#3 PENG 19,276.99
#4 JOLLY JELLY 19,188.00
#5 TALKINGTOTHEMOON 17,520.26
#6 FOX IN BOX 17,260.55
#7 DECEASED VETERAN 15,472.50
#8 KF EZOREDFOX 15,453.03
#9 ALZERON 12,736.40
#10 GUOXIAOXU 12,261.56
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py average --record-filters="xp>=1000000"
{'_count': 300, 'xp': 2316329.756666667, 'time_played': 60352.74333333333, 'time_played_hours': 1005.8790555555555, 'kills': 210569.06333333332, 'deaths': 7858.76, 'score': 202710.30333333332, 'kill_streak': 1242.63, 'targets_destroyed': 2959.83, 'vehicles_destroyed': 2524.8633333333332, 'soldiers_healed': 1391.5466666666666, 'team_kills': 3217.0066666666667, 'distance_moved': 2055230.6633333333, 'distance_moved_km': 2055.2306633333333, 'shots_fired': 2456487.723333333, 'throwables_thrown': 13995.22, 'runs_around_the_equator': 0.051284586188281175}
_count
is the number of records that matched the specified filters--record-filters
are applied before the differencing of the records occurs and indicate conditions that the record must match at the earlier date (if a date range is specified)
- Note that the earlier date record will be filtered for matches with record filter conditions
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py average 20201231-20210813 --record-filters="xp>=1000000"
{'_count': 274, 'xp': 475192.2700729927, 'time_played': 8117.069343065694, 'time_played_hours': 135.2844890510949, 'kills': 35430.32116788321, 'deaths': 774.3467153284671, 'score': 34655.97445255474, 'kill_streak': 162.4963503649635, 'targets_destroyed': 302.17518248175185, 'vehicles_destroyed': 375.3321167883212, 'soldiers_healed': 215.3905109489051, 'team_kills': 315.42335766423355, 'distance_moved': 57295.255474452555, 'distance_moved_km': 57.29525547445255, 'shots_fired': 343536.1715328467, 'throwables_thrown': 1681.463503649635, 'runs_around_the_equator': 0.0014297000915670867}
- Note that the _count here is lower than^ because the number of players GOTA+|xp>=1m was 274 on 2020-12-31
in the time between the two dates
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py average 20201231-20210813 --record-filters="xp>=1000000" --diff-filters="time_played>=60"
{'_count': 208, 'xp': 625955.7788461539, 'time_played': 10691.009615384615, 'time_played_hours': 178.1834935897436, 'kills': 46670.8125, 'deaths': 1019.8798076923077, 'score': 45650.932692307695, 'kill_streak': 214.05769230769232, 'targets_destroyed': 398.05288461538464, 'vehicles_destroyed': 494.3701923076923, 'soldiers_healed': 283.72596153846155, 'team_kills': 415.42788461538464, 'distance_moved': 75452.88461538461, 'distance_moved_km': 75.4528846153846, 'shots_fired': 452511.36057692306, 'throwables_thrown': 2214.7451923076924, 'runs_around_the_equator': 0.0018827910819198058}
- Note that the \count is lower than^ because the number of players who were GOTA+ on 2020-12-31 and have played 1hr+ in the period between 2020-12-31 and 2021-08-13
- Dateless so total progress on the latest date in db
(venv) PS C:\Users\david\projects\rwr\rwrtrack> .\rwrtrack.py sum
{'_count': 9998, 'xp': 1561394305, 'time_played': 72782396, 'time_played_hours': 1213039.9333333333, 'kills': 190026240, 'deaths': 20029669, 'score': 169996571, 'kill_streak': 2358400, 'targets_destroyed': 2006407, 'vehicles_destroyed': 2142945, 'soldiers_healed': 1344047, 'team_kills': 3370223, 'distance_moved': 4928652938, 'distance_moved_km': 4928652.938, 'shots_fired': 2760996801, 'throwables_thrown': 15551541, 'runs_around_the_equator': 122.98567304413122}
- The _count is 9998 here for the tracked 10k because of a bug that causes a certain username to be duplicated on the official listings.
- This summation was for 2021-08-13, some interesting points:
- 1,561,394,305 is 1.5 billion XP and 1,213,039.9 is 1.2 million hours (or 138.47 calendar years) - you read that right! 😅
- 190 MILLION KILLS AND 20 MILLION DEATHS - a rough average of 190/20 or 9.5 for K/D
- A combined score of 169,996,571!
killstreak
is the total of the maximums that each player has achieved (and thus pretty useless?)- 2,142,945 vehicles destroyed is a lot of scrap xd
- 2,760,996,801 - 2.76 billion shots rounds of ammunition fired... DUCK FOR COVER!
- Yes, runs around the equator is for Earth :D