Thanks a lot for documenting how you’ve done this – I never got around to trying this out myself, but was tempted to try because you made it so easy. 
I wanted to take a slightly broader sample – pillow
is amazing, but not everyone does image manipulation; in contrast, requests
ends up being installed almost everywhere, and I also lifted the version restriction. After managing to set up pypinfo
myself (thanks @ofek for the thorough documentation!), I ran
pypinfo --all --days 28 --limit 10000 --json "requests" system distro-version > requests.json
Dropping Upping --limit
was important to actually get all relevant combinations. After some light munging
import json
import pandas as pd
with open("path/to/requests.json", "r") as f:
d = json.load(f)
df = pd.DataFrame(d["rows"])
mac = df.loc[df.system_name == "Darwin"]
# create column for consolidated version
mac = mac.assign(version=mac.distro_version.astype("str"))
# remove minor/patch versions from macos 1x.y.z, x!=0
mac.version = mac.version.str.replace(r"^(1[^0])(\.\d+)*", r"\1", regex=True)
# remove patch versions from macos 10.x.y
mac.version = mac.version.str.replace(r"^(10\.\d+)(\.\d+)*", r"\1", regex=True)
mac.groupby("version").sum("download_count")
# copy to google sheets; rest done there
The result is
version |
downloads |
percentage |
cumulative |
percentage |
users >= version |
10.4 |
3 |
0.0001% |
3 |
0.0001% |
100.0000% |
10.5 |
6 |
0.0001% |
9 |
0.0002% |
99.9999% |
10.6 |
19 |
0.0003% |
28 |
0.0005% |
99.9998% |
10.7 |
2 |
0.0000% |
30 |
0.0005% |
99.9995% |
10.8 |
2 |
0.0000% |
32 |
0.0006% |
99.9995% |
10.9 |
13 |
0.0002% |
45 |
0.0008% |
99.9994% |
10.10 |
26 |
0.0005% |
71 |
0.0012% |
99.9992% |
10.11 |
89 |
0.0016% |
160 |
0.0028% |
99.9988% |
10.12 |
179 |
0.0031% |
339 |
0.0060% |
99.9972% |
10.13 |
58,141 |
1.02% |
58,480 |
1.03% |
99.9940% |
10.14 |
31,749 |
0.56% |
90,229 |
1.59% |
98.97% |
10.15 |
26,091 |
0.46% |
116,320 |
2.04% |
98.41% |
10.16 |
305,672 |
5.37% |
421,992 |
7.42% |
97.96% |
11 |
20,617 |
0.36% |
442,609 |
7.78% |
92.58% |
12 |
141,727 |
2.49% |
584,336 |
10.27% |
92.22% |
13 |
873,061 |
15.34% |
1,457,397 |
25.61% |
89.73% |
14 |
3,260,588 |
57.30% |
4,717,985 |
82.92% |
74.39% |
15 |
798,499 |
14.03% |
5,516,484 |
96.95% |
17.08% |
None |
173,608 |
3.05% |
5,690,092 |
100.00% |
3.05% |
Note that I ignored the following versions, which I consider spurious
version |
downloads |
comment |
16 |
428 |
perhaps alpha version? |
17 |
2,227 |
max released macOS is v15 |
18 |
6,155 |
max released macOS is v15 |
19 |
71 |
max released macOS is v15 |
22 |
1 |
max released macOS is v15 |
20.04 |
237 |
Looks like Ubuntu |
22.04 |
484 |
Looks like Ubuntu |
24.04 |
32 |
Looks like Ubuntu |
2024.4 |
1 |
??? |
8.1 |
74 |
No macOS version below 10.0 exists |
8.6 |
1 |
No macOS version below 10.0 exists |
9.4 |
4 |
No macOS version below 10.0 exists |
9.5 |
1 |
No macOS version below 10.0 exists |
What’s remarkable is the huge cliff between 10.12 and 10.13, indicating indeed that anything below 10.13 is effectively dead/unusable…
Finally, comparing the 339 downloads on macOS <10.12 with all downloads (not just on macOS), i.e. with df.download_count.sum()
, which ends up being 562’304’532, we see that this affects roughly 1 in 1.65 million users.
Using this broader sample, the numbers look ever so slightly different:
- 99.994% of mac users are on 10.13+
- 98.97% are on 10.14+
- 97.96% are on 11.0+ (10.16 is a misreported version)