From 72d823f561dd55eb56f8c6e79636c1ffbf92be92 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Sun, 3 Oct 2021 15:39:45 +0200 Subject: [PATCH] Initial. --- README.md | 24 +++++++++ python-versions.png | Bin 0 -> 40164 bytes python-versions.py | 117 +++++++++++++++++++++++++++++++++++++++++ python-versions.sqlite | Bin 0 -> 12288 bytes 4 files changed, 141 insertions(+) create mode 100644 README.md create mode 100644 python-versions.png create mode 100644 python-versions.py create mode 100644 python-versions.sqlite diff --git a/README.md b/README.md new file mode 100644 index 0000000..5dda127 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# Analysis of version adoptions on Pypi + +We get PyPI download statistics via Google's BigQuery using the +[pypinfo](https://github.com/ofek/pypinfo/) tool. + + +## Usage + +First you need to get an access to PyPI's BigQuery, by following +[pypinfo](https://github.com/ofek/pypinfo/) procedure. + +Then there's two main invocations, first fetch the data using: + + python python-versions.py --fetch + +Then plot it using: + + python python-versions.py + + +## Data + + +![](python-versions.png) diff --git a/python-versions.png b/python-versions.png new file mode 100644 index 0000000000000000000000000000000000000000..1e98196f8a19aca43d27c083f7f15a82ed6cd68e GIT binary patch literal 40164 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 bool: + return ( + self.connection.execute( + "SELECT COUNT(1) FROM python_version WHERE start_date = ? AND end_date = ?", + (start_date, end_date), + ).fetchone()[0] + > 0 + ) + + def fetch_python_version(self): + return self.connection.execute( + """ + SELECT start_date as "start_date [date]", + end_date as "end_date [date]", + python_version, + download_count + FROM python_version +ORDER BY start_date""" + ).fetchall() + + +def query_python_versions(start_date: str, end_date: str) -> list[tuple[str, int]]: + built_query = build_query( + "", + [PythonVersion], + start_date=start_date, + end_date=end_date, + ) + + with create_client(get_credentials()) as client: + query_job = client.query(built_query, job_config=create_config()) + query_rows = query_job.result(timeout=120) + return [tuple(row) for row in query_rows] + + +def fetch_main(): + db = DB() + today = date.today() + for year_in_the_past in 1, 0: + year = today.year - year_in_the_past + for month in range(1, 13): + start_date = date(year, month, 1) + end_date = start_date.replace( + day=calendar.monthrange(year, month)[1] + ) + timedelta(days=1) + if end_date > today: + continue + if db.have_data_for_dates(start_date, end_date): + continue + print(f"Querying BigTable in [{start_date}; {end_date}]") + results = query_python_versions(str(start_date), str(end_date)) + for python_version, download_count in results: + db.store_python_version( + start_date, end_date, python_version, download_count + ) + + +def plot_main(): + db = DB() + by_version = defaultdict(dict) + for row in db.fetch_python_version(): + by_version[row["python_version"]][row["start_date"]] = row["download_count"] + for version, data_points in by_version.items(): + plt.plot(data_points.keys(), data_points.values(), label=version) + plt.xlabel("month") + plt.ylabel("pypi downloads") + plt.legend() + plt.savefig("python-versions.png") + + +if __name__ == "__main__": + if "--fetch" in sys.argv: + fetch_main() + plot_main() diff --git a/python-versions.sqlite b/python-versions.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..746fea3b3f0d32a3e777c7fe414e03222fe5fab5 GIT binary patch literal 12288 zcmeI2du&rx9LMi%*W1T!Z#UQ&b5PE2NZA;xU2mT<1{-!`ZtJ?y0R!T!TZv1c9jud) z5E13^2OkFAVH*T&}JnN?dh@%qxLD*hQcl{vUE z`FJAU`$TO0&_E)d+tcJE=8mCC6T+=xpuYmOgd)M_U>6E?L{O-^tqp~{TG|`BdQfYy z2Q_p@I$AdR!?Cp;xV-+Y8T#jd@XQszv@qU%j+=VC!xNdrOe_}&? zO(NRg+m{%QCsWJI6sRKa=3$+Sv!1iQXMNt9v_`D8R!O=lostepTcxN}FO^$vTFzSD zvFx!7T0)j;i@|)!{Gs_3^JeoZbHH3G{waPb9u}V!2gD}PE^19bnvR)XG;K63HOZzz z@^G-!iE}ysK25=p?_V!S-(mj(3c4}gs+5A;W=SI zXcA@$obH_NsBXV*gRUDdkTqt28DIwfa{~|-IDitZ%jt5~IQ=!w+B;_fd?q_;ox;de z)IpHR6eLh~zz(4lQE>MVH$QqJ0_}9f>OiI=*lgc<`8#kCL^12hm?aw{X8D62RGUgk zo6Sc8()kW>X4lCl-29cjZ^8p~gqVG6xXVdgxh`)5^ z$uX!_L%glKZ*{^PHN>}UqHH%*(Ge_vrSr%Ls!SniZSIU&vN72qa}&GJY&9Yv^#Itj z%j9RcHNJ5h%%USi?C0Z`ZTAyI5u2ML-mbU+_-Pg2@Y6Tq+;Q3ApL}8>02OM8r);!l zI)EDDZ5ceZ3XmG&3-33GFoTX@vEh^DMr2DNX|ZxfELk`f%L{rmU5yA>bT7lS>@xWo zZjGnuRVb$;MC_;2?6&&|qKM5+G4D8&fHHan7F+1A{|Tn5A)Yel_svkMhIpGtN5U{g z4e_;Ziynm%I)cS68QeRFic?5htScjyY>Zs7x14CQ8WAwuz6g`D%j9RcHM6&uKoK1w zVn5h$+Ez#qMQm=0>H5e`u+k&2Skd&xKOm_gp5lwQUjvI8;;ZwOF95R|;;lQjkb+A2Qx-vZ%(0kuf5F8}}l literal 0 HcmV?d00001