# smogon stats
turn <https://smogon.com/stats/> chaos json files into [SQLite](https://sqlite.org) databases

you can find pre-generated dbs at <https://pyrope.net/mon/stats>, and you can [fiddle](https://sqlite.org/fiddle) with them in your browser or on your own computer.

## examples (2025-02)
```sh
smogon-stats gen9ou-1500.json -o gen9ou-1500.sqlite
sqlite3 gen9ou-1500.sqlite -markdown "SELECT name, format('%.2f%%', usage * 100) as usage FROM mon WHERE mon.usage > 0.04 ORDER BY mon.usage DESC LIMIT 10"
```
output:

|        name        | usage  |
|--------------------|--------|
| Great Tusk         | 33.05% |
| Kingambit          | 23.75% |
| Gholdengo          | 21.98% |
| Iron Valiant       | 18.95% |
| Dragapult          | 16.96% |
| Dragonite          | 15.53% |
| Raging Bolt        | 14.82% |
| Ogerpon-Wellspring | 14.77% |
| Iron Moth          | 14.46% |
| Slowking-Galar     | 14.26% |

you can also use SQLite's [`.expert`](https://sqlite.org/cli.html#index_recommendations_sqlite_expert_) to find indexes that can dramatically speed up queries, but the numbers are small enough that it likely won't matter except for exploratory stuff—even `100^3` is only `1_000_000`.

you can use SQLite's [`.excel`](https://sqlite.org/cli.html#_export_to_excel_) to open the result of the next query in a spreadsheet application, so here are some fun graphs with the commands that generated the data.
the smogon data is from `wget https://smogon.com/stats/2025-02/chaos/gen9ou-{0,1500,1695}.json`:

(apologies for the surely terrible SQL—the point of this is that you can do your own queries :P)

### usage by elo
```sql
attach 'gen9ou-0.sqlite' as ou0; attach 'gen9ou-1500.sqlite' as ou1500; attach 'gen9ou-1695.sqlite' as ou1695;

SELECT ou0.mon.name, ou0.mon.usage as usage0, ou1500.mon.usage as usage1500, ou1695.mon.usage as usage1695
FROM ou0.mon
JOIN ou1500.mon on ou0.mon.name = ou1500.mon.name
JOIN ou1695.mon on ou0.mon.name = ou1695.mon.name
WHERE ou0.mon.usage > 0.03
ORDER BY ou0.mon.usage DESC;
```
![bar chart of usage for mons at 0+, 1500+, and 1695+ elo](https://pyrope.net/mon/smogon-stats/example-screenshots/usage-by-elo.png)

### top 50 moves (1695)
```sql
SELECT m.name, mon.usage * m.usage AS usage_adj
FROM move m
JOIN mon ON mon.name = m.mon
GROUP BY usage_adj
ORDER BY usage_adj
DESC limit 50;
```

![bar chart of usage of 50 moves, descending](https://pyrope.net/mon/smogon-stats/example-screenshots/top-50-moves.png)

### "win" and "fail" heuristics (1695)
see `examples/win-fail.sql` for source and explanation (i could see this heuristic being improved in the future!).
![win points to the right, fail points to the left, and margin varies. great tusk is at the top and manaphy is at the bottom. win decreases as you go down, but fail is pretty steady. most mons have negative margin.](https://pyrope.net/mon/smogon-stats/example-screenshots/win-fail-heuristic.png)