commit 51570b3da4aa1bdc5657d36efb0d2e8e2d11f01c Author: Kiara Grouwstra Date: Tue Dec 21 23:05:31 2021 +0100 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..67c0ace --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.sqlite3 +*.csv + diff --git a/README.md b/README.md new file mode 100644 index 0000000..b25cba9 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# missing contributions + +Hier kijken we wie er nou eigenlijk sinds oktober hun maandelijkse contributie betalingen zijn misgelopen. + +## gebruikte tools + +- Docker: helpt om software te runnen +- Jupyter: coden in je browser +- SQLite3: simpele database +- SQL: de query taal voor die database + +## requirements + +- [Docker](https://www.docker.com/) +- Mollie CSVs put in this directory: `customers.csv` + `payments.csv` + +## usage + +- run in the console: +```bash +docker run -p 8888:8888 -v $(pwd):/home/jovyan/work jupyter/scipy-notebook +``` +- open the resulting URL in your browser +- navigate to and open `mollie.ipynb` +- run all cells +- check resulting CSV + diff --git a/mollie.ipynb b/mollie.ipynb new file mode 100644 index 0000000..20ec909 --- /dev/null +++ b/mollie.ipynb @@ -0,0 +1,324 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "id": "7f0fc0f0", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The sql extension is already loaded. To reload it, use:\n", + " %reload_ext sql\n" + ] + } + ], + "source": [ + "# enable sql\n", + "!pip install ipython-sql >> /dev/null\n", + "%load_ext sql" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "412a7b61", + "metadata": {}, + "outputs": [], + "source": [ + "# make a database, let's call it mollie\n", + "%sql sqlite:///mollie.sqlite3" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "dc56dd7c", + "metadata": {}, + "outputs": [], + "source": [ + "# import our mollie CSVs\n", + "!sqlite3 mollie.sqlite3 -separator \",\" '.import ./customers.csv mollie_customers'\n", + "!sqlite3 mollie.sqlite3 -separator \",\" '.import ./payments.csv mollie_payments'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "f59b6a11", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CREATE TABLE IF NOT EXISTS \"mollie_customers\"(\n", + " \"resource\" TEXT,\n", + " \"id\" TEXT,\n", + " \"mode\" TEXT,\n", + " \"name\" TEXT,\n", + " \"email\" TEXT,\n", + " \"locale\" TEXT,\n", + " \"metadata\" TEXT,\n", + " \"createdAt\" TEXT,\n", + " \"_links\" TEXT\n", + ");\n", + "CREATE TABLE IF NOT EXISTS \"mollie_payments\"(\n", + " \"resource\" TEXT,\n", + " \"id\" TEXT,\n", + " \"createdAt\" TEXT,\n", + " \"paidAt\" TEXT,\n", + " \"description\" TEXT,\n", + " \"method\" TEXT,\n", + " \"status\" TEXT,\n", + " \"isCancelable\" TEXT,\n", + " \"sequenceType\" TEXT,\n", + " \"profileId\" TEXT,\n", + " \"customerId\" TEXT,\n", + " \"mandateId\" TEXT,\n", + " \"details.consumerName\" TEXT,\n", + " \"details.consumerAccount\" TEXT,\n", + " \"details.consumerBic\" TEXT,\n", + " \"amount.value\" TEXT,\n", + " \"amount.currency\" TEXT,\n", + " \"settlementAmount.value\" TEXT,\n", + " \"settlementAmount.currency\" TEXT,\n", + " \"amountRefunded.value\" TEXT,\n", + " \"amountRefunded.currency\" TEXT,\n", + " \"amountRemaining.value\" TEXT,\n", + " \"amountRemaining.currency\" TEXT,\n", + " \"customer.resource\" TEXT,\n", + " \"customer.mode\" TEXT,\n", + " \"customer.name\" TEXT,\n", + " \"customer.email\" TEXT,\n", + " \"customer.locale\" TEXT,\n", + " \"customer.metadata\" TEXT,\n", + " \"customer.createdAt\" TEXT,\n", + " \"customer._links\" TEXT\n", + ");\n" + ] + } + ], + "source": [ + "# let's check out their data structures\n", + "!sqlite3 mollie.sqlite3 '.schema mollie_customers'\n", + "!sqlite3 mollie.sqlite3 '.schema mollie_payments'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "5c11902f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sqlite://\n", + " * sqlite:///mollie.sqlite3\n", + "Done.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
resourceidmodenameemaillocalemetadatacreatedAt_links
" + ], + "text/plain": [ + "[]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# preview the customers (sensitive data, so results censored from version control)\n", + "%sql select * from mollie_customers limit 10;" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "627724bf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sqlite://\n", + " * sqlite:///mollie.sqlite3\n", + "Done.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
resourceidcreatedAtpaidAtdescriptionmethodstatusisCancelablesequenceTypeprofileIdcustomerIdmandateIddetails.consumerNamedetails.consumerAccountdetails.consumerBicamount.valueamount.currencysettlementAmount.valuesettlementAmount.currencyamountRefunded.valueamountRefunded.currencyamountRemaining.valueamountRemaining.currencycustomer.resourcecustomer.modecustomer.namecustomer.emailcustomer.localecustomer.metadatacustomer.createdAtcustomer._links
" + ], + "text/plain": [ + "[]" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# preview the payments (same)\n", + "%sql select * from mollie_payments limit 10;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de2099ba", + "metadata": {}, + "outputs": [], + "source": [ + "%%sql\n", + "-- zoek naar mensen die het laatst hun maandelijkse contributie betaald hebben in september\n", + "select *\n", + "from mollie_customers join mollie_payments\n", + "on mollie_customers.id = mollie_payments.customerId\n", + "where mollie_payments.status = 'paid'\n", + "and mollie_payments.paidAt > '2021-09-01'\n", + "and mollie_payments.paidAt < '2021-10-01'\n", + "and mollie_payments.description like 'Maandelijkse%'\n", + "limit 50\n", + ";\n" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "7d0f0070", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " sqlite://\n", + " * sqlite:///mollie.sqlite3\n", + "Done.\n", + "Returning data to local variable leden_maandelijkse_contributie_laatst_betaald_in_september\n" + ] + } + ], + "source": [ + "%%sql\n", + "leden_maandelijkse_contributie_laatst_betaald_in_september <<\n", + "-- zelfde query maar nou opslaan ipv preview\n", + "select *\n", + "from mollie_customers join mollie_payments\n", + "on mollie_customers.id = mollie_payments.customerId\n", + "where mollie_payments.status = 'paid'\n", + "and mollie_payments.paidAt > '2021-09-01'\n", + "and mollie_payments.paidAt < '2021-10-01'\n", + "and mollie_payments.description like 'Maandelijkse%'\n", + "-- limit 50\n", + ";\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "61245263", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "CSV results" + ], + "text/plain": [ + "CSV results at /home/jovyan/work/Downloads/./laatst_september.csv" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "leden_maandelijkse_contributie_laatst_betaald_in_september.csv('./laatst_september.csv')\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}