{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Glottolog stats dashboard\n", "## report stats, monitor change\n", "\n", "record properties of ``treedb.sqlite3``\n", "loaded from [Glottolog](https://glottolog.org)\n", "[master repo](https://github.com/glottolog/glottolog) commit\n", "and monitor changes by diffing this\n", "\n", "
\n", " \n", " latest version from GitHub in nbviewer\n", " \n", "
\n", "\n", "### Contents\n", "1. [Clone the data repository](#Clone-the-data-repository)\n", "2. [Use the repository root as source](#Use-the-repository-root-as-source)\n", "3. [Set the database file and load it](#Set-the-database-file-and-load-it)\n", "4. [Check the database](#Check-the-database)\n", "5. [treedb.sqlite3](#treedb.sqlite3)\n", "6. [print_dataset()](#print_dataset())\n", "7. [\\_\\_dataset\\_\\_](#__dataset__)\n", "8. [\\_\\_producer\\_\\_](#__producer__)\n", "9. [treedb.raw](#treedb.raw)\n", "10. [languoid](#languoid)\n", "11. [macroarea](#macroarea)\n", "12. [country](#country)\n", "13. [altname](#altname)\n", "14. [source](#source)\n", "15. [classification](#classification)\n", "16. [link](#link)\n", "17. [endangerment](#endangerment)\n", "18. [Example query](#example-query)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "treedb version: 2.4.3\n", "sqlalchemy version: 1.4.36\n", "sqlite_version: 3.38.5\n", "csv23 version: 0.3.3\n" ] } ], "source": [ "%matplotlib inline\n", "\n", "import collections\n", "import os\n", "\n", "os.environ['SQLALCHEMY_WARN_20'] = 'true'\n", "\n", "import pandas as pd\n", "import sqlalchemy as sa\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt\n", "\n", "import treedb\n", "import treedb.raw\n", "\n", "treedb.configure_logging(log_sql=False)\n", "\n", "treedb.print_versions()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Clone the data repository" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 0 ns\n", "Wall time: 50.6 s\n" ] }, { "data": { "text/plain": [ "(CompletedProcess(args=['git', 'clone', '-c', 'advice.detachedHead=false', '--single-branch', '--branch', 'v4.6', '--depth', '1', 'https://github.com/glottolog/glottolog.git', WindowsPath('../glottolog')], returncode=0),\n", " CompletedProcess(args=['git', 'checkout', '-B', 'treedb', 'v4.6'], returncode=0))" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "GLOTTOLOG_TAG = 'v4.6'\n", "\n", "TARGET = '../glottolog/'\n", "\n", "treedb.checkout_or_clone(GLOTTOLOG_TAG, target=TARGET)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "GlottologVersion(commit='aababe11c3afa6388b84de2b12255155ab0646b2', describe='v4.6')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "treedb.glottolog_version()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Use the repository root as source" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "treedb.set_root(TARGET)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "FileInfo(path=('abin1243',), dentry=, config=)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "next(treedb.iterfiles())" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{('abin1243',): {'id': 'abin1243',\n", " 'parent_id': None,\n", " 'name': 'Abinomn',\n", " 'level': 'language',\n", " 'hid': 'bsa',\n", " 'iso639_3': 'bsa',\n", " 'latitude': -2.92281,\n", " 'longitude': 138.891,\n", " 'macroareas': ['Papunesia'],\n", " 'countries': [{'id': 'ID', 'name': 'Indonesia'}],\n", " 'links': [{'url': 'https://en.wikipedia.org/wiki/Abinomn_language',\n", " 'title': None,\n", " 'scheme': 'https'},\n", " {'url': 'https://www.wikidata.org/entity/Q56648',\n", " 'title': None,\n", " 'scheme': 'https'}],\n", " 'timespan': None,\n", " 'sources': {'glottolog': [{'bibfile': 'hh',\n", " 'bibkey': 'e:Lagerberg:Moegip',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'hh',\n", " 'bibkey': 'h:SilzerClouse:Index',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'hh',\n", " 'bibkey': 'h:SilzerHeikkinen:Irian',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'hh',\n", " 'bibkey': 'hv:Foley:Northwest-New-Guinea',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'hh',\n", " 'bibkey': 'hvtyp:DonohueMusgrave:Melanesia',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'hh',\n", " 'bibkey': 'w:Fiwei:Abinomn',\n", " 'pages': None,\n", " 'trigger': None}]},\n", " 'altnames': {'multitree': [{'name': '\"Baso\"', 'lang': None},\n", " {'name': 'Abinomn', 'lang': None},\n", " {'name': 'Avinomen', 'lang': None},\n", " {'name': 'Foja', 'lang': None},\n", " {'name': 'Foya', 'lang': None}],\n", " 'lexvo': [{'name': 'Abinomn', 'lang': 'en'},\n", " {'name': 'Abinomn language', 'lang': 'en'},\n", " {'name': 'Abinomneg', 'lang': 'br'},\n", " {'name': 'Lingua abinomn', 'lang': 'gl'},\n", " {'name': 'Llingua Abinomn', 'lang': 'ast'}],\n", " 'hhbib_lgcode': [{'name': 'Baso', 'lang': None}]},\n", " 'triggers': {'lgcode': ['macrohistory', 'moegip']},\n", " 'identifier': {'multitree': 'bsa', 'endangeredlanguages': '1763'},\n", " 'classification': {'familyrefs': [{'bibfile': 'hh',\n", " 'bibkey': 'h:SilzerClouse:Index',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'hh',\n", " 'bibkey': 'hvtyp:DonohueMusgrave:Melanesia',\n", " 'pages': None,\n", " 'trigger': None}]},\n", " 'endangerment': {'status': 'shifting',\n", " 'source': {'name': 'ElCat', 'bibfile': None, 'bibkey': None, 'pages': None},\n", " 'date': datetime.datetime(2017, 8, 19, 8, 16, 16),\n", " 'comment': 'Abinomn (1763-bsa) = Endangered (20 percent certain, based on the evidence available)'},\n", " 'hh_ethnologue_comment': None,\n", " 'iso_retirement': None}}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dict(treedb.iterlanguoids(limit=1))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 13.9 s\n", "Wall time: 16.3 s\n" ] }, { "data": { "text/plain": [ "'path_languoid:path:sha256:3e07ebd1d58f84604dab5f717dfcd2745b8dd37adbecab61a6bfdcb4b9e85d1c'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time treedb.checksum(source='files')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set the database file and load it" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "treedb.set_engine('treedb.sqlite3')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0:00:48.633790\n", "CPU times: total: 42.7 s\n", "Wall time: 48.9 s\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "engine = treedb.load(rebuild=False, exclude_raw=False)\n", "engine" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Check the database" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime(2022, 5, 27, 20, 9, 16, 457834)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "engine.file_mtime()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "68.453125" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "engine.file_size(as_megabytes=True)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 46.9 ms\n", "Wall time: 50 ms\n" ] }, { "data": { "text/plain": [ "'fb20b671c08e227187475d23ad3e8b7fb477a770463b59fa8e131c85de119284'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time engine.file_sha256()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 109 ms\n", "Wall time: 106 ms\n" ] }, { "data": { "text/plain": [ "'strong:sha256:fcc129dbfedc77a8238565e4e12eb53198e70dda9f6613c7f467e5b057dc04ca'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time treedb.raw.checksum()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 3.09 s\n", "Wall time: 3.09 s\n" ] }, { "data": { "text/plain": [ "'weak:sha256:1610520f11227a5489b44693b14a5d8db423d66d7ace391c2db221a56036457a'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time treedb.raw.checksum(weak=True)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 4.47 s\n", "Wall time: 4.46 s\n" ] }, { "data": { "text/plain": [ "'path_languoid:path:sha256:3e07ebd1d58f84604dab5f717dfcd2745b8dd37adbecab61a6bfdcb4b9e85d1c'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time treedb.checksum(source='tables')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 5.16 s\n", "Wall time: 5.15 s\n" ] }, { "data": { "text/plain": [ "'path_languoid:path:sha256:3e07ebd1d58f84604dab5f717dfcd2745b8dd37adbecab61a6bfdcb4b9e85d1c'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time treedb.checksum(source='raw')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "valid_pseudofamily_referencesCheck: OK\n", "pseudofamilies_are_rootsCheck: OK\n", "valid_glottocodeCheck: OK\n", "valid_iso639_3Check: OK\n", "valid_hidCheck: OK\n", "clean_nameCheck: OK\n", "family_parentCheck: OK\n", "language_parentCheck: OK\n", "dialect_parentCheck: OK\n", "family_childrenCheck: OK\n", "family_languagesCheck: OK\n", "no_empty_filesCheck: OK\n", "CPU times: total: 922 ms\n", "Wall time: 919 ms\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time treedb.check()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## treedb.sqlite3" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[INFO@treedb.logging_] treedb version: 2.4.3\n", "BEGIN (implicit)\n", "SELECT sqlite_version() AS sqlite_version_1\n", "[generated in 0.00074s] ()\n", "ROLLBACK\n" ] }, { "data": { "text/plain": [ "'3.38.5'" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "treedb.configure_logging(level='INFO', log_sql=True)\n", "\n", "treedb.scalar(sa.select(sa.func.sqlite_version()))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "PRAGMA application_id\n", "[generated in 0.00069s] ()\n", "ROLLBACK\n" ] }, { "data": { "text/plain": [ "1122" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "application_id = treedb.scalar(sa.text('PRAGMA application_id'))\n", "\n", "assert application_id == 1122 == 0x462\n", "assert application_id == sum(ord(c) for c in treedb.Dataset.__tablename__)\n", "assert treedb.Dataset.__tablename__ == '__dataset__'\n", "\n", "application_id" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.name \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name NOT LIKE ? ORDER BY sqlite_master.name\n", "[generated in 0.00075s] ('table', 'sqlite_%')\n", "ROLLBACK\n", "[INFO@treedb.backend.pandas] pandas version: 1.4.2\n", "BEGIN (implicit)\n", "SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM __dataset__) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM __producer__) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM _config) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM _file) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM _option) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM _value) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM altname) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM altnameprovider) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM bibfile) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM bibitem) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM classificationcomment) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM classificationref) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM country) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM endangerment) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM endangermentsource) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM endangermentstatus) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM ethnologuecomment) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM identifier) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM identifiersite) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM isoretirement) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM isoretirement_changeto) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM languoid) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM languoid_country) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM languoid_macroarea) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM languoidlevel) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM link) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM macroarea) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM pseudofamily) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM source) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM sourceprovider) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM timespan) AS n_rows UNION ALL SELECT ? AS table_name, (SELECT count(*) AS n \n", "FROM \"trigger\") AS n_rows\n", "[generated in 0.00092s] ('__dataset__', '__producer__', '_config', '_file', '_option', '_value', 'altname', 'altnameprovider', 'bibfile', 'bibitem', 'classificationcomment', 'classificationref', 'country', 'endangerment', 'endangermentsource', 'endangermentstatus', 'ethnologuecomment', 'identifier', 'identifiersite', 'isoretirement', 'isoretirement_changeto', 'languoid', 'languoid_country', 'languoid_macroarea', 'languoidlevel', 'link', 'macroarea', 'pseudofamily', 'source', 'sourceprovider', 'timespan', 'trigger')\n", "ROLLBACK\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", " \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", " \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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
n_rows
table_name
__dataset__1
__producer__1
_config370
_file26285
_option53
_value624375
altname156868
altnameprovider11
bibfile40
bibitem148716
classificationcomment12026
classificationref17321
country246
endangerment8345
endangermentsource52
endangermentstatus6
ethnologuecomment613
identifier21402
identifiersite4
isoretirement358
isoretirement_changeto451
languoid26285
languoid_country11463
languoid_macroarea21616
languoidlevel3
link29722
macroarea6
pseudofamily8
source197791
sourceprovider1
timespan199
trigger30258
\n", "
" ], "text/plain": [ " n_rows\n", "table_name \n", "__dataset__ 1\n", "__producer__ 1\n", "_config 370\n", "_file 26285\n", "_option 53\n", "_value 624375\n", "altname 156868\n", "altnameprovider 11\n", "bibfile 40\n", "bibitem 148716\n", "classificationcomment 12026\n", "classificationref 17321\n", "country 246\n", "endangerment 8345\n", "endangermentsource 52\n", "endangermentstatus 6\n", "ethnologuecomment 613\n", "identifier 21402\n", "identifiersite 4\n", "isoretirement 358\n", "isoretirement_changeto 451\n", "languoid 26285\n", "languoid_country 11463\n", "languoid_macroarea 21616\n", "languoidlevel 3\n", "link 29722\n", "macroarea 6\n", "pseudofamily 8\n", "source 197791\n", "sourceprovider 1\n", "timespan 199\n", "trigger 30258" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from treedb import pd_read_sql as read_sql\n", "\n", "read_sql(treedb.select_tables_nrows(), index_col='table_name')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.name \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name NOT LIKE ? ORDER BY sqlite_master.name\n", "[cached since 0.06139s ago] ('view', 'sqlite_%')\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "example\n", "path_languoid\n", "stats\n" ] } ], "source": [ "treedb.print_rows(treedb.backend.sqlite_master.select_views(),\n", " format_='{name}')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[generated in 0.00091s] ('table', 'sqlite_master')\n", "SELECT count(*) AS n_rows \n", "FROM sqlite_master\n", "[generated in 0.00049s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "None\n", "66\n" ] } ], "source": [ "from treedb import print_table_sql as print_sql\n", "\n", "print_sql('sqlite_master')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## print_dataset()" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT __dataset__.id, __dataset__.title, __dataset__.git_commit, __dataset__.git_describe, __dataset__.clean, __dataset__.version, __dataset__.exclude_raw \n", "FROM __dataset__\n", "[generated in 0.00100s] ()\n", "SELECT __producer__.id, __producer__.name, __producer__.version \n", "FROM __producer__\n", "[cached since 14.05s ago] ()\n", "ROLLBACK\n", "[INFO@treedb.backend.models] git describe 'v4.6' clean: True\n", "[INFO@treedb.backend.models] __dataset__.git_commit: 'aababe11c3afa6388b84de2b12255155ab0646b2'\n", "[INFO@treedb.backend.models] __dataset__.version: '4.6'\n", "[INFO@treedb.backend.models] __producer__.name: treedb\n", "[INFO@treedb.backend.models] __producer__.version: 2.4.3\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "git describe 'v4.6' clean: True\n", "__dataset__.title: 'Glottolog treedb''\n", "__dataset__.git_commit: 'aababe11c3afa6388b84de2b12255155ab0646b2'\n", "__dataset__.version: '4.6'\n", "__dataset__.exclude_raw: False\n", "__producer__.name: treedb\n", "__producer__.version: 2.4.3\n" ] } ], "source": [ "treedb.print_dataset()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## \\_\\_dataset\\_\\_" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 0.03181s ago] ('table', '__dataset__')\n", "SELECT count(*) AS n_rows \n", "FROM __dataset__\n", "[generated in 0.00058s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE __dataset__ (\n", "\tid INTEGER NOT NULL CHECK (id = 1), \n", "\ttitle TEXT NOT NULL CHECK (title != ''), \n", "\tgit_commit VARCHAR(40) NOT NULL CHECK (length(git_commit) = 40), \n", "\tgit_describe TEXT NOT NULL CHECK (git_describe != ''), \n", "\tclean BOOLEAN NOT NULL, \n", "\tversion TEXT CHECK (version != ''), \n", "\texclude_raw BOOLEAN NOT NULL, \n", "\tPRIMARY KEY (id), \n", "\tUNIQUE (git_commit), \n", "\tUNIQUE (git_describe), \n", "\tCHECK (clean IN (0, 1)), \n", "\tCHECK (exclude_raw IN (0, 1))\n", ")\n", "1\n" ] } ], "source": [ "from treedb import Dataset\n", "\n", "print_sql(Dataset)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT __dataset__.id, __dataset__.title, __dataset__.git_commit, __dataset__.git_describe, __dataset__.clean, __dataset__.version, __dataset__.exclude_raw \n", "FROM __dataset__\n", "[cached since 0.03478s ago] ()\n", "ROLLBACK\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", " \n", " \n", " \n", " \n", " \n", "
__dataset__
id1
titleGlottolog treedb
git_commitaababe11c3afa6388b84de2b12255155ab0646b2
git_describev4.6
cleanTrue
version4.6
exclude_rawFalse
\n", "
" ], "text/plain": [ " __dataset__\n", "id 1\n", "title Glottolog treedb\n", "git_commit aababe11c3afa6388b84de2b12255155ab0646b2\n", "git_describe v4.6\n", "clean True\n", "version 4.6\n", "exclude_raw False" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset, = treedb.iterrows(sa.select(Dataset), mappings=True)\n", "\n", "pd.DataFrame.from_dict(dataset, orient='index',\n", " columns=['__dataset__'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## \\_\\_producer\\_\\_" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 0.06319s ago] ('table', '__producer__')\n", "SELECT count(*) AS n_rows \n", "FROM __producer__\n", "[generated in 0.00045s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE __producer__ (\n", "\tid INTEGER NOT NULL CHECK (id = 1), \n", "\tname TEXT NOT NULL CHECK (name != ''), \n", "\tversion TEXT NOT NULL CHECK (version != ''), \n", "\tPRIMARY KEY (id), \n", "\tUNIQUE (name)\n", ")\n", "1\n" ] } ], "source": [ "from treedb import Producer\n", "\n", "print_sql(Producer)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT __producer__.id, __producer__.name, __producer__.version \n", "FROM __producer__\n", "[cached since 14.11s ago] ()\n", "ROLLBACK\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", "
__producer__
id1
nametreedb
version2.4.3
\n", "
" ], "text/plain": [ " __producer__\n", "id 1\n", "name treedb\n", "version 2.4.3" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "producer, = treedb.iterrows(sa.select(Producer), mappings=True)\n", "\n", "pd.DataFrame.from_dict(producer, orient='index',\n", " columns=['__producer__'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `treedb.raw`" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 0.09509s ago] ('table', '_file')\n", "SELECT count(*) AS n_rows \n", "FROM _file\n", "[generated in 0.00051s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE _file (\n", "\tid INTEGER NOT NULL, \n", "\tglottocode VARCHAR(8) NOT NULL CHECK (length(glottocode) = 8), \n", "\tpath TEXT NOT NULL CHECK (length(path) >= 8 AND (length(path) + 1) % 9 = 0), \n", "\tsize INTEGER NOT NULL CHECK (size > 0), \n", "\tsha256 VARCHAR(64) NOT NULL CHECK (length(sha256) = 64), \n", "\tPRIMARY KEY (id), \n", "\tCHECK (substr(path, -length(glottocode)) = glottocode), \n", "\tUNIQUE (glottocode), \n", "\tUNIQUE (path), \n", "\tUNIQUE (sha256)\n", ")\n", "26285\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 0.103s ago] ('table', '_option')\n", "SELECT count(*) AS n_rows \n", "FROM _option\n", "[generated in 0.00035s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE _option (\n", "\tid INTEGER NOT NULL, \n", "\tsection TEXT NOT NULL CHECK (section != ''), \n", "\toption TEXT NOT NULL CHECK (option != ''), \n", "\tis_lines BOOLEAN, \n", "\tdefined BOOLEAN NOT NULL, \n", "\tdefined_any_options BOOLEAN NOT NULL, \n", "\tord_section INTEGER CHECK (ord_section >= 1), \n", "\tord_option INTEGER CHECK (ord_section >= 0), \n", "\tPRIMARY KEY (id), \n", "\tUNIQUE (section, option), \n", "\tCHECK ((is_lines IS NULL) = (defined = 0)), \n", "\tCHECK (defined = 1 OR defined_any_options = 0), \n", "\tCHECK ((defined = 0) = (ord_section IS NULL)), \n", "\tCHECK (ord_section IS NOT NULL OR ord_option IS NULL), \n", "\tCHECK (is_lines IN (0, 1)), \n", "\tCHECK (defined IN (0, 1)), \n", "\tCHECK (defined_any_options IN (0, 1))\n", ")\n", "53\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 0.1096s ago] ('table', '_value')\n", "SELECT count(*) AS n_rows \n", "FROM _value\n", "[generated in 0.00051s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE _value (\n", "\tfile_id INTEGER NOT NULL, \n", "\toption_id INTEGER NOT NULL, \n", "\tline INTEGER NOT NULL CHECK (line > 0), \n", "\tvalue TEXT NOT NULL CHECK (value != ''), \n", "\tPRIMARY KEY (file_id, option_id, line), \n", "\tUNIQUE (file_id, line), \n", "\tFOREIGN KEY(file_id) REFERENCES _file (id), \n", "\tFOREIGN KEY(option_id) REFERENCES _option (id)\n", ") WITHOUT ROWID\n", "624375\n" ] } ], "source": [ "from treedb.raw import File, Option, Value\n", "\n", "for model in (File, Option, Value):\n", " print_sql(model)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT _file.id, _file.glottocode, _file.path, _file.size, _file.sha256 \n", "FROM _file\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00090s] (5, 0)\n", "ROLLBACK\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
glottocodepathsizesha256
id
1abin1243abin12431109c41caf5e12bcc9a22c6ff184e6a659ca744c4fe363cf1d...
2abis1238abis12381702b9889f1e63c8f7244f4228b21183594aae965eab830396...
3abkh1242abkh12423065dd28ae1265a0967b1a236d06c7fd6e7ac3b9e32d866dd...
4abkh1243abkh1242/abkh1243257a5900355c69af22d94eaa0a147b95fc291270634bc033c...
5abaz1241abkh1242/abkh1243/abaz1241236393c6b3b27e142d40f38c8c55b929217edd534f80f44a94...
\n", "
" ], "text/plain": [ " glottocode path size \\\n", "id \n", "1 abin1243 abin1243 1109 \n", "2 abis1238 abis1238 1702 \n", "3 abkh1242 abkh1242 306 \n", "4 abkh1243 abkh1242/abkh1243 257 \n", "5 abaz1241 abkh1242/abkh1243/abaz1241 2363 \n", "\n", " sha256 \n", "id \n", "1 c41caf5e12bcc9a22c6ff184e6a659ca744c4fe363cf1d... \n", "2 b9889f1e63c8f7244f4228b21183594aae965eab830396... \n", "3 5dd28ae1265a0967b1a236d06c7fd6e7ac3b9e32d866dd... \n", "4 a5900355c69af22d94eaa0a147b95fc291270634bc033c... \n", "5 93c6b3b27e142d40f38c8c55b929217edd534f80f44a94... " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_sql(sa.select(File).limit(5), index_col='id')" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT _option.id, _option.section, _option.option, _option.is_lines, _option.defined, _option.defined_any_options, _option.ord_section, _option.ord_option \n", "FROM _option\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00093s] (5, 0)\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sectionoptionis_linesdefineddefined_any_optionsord_sectionord_option
id
1corenameFalseTrueFalse11
2corehidFalseTrueFalse12
3corelevelFalseTrueFalse13
4coreiso639-3FalseTrueFalse14
5corelatitudeFalseTrueFalse15
\n", "
" ], "text/plain": [ " section option is_lines defined defined_any_options ord_section \\\n", "id \n", "1 core name False True False 1 \n", "2 core hid False True False 1 \n", "3 core level False True False 1 \n", "4 core iso639-3 False True False 1 \n", "5 core latitude False True False 1 \n", "\n", " ord_option \n", "id \n", "1 1 \n", "2 2 \n", "3 3 \n", "4 4 \n", "5 5 " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_sql(sa.select(Option).limit(5), index_col='id')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT _value.file_id, _value.option_id, _value.line, _value.value \n", "FROM _value\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00085s] (5, 0)\n", "ROLLBACK\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
linevalue
file_idoption_id
111Abinomn
22bsa
33language
44bsa
55-2.92281
\n", "
" ], "text/plain": [ " line value\n", "file_id option_id \n", "1 1 1 Abinomn\n", " 2 2 bsa\n", " 3 3 language\n", " 4 4 bsa\n", " 5 5 -2.92281" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_sql(sa.select(Value).limit(5), index_col=['file_id', 'option_id'])" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT _option.section, _option.option, _value.line, _value.value \n", "FROM _file JOIN _value ON _file.id = _value.file_id JOIN _option ON _option.id = _value.option_id \n", "WHERE _file.glottocode = ?\n", "[generated in 0.00085s] ('abin1243',)\n", "ROLLBACK\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", " \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", " \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", " \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", " \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", " \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", "
value
sectionoptionline
corename1Abinomn
hid2bsa
level3language
iso639-34bsa
latitude5-2.92281
longitude6138.891
macroareas7Papunesia
countries8ID
links9https://en.wikipedia.org/wiki/Abinomn_language
10https://www.wikidata.org/entity/Q56648
sourcesglottolog11**hh:e:Lagerberg:Moegip**
12**hh:h:SilzerClouse:Index**
13**hh:h:SilzerHeikkinen:Irian**
14**hh:hv:Foley:Northwest-New-Guinea**
15**hh:hvtyp:DonohueMusgrave:Melanesia**
16**hh:w:Fiwei:Abinomn**
altnamesmultitree17\"Baso\"
18Abinomn
19Avinomen
20Foja
21Foya
lexvo22Abinomn [en]
23Abinomn language [en]
24Abinomneg [br]
25Lingua abinomn [gl]
26Llingua Abinomn [ast]
hhbib_lgcode27Baso
triggerslgcode28macrohistory
29moegip
identifiermultitree30bsa
endangeredlanguages311763
classificationfamilyrefs32**hh:h:SilzerClouse:Index**
33**hh:hvtyp:DonohueMusgrave:Melanesia**
endangermentstatus34shifting
source35ElCat
date362017-08-19T08:16:16
comment37Abinomn (1763-bsa) = Endangered (20 percent ce...
\n", "
" ], "text/plain": [ " value\n", "section option line \n", "core name 1 Abinomn\n", " hid 2 bsa\n", " level 3 language\n", " iso639-3 4 bsa\n", " latitude 5 -2.92281\n", " longitude 6 138.891\n", " macroareas 7 Papunesia\n", " countries 8 ID\n", " links 9 https://en.wikipedia.org/wiki/Abinomn_language\n", " 10 https://www.wikidata.org/entity/Q56648\n", "sources glottolog 11 **hh:e:Lagerberg:Moegip**\n", " 12 **hh:h:SilzerClouse:Index**\n", " 13 **hh:h:SilzerHeikkinen:Irian**\n", " 14 **hh:hv:Foley:Northwest-New-Guinea**\n", " 15 **hh:hvtyp:DonohueMusgrave:Melanesia**\n", " 16 **hh:w:Fiwei:Abinomn**\n", "altnames multitree 17 \"Baso\"\n", " 18 Abinomn\n", " 19 Avinomen\n", " 20 Foja\n", " 21 Foya\n", " lexvo 22 Abinomn [en]\n", " 23 Abinomn language [en]\n", " 24 Abinomneg [br]\n", " 25 Lingua abinomn [gl]\n", " 26 Llingua Abinomn [ast]\n", " hhbib_lgcode 27 Baso\n", "triggers lgcode 28 macrohistory\n", " 29 moegip\n", "identifier multitree 30 bsa\n", " endangeredlanguages 31 1763\n", "classification familyrefs 32 **hh:h:SilzerClouse:Index**\n", " 33 **hh:hvtyp:DonohueMusgrave:Melanesia**\n", "endangerment status 34 shifting\n", " source 35 ElCat\n", " date 36 2017-08-19T08:16:16\n", " comment 37 Abinomn (1763-bsa) = Endangered (20 percent ce..." ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "select_file_values = (sa.select(Option.section, Option.option, Value.line, Value.value)\n", " .select_from(File)\n", " .filter_by(glottocode=sa.bindparam('glottocode'))\n", " .join(Value).join(Option))\n", "\n", "read_sql(select_file_values, params={'glottocode': 'abin1243'},\n", " index_col=['section', 'option', 'line'])" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT floor((length(_file.path) + ?) / ?) AS path_depth, languoid.level, count(*) AS n_files \n", "FROM _file JOIN languoid ON _file.glottocode = languoid.id GROUP BY floor((length(_file.path) + ?) / ?), languoid.level ORDER BY path_depth, languoid.level\n", "[generated in 0.00076s] (1, 9, 1, 9)\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAADUCAYAAACf6eUMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAimUlEQVR4nO3debxVdbn48c+DoswIiIpRHm4pIqKIaBftpziihSmFYqaCQ+bNgWYw6mqmScMtNbSiq4JaohcTSNPAKTVLZEokMryIDKIMpYIIAX5/f+wF93RkOmevfc4+m8/79VqvvfZaaz/Pd+3h7Od893etFSklJEmSpJ1dk4ZugCRJklQOLIwlSZIkLIwlSZIkwMJYkiRJAiyMJUmSJMDCWJIkSQJg14ZuAMCee+6ZqqqqGroZkiRJqnDTp09fkVLquKV1ZVEYV1VVMW3atIZuhiRJkipcRLy6tXUOpZAkSZKwMJYkSZKAHSiMI+L2iFgWES9WW9Y+IqZExLzstl21dVdFxMsR8VJE9CtVwyVJkqQ87cgY4zHAKODOasuGA4+llEZGxPDs/rCIOAg4G+gO7As8GhEHpJQ25ttsSSqt9evXs3jxYtauXdvQTWnUmjVrRufOnWnatGlDN0WStmu7hXFK6amIqKqx+HSgbzY/FngSGJYtH5dSWge8EhEvA0cCf8ypvZJULxYvXkzr1q2pqqoiIhq6OY1SSomVK1eyePFiunTp0tDNkaTtqusY471TSksBstu9suUfABZV225xtkySGpW1a9fSoUMHi+IiRAQdOnSw111So5H36dq29A2StrhhxCXAJQAf+tCHth7xmra1a8E1b9Vq8x5je9QuPjB78OxGn6O28SslRzm+FvWRoxxfi/rIUexrsSNF8ZwVc2qdo/ue3Wu1fW1z1DZ+KXNUfw7L/fVurDnK8bNXHznK8bWojxzl+FrUS47a1oNQ65oQ6t5j/EZEdALIbpdlyxcDH6y2XWfgtS0FSCmNTin1Tin17thxi+dYlqSdTqtWrRpFTEmqRHUtjCcBg7P5wcDEasvPjojdI6ILsD8wtbgmSpIkSaW3I6dru4fCwXNdI2JxRFwEjAROioh5wEnZfVJKc4D7gL8AjwCXeUYKSaqbH/zgBxxxxBEMOHYAo743CoAfXfsjxt0+bvM2t3z/FsbcOgaA20fdzqCTBnHIIYdw9dVXN0STJalR225hnFL6TEqpU0qpaUqpc0rptpTSypTSCSml/bPbv1fb/vqU0odTSl1TSg+XtvmSVJkmT57MvHnzmDp1Kvc/cT9/+fNfmPbsNE4941QemfDI5u1+N/F39PtkP/7wxB9YOH8h4yaPY9asWUyfPp2nnnqqAfdAkhqfvA++kyTlYPLkyUyePJnDDjuMtRvWsuadNbw6/1U+fe6nWbliJcteX8bfV/ydNm3b0KlzJ+7+xd08++SzDDxuIM12bcbq1auZN28exxxzTEPviiQ1GhbGklSGUkpcddVVfP7zn3/fGSNOPu1kJk+azIplKzh1wKnZA+DioRdz1uCz6nRWCklS3Q++kySVUL9+/bj99ttZvXo1AG8sfYOVy1cCcOqAU3l4wsNM+c0UTj7tZACOOu4oHvjVA6xZvQaAJUuWsGzZsi0HlyRtkT3GklSGTj75ZObOnUufPn1Yt3EdLVq24IZbb6BDxw585MCPsGb1GvbqtBcd9ymc7vLo445m/t/m89mPf5bdd9mdVq1acffdd7PXXnttJ5MkaRMLY0kqI5t6iAGGDh3K0KFDt3jxjQeeeuB9y877/Hmc9/nz3jeUonpMSdLWOZRCkiRJwsJYkiRJAiyMJUmSJMAxxpIk7XRmv7KwoZsglaWdvjD2j4MkSZLAoRSSJEkSYGEsSWXr5ptvplu3bgy7dFhRcf7zP/+TRx99FIC+ffsybdq0PJonSRVnpx9KIUk7omr4QzlGW8CCkZ/Y7la33norDz/8MGtarykq27XXXlvU4yVpZ2FhLEll6NJLL2X+/Pl88pOf5KQBJ/H4I4+z7t117N58d667+Tq6fKQLE+6ZwOMPP87GjRt5+a8vM/g/BrN+/Xqm/HoKu+++O7/97W9p3749Q4YMoX///gwcOHBz/Ntuu40XX3yRH//4xwCMv2s88/82n69/5+sNtcuS1OAcSiFJZehnP/sZ++67L0888QSDLhjE2EljGf/EeC4fdjk3XXfT5u3mzZ3H93/+fe753T3c/N2bada8GTNnzqRPnz7ceeedW41/9tlnM2nSJNavXw/AA/c8wBmfOaPUuyVJZc0eY0kqc6veXsU3Lv8GC+cvJCLYsH7D5nVHfuxIWrZqSctWLWnVphV9+/UFoEePHrzwwgtbjdmyZUuOP/54HnzwQbp168aG9Rs44KADSr0rklTW7DGWpDI36oZRHHn0kUx4egKj7h7FunXrNq/bbbfdNs83adJk8/0mTZqwYcOG98Wq7uKLL2bMmDHccccdDPjMgNI0XpIaEXuMJanMrVq1ir077Q3AhHETcov70Y9+lEWLFjFjxgzufeLe3OJKUmNlj7EklbkLL7+QG6+7kXM/fi7vbXwv19hnnXUWRx99NG33aJtrXElqjOwxlqQdsLXTq81ZMafWsbrv2X3Hci5YAEDPI3ry0HP/d7q4K666AoAzPnPGvxwwN3nG5M3zQ4YMYciQIQCMGTNm8/Inn3zyX3I888wzfOlLX9rxxktSBbPHWJJ2Qm+++SYHHHAAzZs354QTTmjo5khSWbDHWJJ2QnvssQd/+9vfGroZklRWiuoxjogvRcSciHgxIu6JiGYR0T4ipkTEvOy2XV6NlSRJkkqlzoVxRHwAuBLonVI6GNgFOBsYDjyWUtofeCy7L0mSJJW1YscY7wo0j4hdgRbAa8DpwNhs/VjgjCJzSJIkSSVX58I4pbQE+CGwEFgKvJVSmgzsnVJamm2zFNgrj4ZKkiRJpVTMUIp2FHqHuwD7Ai0j4txaPP6SiJgWEdOWL19e12ZIUsVq1apVQzdBknYqxZyV4kTglZTScoCI+DVwFPBGRHRKKS2NiE7Asi09OKU0GhgN0Lt371REOySp9K7Z8gUwduyMxFuK91admyJJKo1ixhgvBP49IlpERAAnAHOBScDgbJvBwMTimihJO7c1q9dw0acu4szjz2TAMQN4/OHHAViycAmnHXUaV3/pak7/2Ol87szPsfbdtQA8//zzHHLIIfTp04evfe1rHHzwwUDhYh+XX3755tj9+/fffNGPa792LWedeBanf+x0Rn1v1OZtnpryFKf1OY3zPnEe373qu3zhnC8A8M4773DhhRdyxBFHcNhhhzFxon/uJTVude4xTik9FxHjgRnABmAmhR7gVsB9EXERheL5zDwa2pjNfmVhQzdBUiO2W7PduGnsTbRq3Yp/rPwH55xyDsedchwAC+cv5Ac//wHf/vG3+cpFX2HKg1M4/D8O54ILLmD06NEcddRRDB++YycHGvqNobRt15aNGzdy0acu4qU5L1H14Sq+/dVvM3bSWDrv15mvXfK1zdtff/31HH/88dx+++28+eabHHnkkZx44om0bNmyJM+DJJVaURf4SCldDVxdY/E6Cr3HkqQcpJS46bqbmPanaTSJJix7fRkrl60E4AMf+gAH9jgQgIMOPYjXFr7Gm2++yapVqzjqqKMAOOecc3jwwQe3m+eRiY8w/s7xbNi4gRVvrOB///a/pPcSH9zvg3TerzMAH//Ux/mfO/8HgMmTJzNp0iR++MMfArB27VoWLlxIt27dcn8OJKk+eOU7SSpzD41/iL+v/Dv3PXofTZs25eReJ7Nu3ToAdtt9t83bNdmlCRvWbiClrR+2seuuu/Lee+9tvr92bWHoxeJXFzPmljGMmzKOtnu0ZcTlI/jn2n9uM1ZKifvvv5+uXbsWu4uSVBaKPY+xJKnEVr29ig57dqBp06ZMfWYqry16bZvbt2vXjtatW/OnP/0JgHHjxm1eV1VVxaxZs3jvvfdYtGgRU6dOBWD1qtU0b9mc1m1as2LZCp5+/GkAuuzfhUWvLmLJwiUAPDLhkc2x+vXrx09+8pPNxfPMmTPz22lJagD2GEtSmes/sD+Xn3s5Z514FgcefCBd9u+y3cfcdtttfO5zn6Nly5b07duXtm0LZ9U4+uij6dKlCz169ODggw+mV69eABx48IF0O7gbp3/sdDrv15nDjjwMgGbNm/Gt73+LSwddyh7t96BHrx6bc3zrW9/ii1/8IocccggpJaqqqnZoyIYklSsLY0naEVs5vdqcFXNqHar7njt2krfVq1cD0K5DO3758C+3uM2Epydsnr/gsgv+L0f37rzwwgsAjBw5kt69ewMQEfzyl++PNWfFHK4fdf0Wcxx59JH85o+/IaXEdcOuo3vPQvubN2/Oz3/+8x3aF0lqDCyMJakCPfTQQ9xwww1s2LCB/fbbjzFjxtQ51vi7xzNx3ETWr19Ptx7dOPP8nf5kQ5IqlIWxJFWgQYMGMWjQoFxinX/p+Zx/6fm5xJKkcubBd5IkSRIWxpIkSRJgYSxJkiQBFsaSJEkS4MF3FWP2KwsbugmSSuiW799Ci5YteGfVOxze53D6HNtnq9sOGTKE/v37M3DgwFrlWLJwCbOen8UnPv2JYpsrSY2ShbEk7YAeY3tsf6NamD14dp0ed/nwy3NtR3VLFi3hofsfsjCWtNNyKIUklanrr7+erl27cvGnL2bBywsAGHH5CCZPmgzAT3/4UwadNIgz/t8ZXPPlazZfmrm66dOnc+yxx3L44YfTr18/li5dCsDLL7/MiSeeyKGHHkqvXr1Y+MpCbvzOjcz40ww+3ffT3PmzO+trNyWpbFgYS1IZmj59OuPGjWPmzJncOOZGXpz54vu2Oeeic7h3yr1MeHoCa9eu5feTf/8v69evX88VV1zB+PHjmT59OhdeeCEjRowA4LOf/SyXXXYZf/7zn3n22WfpuHdHvvitL9Lr33tx/5P3e95iSTslh1JIUhl6+umnGTBgAC1atKBV61Ycd8px79tm6jNTuX3U7ax9dy1v/eMtPtL1I/Tt13fz+pdeeokXX3yRk046CYCNGzfSqVMnVq1axZIlSxgwYAAAzZo1o3mL5vWyX5JUziyMJalMRcRW161bu47vDPsO9065l04f6MQt37+FdevW/cs2KSW6d+/OH//4x39Z/vbbb5ekvZLU2DmUQpLK0DHHHMMDDzzAu+++yzur3+HJ3z35L+s3FcHt2rdjzeo1TPnNlPfF6Nq1K8uXL99cGK9fv545c+bQpk0bOnfuzIQJEzbHenfNu7Rs1ZI1q9eUdL+085j9ysJaTVI5sDCWpDLUq1cvBg0aRM+ePfniBYWxv9W1aduGgecOZMAxA7hy8JUc3PPg98XYbbfdGD9+PMOGDePQQw+lZ8+ePPvsswDcdddd3HzzzRxyyCEcddRRrFi2ggMOOoBddt2FT/X9lAffSdopOZRCknbA1k6vNmfFnFrH6r5n9x3absSIEYwYMWKrOa78xpVc+Y0r37d8zJgxm+d79uzJU0899b5t9t9/fx5//PHN9zfluO3Xt+1Q2ySpEtljLEmSJGFhLEmSJAEWxpIkSRJQZGEcEXtExPiI+GtEzI2IPhHRPiKmRMS87LZdXo2VpPq0pSvJqXZ8DiU1JsX2GN8EPJJSOhA4FJgLDAceSyntDzyW3ZekRqVZs2asXLnSwq4IKSVWrlxJs2bNGropkrRD6nxWiohoAxwDDAFIKf0T+GdEnA70zTYbCzwJDCumkZJU3zp37szixYtZvnz5Nrd7ffXrtY7dZHnt+iRqm6O28UuZo1mzZnTu3LnW7ZGkhlDM6dr+DVgO3BERhwLTgaHA3imlpQAppaURsVfxzZSk+tW0aVO6dOmy3e3OGntWrWNv7dRveeWobfz6yiFJ5a6YoRS7Ar2An6aUDgPeoRbDJiLikoiYFhHTttcjI0mSJJVaMT3Gi4HFKaXnsvvjKRTGb0REp6y3uBOwbEsPTimNBkYD9O7d20F8jYCX7JQkSZWszj3GKaXXgUUR0TVbdALwF2ASMDhbNhiYWFQLJUmSpHpQ7CWhrwB+GRG7AfOBCygU2/dFxEXAQuDMInNIkiRJJVdUYZxSmgX03sKqE4qJW13V2l/VavsFeSWWJEnSTsUr30mSJElYGEuSJElA8WOMJUmSKpJnY9r52GMsSZIkYWEsSZIkARbGkiRJEmBhLEmSJAEefKcy44EOkiSpodhjLEmSJGFhLEmSJAEWxpIkSRJgYSxJkiQBFsaSJEkSYGEsSZIkARbGkiRJEmBhLEmSJAEWxpIkSRJgYSxJkiQBFsaSJEkSALs2dAMkSZJ2VrNfWdjQTVA19hhLkiRJ2GMs5c7//necz5UkqZwUXRhHxC7ANGBJSql/RLQH7gWqgAXAWSmlfxSbR8qDhdiO87mSJO1s8ugxHgrMBdpk94cDj6WURkbE8Oz+sBzySJKkHFSt/VWttl9QmmZIZaeoMcYR0Rn4BPDf1RafDozN5scCZxSTQ5IkSaoPxfYY3wh8HWhdbdneKaWlACmlpRGxV5E5JNXgMAdJkvJX5x7jiOgPLEspTa/j4y+JiGkRMW358uV1bYYkSZKUi2KGUhwNfDIiFgDjgOMj4m7gjYjoBJDdLtvSg1NKo1NKvVNKvTt27FhEMyRJkqTi1bkwTildlVLqnFKqAs4GHk8pnQtMAgZnmw0GJhbdSkmSJKnESnGBj5HASRExDzgpuy9JkiSVtVwu8JFSehJ4MptfCZyQR1xJkiSpvnhJaEmSJAkvCS1JkqQiVcppRO0xliRJkrAwliRJkgALY0mSJAlwjLGkClYpY94kSfXDHmNJkiQJC2NJkiQJcCgFVWt/VevHLMi/GZIkSWpgO31hXB8sviWVO8djS5KFsSSpQljcSyqWY4wlSZIk7DGWJGmH2SstVTYL4wpR23HMC0rTDEmSpEbLoRSSJEkS9hhLkuqJwxAklTt7jCVJkiQsjCVJkiTAwliSJEkCLIwlSZIkwIPvVAueEk56v/o4oMyD1iSpfthjLEmSJFFEYRwRH4yIJyJibkTMiYih2fL2ETElIuZlt+3ya64kSZJUGsUMpdgAfCWlNCMiWgPTI2IKMAR4LKU0MiKGA8OBYcU3VZIkNRaVMPyutvsA5bkfq+aObOgmNBp17jFOKS1NKc3I5lcBc4EPAKcDY7PNxgJnFNlGSZIkqeRyOfguIqqAw4DngL1TSkuhUDxHxF555JAkSdrEg1JVCkUffBcRrYD7gS+mlN6uxeMuiYhpETFt+fLlxTZDkiRJKkpRhXFENKVQFP8ypfTrbPEbEdEpW98JWLalx6aURqeUeqeUenfs2LGYZkiSJElFK+asFAHcBsxNKf2o2qpJwOBsfjAwse7NkyRJkupHMWOMjwbOA2ZHxKxs2TeAkcB9EXERsBA4s6gWSpIkSfWgzoVxSukZILay+oS6xtXOrRJO7yNJkhonr3wnSZIkYWEsSZIkARbGkiRJEpDTBT4kVR7He0uSdjb2GEuSJEnYY6ydTG17QaH2PaHlmKO28SVJ2hlZGEuSVEZmv7KwoZsg7bQsjCU1GHu+JUnlxDHGkiRJEvYYS5IkNRh/OSsv9hhLkiRJWBhLkiRJgEMpJEmSVKRKGRJiYSxJqpgvtUrgayE1HAtjSVK9sOCTVO4sjCVVrPq4CqEkqXJYGEtSEbwEuCRVDgtjSVJF8BcCScWyMJYkSY2O/wipFDyPsSRJkoSFsSRJkgQ4lEKSpB3mz/dSZStZj3FEnBIRL0XEyxExvFR5JEmSpDyUpDCOiF2AW4BTgYOAz0TEQaXIJUmSJOWhVD3GRwIvp5Tmp5T+CYwDTi9RLkmSJKlopSqMPwAsqnZ/cbZMkiRJKkuRUso/aMSZQL+U0sXZ/fOAI1NKV1Tb5hLgkuxuV+ClWqbZE1iRQ3MbMkcl7IM5yie+OcorRyXsgznKJ745yitHJezDzpxjv5RSxy2tKNVZKRYDH6x2vzPwWvUNUkqjgdF1TRAR01JKvev6+HLIUQn7YI7yiW+O8spRCftgjvKJb47yylEJ+2COLSvVUIrngf0joktE7AacDUwqUS5JkiSpaCXpMU4pbYiIy4HfAbsAt6eU5pQilyRJkpSHkl3gI6X0W+C3pYpPEcMwyihHJeyDOconvjnKK0cl7IM5yie+OcorRyXsgzm2oCQH30mSJEmNTcmufCdJkiQ1JhbGkiRJEhbGkiRJEmBhvFlEHBgRJ0REqxrLT8kxx5ERcUQ2f1BEfDkiPp5X/K3kvLPE8T+W7cfJOcX7aES0yeabR8S3I+I3EfG9iGibU44rI+KD29+yqBy7RcT5EXFidv+ciBgVEZdFRNMc83w4Ir4aETdFxH9FxKV5PU+SpIYTEXs1dBuKFREdGroNtdXoC+OIuCCHGFcCE4ErgBcj4vRqq79bbPwsx9XAzcBPI+IGYBTQChgeESNyyjGpxvQb4FOb7ueUY2q1+c9R2I/WwNURMTyHFLcDa7L5m4C2wPeyZXfkEB/gO8BzEfF0RHwhIrZ49Zsi3QF8AhgaEXcBZwLPAUcA/51Hgux9+zOgWRa3OYUL6/wxIvrmkUPlrRK+OKFxfnlWgohoGxEjI+KvEbEym+Zmy/Yoce6Hc4rTJiJuiIi7IuKcGutuzSnHPhHx04i4JSI6RMQ1ETE7Iu6LiE455WhfY+oATI2IdhHRPqccp1SbbxsRt0XECxHxq4jYO4f4IyNiz2y+d0TMp/Bd+2pEHFts/CzujIj4ZkR8OI94W5RSatQTsDCHGLOBVtl8FTANGJrdn5lTO2dTOKdzC+BtoE22vDnwQk45ZgB3A32BY7Pbpdn8sTnlmFlt/nmgYzbfEpidQ/y51fenxrpZee0DhX8KTwZuA5YDjwCDgdY55Xghu90VeAPYJbsfOb7es6vFbQE8mc1/KMf3bVtgJPBXYGU2zc2W7ZFHju3kfzinOG2AG4C7gHNqrLs1h/j7AD8FbgE6ANdkr899QKec9qF9jakDsABoB7TPKccpNV7724AXgF8Be+eUYySwZzbfG5gPvAy8muPfqRnAN4EP5/2erNbuJ7K/tx8EpgBvZX8TD8spRyvgWmBOFns58CdgSI778TtgGLBPtWX7ZMum5BC/11amw4GlOe3D/dl76gwKFxK7H9h90/sgpxyPUOg4G559HoZlf2evACbmlOM94JUa0/rsdn5OOWZUm/9v4DpgP+BLwIQc4s+uNv8EcEQ2fwAwLad9eAX4IbAQmJq1fd88Ym/OkWewUk3ZG3FL02xgXQ7x/1Ljfqvsg/AjcizGtjSf3c8rR5PsTTIF6Jkty+UDVS3Hnyl8EXeo+UavuV91jP8/wAXZ/B1A72z+AOD5nPahZsHdFPgkcA+wPKccLwK7Zc/VKrLChULv7tyccsyu9gXQDphePX9OOUr6xZnFa/RfnvjFWav3bbX5RvnlmcU8FfgMsAgYmC0/AfhjTjkmAkOAzsCXgW8B+wNjge/mlOOluqyrRfyNwOPZ61xzejenfZhV4/4I4A8UvqPyKoxnVptfuK38ReT4avZ3pEe1Za/kEbtavOqf75rPW9H7QaEDZdds/k811hXdcbaFffh/wK3A69l76pJccuT5pJdqotDj1jP7A119qgJeyyH+42SFZLVluwJ3Ahtz2ofngBbZfJNqy9vm9eGtFrMzhQJzVM0PcQ6xF1Do4Xklu90nW94qpw9WW2AM8L/Zc7Y+y/N74NCc9mHmNtY1zynHl7J2vwpcCTwG/IJCMXt1TjmGUijCRmd/kDb9Q9EReCqnHCX94sziNPovT784a5Wj0X95buf1nlls/CzOn2vcfz67bQL8Nacck4GvU+3XAGBvCv/YPZpD/BeB/beyblFO+zCXat+p2bLBFHraX837tQCuq7Eul/dsFmvTd/ePKAxRzLtjazGFf7K+kn0/RbV1Rf+SSaEjYDJwPIVfzW4EjgG+DdyV0z687+81hV/jTwHuyCNHya58l7MHKQx1mFVzRUQ8mUP884EN1ReklDYA50fEz3OID3BMSmldFvu9asubUvgQ5yaltBg4MyI+QWHYRp6xq7ay6j1gQA7x3wKGRERr4N8o/IOyOKX0RrGxqxm0jfzv5pEgpfTjiLg3m38tOwjyROAXKaWp2370Due4KSIeBboBP0op/TVbvpzCH6M8vBoRXwfGbnoNsrFoQyj0lOVhLvD5lNK8misiIq8cu0dEk02fvZTS9RGxGHiKwj91xap+vEbNA153ySE+KaUfRsQ44MfZ83I1kPKIXc1eEfFlCkN+2kREpOybh/yOSbkF+G1EjAQeiYgbgV9T6G2dlVOOzVJKTwNPR8QVwEkUPv/FXiVrbXbAcVsgRcQZKaUJ2TjKjUXG3uSdiPhYSumZiDgN+DsUvj8iInLKMYjCrxy/zz7XiUJH1CTgrBziX8PW3zdX5BAf4DcUCrFHNy1IKY2NiDeAn+SUY2JEtEoprU4pfXPTwoj4CPBSTjmqf3efRuGX3xZ5xc78gkLBDYVfHvYElkfEPuTw2Usp/SQiZgP/QeEXoF2z2wkUfn3Kw9+2kHcjhU6DR3LJkOd/I05OTpU1URii8T0KvXx/z6a52bJ2OeUYCHTdyrozcsrxfeDELSw/BZiXQ/xryY5TqLH8I8D4Erwup1EYb/p6znGvrjFtOoZgH+DOHPP0Be6lMN5/NvBb4BKynuQc4o/L+zmvEf9QCsOMHgYOpHCg8JsUeimPyinHIRSGbLwJPAMckC3vCFyZ474cSOGf9lY1lp+SY/wTShV/OzlOrYccJdkPCscfHVyPz1UlvN757ENeDXVyctq5JrKhG+ZomPg1vjgb/fNUKTka0z5QGOb1EoUevQXA6dXW5THEqKTxszhXVEiORv9cVcI+pGRh7OTkVMeJnMevV2qOStgHc5RP/DxzUOIzMpU6vjnKK0cl7ENKjWeMsaQGEBEvbG0VhYN0zFEP8c1RXjkqYR8yu6SUVgOklBZk5z8fHxH7ZXnKPb45yitHJeyDhbGkbdob6Af8o8byAJ41R73FN0d55aiEfQB4PSJ6puzA9pTS6ojoT+FCSz0aQXxzlFeOStgHC2NJ21TqM8JUSo5K2AdzlE/8+spR6jMy1ccZn8xRPjkqYR8K57CTJEmSdnZ5nZdSkiRJatQsjCVJkiQsjCVJkiTAwliSGlREDImIfavdXxARe9YxVjGPza0dktRYWRhLUsMaAuy7vY3qwRDKox2S1GAsjCUpRxFRFRF/jYixEfFCRIyPiBYR8Z8R8XxEvBgRo6NgINAb+GVEzIqI5lmYKyJiRkTMjogDt5GrQ0RMjoiZ2amKotq6cyNiahb35xGxS7Z8dUT8Vxb/sYjoWGw7JKlSWBhLUv66AqNTSocAbwNfAEallI5IKR0MNAf6p5TGU7ik6WdTSj1TSu9mj1+RUuoF/BT46jbyXA08k1I6DJgEfAggIroBg4CjU0o9gY3AZ7PHtARmZPF/D1ydQzskqSJYGEtS/hallP6Qzd8NfAw4LiKei4jZwPFA9208/tfZ7XSgahvbHZPFJ6X0EP93lbQTgMOB5yNiVnb/37J17wH31mhbse2QpIrgle8kKX81r5yUgFuB3imlRRFxDdBsG49fl91uZPt/p7d0laYAxqaUrqpDW+vaDklq9OwxlqT8fSgi+mTznwGeyeZXREQrYGC1bVcBreuY5ymyIRIRcSrQLlv+GDAwIvbK1rWPiP2ydU2q5T+nWtuKaYckVQR7ACQpf3OBwdkBcfMojNFtB8wGFgDPV9t2DPCziHgX6EPtfBu4JyJmUBgvvBAgpfSXiPgmMDkimgDrgcuAV4F3gO4RMR14i8JY5GLbIUkVIVLa1q9okqTaiIgq4MHsILuyExGrU0qtGrodklSOHEohSZIkYY+xJJW9iLgAGFpj8R9SSpc1RHskqVJZGEuSJEk4lEKSJEkCLIwlSZIkwMJYkiRJAiyMJUmSJMDCWJIkSQLg/wMV770Jykyn0AAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "path_depth = File.path_depth()\n", "\n", "select_path_depths = (sa.select(path_depth,\n", " treedb.Languoid.level, sa.func.count().label('n_files'))\n", " .join_from(File, treedb.Languoid, File.glottocode == treedb.Languoid.id)\n", " .group_by(path_depth, treedb.Languoid.level)\n", " .order_by('path_depth', 'level'))\n", "\n", "_ = (read_sql(select_path_depths, index_col=['path_depth', 'level'])\n", " .unstack(fill_value=0).droplevel(0, axis='columns')[list(treedb.LEVEL)])\n", "\n", "_.plot.bar(stacked=True, figsize=(12, 3))\n", "\n", "(100 * _.div(_.sum(axis='columns'), axis='rows')).plot.bar(stacked=True, figsize=(12, 3));" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT _file.size AS file_size, count(*) AS n_files \n", "FROM _file GROUP BY _file.size ORDER BY file_size\n", "[generated in 0.00106s] ()\n", "ROLLBACK\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countminmax
file_size3286.065.047175.0
\n", "
" ], "text/plain": [ " count min max\n", "file_size 3286.0 65.0 47175.0" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "file_size = File.size.label('file_size')\n", "\n", "select_file_sizes = (sa.select(file_size, sa.func.count().label('n_files'))\n", " .group_by(file_size)\n", " .order_by('file_size'))\n", "\n", "_ = read_sql(select_file_sizes, index_col='file_size')\n", "\n", "(_.plot.area(figsize=(12, 3), logx=True)\n", " .xaxis.set_major_formatter(mpl.ticker.ScalarFormatter()))\n", "(_.index.to_series().describe()\n", " .to_frame().transpose()[['count', 'min', 'max']])" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT file_nvalues.n_values, count(*) AS n_files \n", "FROM (SELECT _file.glottocode AS glottocode, count(DISTINCT _value.option_id) AS n_values \n", "FROM _file JOIN _value ON _file.id = _value.file_id GROUP BY _file.glottocode) AS file_nvalues GROUP BY file_nvalues.n_values ORDER BY file_nvalues.n_values\n", "[generated in 0.00080s] ()\n", "ROLLBACK\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countminmax
n_values36.02.037.0
\n", "
" ], "text/plain": [ " count min max\n", "n_values 36.0 2.0 37.0" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "file_nvalues = (sa.select(File.glottocode,\n", " sa.func.count(Value.option_id.distinct()).label('n_values'))\n", " .join_from(File, Value)\n", " .group_by(File.glottocode)\n", " .alias('file_nvalues')\n", " .c.n_values)\n", "\n", "select_nvalues = (sa.select(file_nvalues, sa.func.count().label('n_files'))\n", " .group_by(file_nvalues)\n", " .order_by(file_nvalues))\n", "\n", "_ = read_sql(select_nvalues, index_col='n_values')\n", "\n", "_.plot.bar(figsize=(12, 3))\n", "(_.index.to_series().describe()\n", " .to_frame().transpose()[['count', 'min', 'max']])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT length(_value.value) AS value_length, count(*) AS n_values \n", "FROM _value GROUP BY length(_value.value) ORDER BY value_length\n", "[generated in 0.00092s] ()\n", "ROLLBACK\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countminmax
value_length633.01.06215.0
\n", "
" ], "text/plain": [ " count min max\n", "value_length 633.0 1.0 6215.0" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "value_length = sa.func.length(Value.value).label('value_length')\n", "\n", "select_value_length = (sa.select(value_length, sa.func.count().label('n_values'))\n", " .group_by(value_length)\n", " .order_by('value_length'))\n", "\n", "_ = read_sql(select_value_length, index_col='value_length')\n", "\n", "(_.plot.area(figsize=(12, 3), logx=True)\n", " .xaxis.set_major_formatter(mpl.ticker.ScalarFormatter()))\n", "(_.index.to_series().describe()\n", " .to_frame().transpose()[['count', 'min', 'max']])" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[INFO@treedb.raw.export] fetch statistics\n", "BEGIN (implicit)\n", "SELECT _option.section, _option.option, count(*) AS n \n", "FROM _option JOIN _value ON _option.id = _value.option_id GROUP BY _option.section, _option.option ORDER BY _option.defined DESC, _option.ord_section, _option.ord_option, _option.section, n DESC, _option.option\n", "[generated in 0.00075s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "core name 26,285\n", "core hid 8,858\n", "core level 26,285\n", "core iso639-3 8,130\n", "core latitude 8,755\n", "core longitude 8,755\n", "core macroareas 21,616\n", "core countries 11,463\n", "core name_comment 14\n", "core comment 1\n", "core location 1\n", "core name_pronunciation 1\n", "core speakers 1\n", "core links 29,722\n", "core timespan 199\n", "sources glottolog 197,791\n", "altnames multitree 54,501\n", "altnames hhbib_lgcode 34,996\n", "altnames lexvo 26,027\n", "altnames elcat 24,422\n", "altnames aiatsis 6,542\n", "altnames wals 2,442\n", "altnames wals other 2,097\n", "altnames moseley & asher (1994) 2,089\n", "altnames ruhlen (1987) 2,007\n", "altnames glottolog 1,742\n", "altnames ethnologue 3\n", "triggers lgcode 30,071\n", "triggers inlg 187\n", "identifier multitree 14,849\n", "identifier endangeredlanguages 3,596\n", "identifier wals 2,620\n", "identifier languagelandscape 337\n", "classification sub 11,816\n", "classification subrefs 16,613\n", "classification family 210\n", "classification familyrefs 708\n", "endangerment status 8,345\n", "endangerment source 8,345\n", "endangerment date 8,345\n", "endangerment comment 8,345\n", "hh_ethnologue_comment isohid 613\n", "hh_ethnologue_comment comment_type 613\n", "hh_ethnologue_comment ethnologue_versions 613\n", "hh_ethnologue_comment comment 613\n", "iso_retirement code 358\n", "iso_retirement name 358\n", "iso_retirement change_request 349\n", "iso_retirement effective 358\n", "iso_retirement reason 358\n", "iso_retirement change_to 451\n", "iso_retirement remedy 327\n", "iso_retirement comment 232\n", "CPU times: total: 766 ms\n", "Wall time: 744 ms\n" ] } ], "source": [ "%time treedb.raw.print_stats()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## languoid" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 2.673s ago] ('table', 'languoid')\n", "SELECT count(*) AS n_rows \n", "FROM languoid\n", "[generated in 0.00046s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE languoid (\n", "\tid VARCHAR(8) NOT NULL CHECK (length(id) = 8), \n", "\tname VARCHAR NOT NULL CHECK (name != ''), \n", "\tlevel VARCHAR NOT NULL, \n", "\tparent_id VARCHAR(8), \n", "\thid TEXT CHECK (length(hid) >= 3), \n", "\tiso639_3 VARCHAR(3) CHECK (length(iso639_3) = 3), \n", "\tlatitude FLOAT CHECK (latitude BETWEEN -90 AND 90), \n", "\tlongitude FLOAT CHECK (longitude BETWEEN -180 AND 180), \n", "\tPRIMARY KEY (id), \n", "\tCHECK ((latitude IS NULL) = (longitude IS NULL)), \n", "\tUNIQUE (name), \n", "\tFOREIGN KEY(level) REFERENCES languoidlevel (name), \n", "\tFOREIGN KEY(parent_id) REFERENCES languoid (id) DEFERRABLE INITIALLY DEFERRED, \n", "\tUNIQUE (hid), \n", "\tUNIQUE (iso639_3)\n", ") WITHOUT ROWID\n", "26285\n" ] } ], "source": [ "from treedb import Languoid\n", "\n", "print_sql(Languoid)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 2.69s ago] ('table', 'languoidlevel')\n", "SELECT count(*) AS n_rows \n", "FROM languoidlevel\n", "[generated in 0.00037s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE languoidlevel (\n", "\tname VARCHAR NOT NULL CHECK (name != ''), \n", "\tdescription TEXT NOT NULL CHECK (description != ''), \n", "\tordinal INTEGER NOT NULL CHECK (ordinal >= 1), \n", "\tPRIMARY KEY (name)\n", ") WITHOUT ROWID\n", "3\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoidlevel.name, languoidlevel.description, languoidlevel.ordinal \n", "FROM languoidlevel ORDER BY languoidlevel.ordinal\n", "[generated in 0.00069s] ()\n", "ROLLBACK\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", "
descriptionordinal
name
familysub-grouping of languoids above the language l...1
languagedefined by mutual non-intellegibility2
dialectany variety which is not a language3
\n", "
" ], "text/plain": [ " description ordinal\n", "name \n", "family sub-grouping of languoids above the language l... 1\n", "language defined by mutual non-intellegibility 2\n", "dialect any variety which is not a language 3" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from treedb import LEVEL\n", "from treedb.models import LanguoidLevel\n", "\n", "FAMILY, LANGUAGE, DIALECT = LEVEL\n", "\n", "print_sql(LanguoidLevel)\n", "read_sql(sa.select(LanguoidLevel).order_by('ordinal'), index_col='name')" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 2.724s ago] ('table', 'pseudofamily')\n", "SELECT count(*) AS n_rows \n", "FROM pseudofamily\n", "[generated in 0.00041s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE pseudofamily (\n", "\tlanguoid_id VARCHAR(8) NOT NULL, \n", "\tname VARCHAR NOT NULL, \n", "\tconfig_section VARCHAR NOT NULL CHECK (config_section != ''), \n", "\tdescription TEXT CHECK (description != ''), \n", "\tbookkeeping BOOLEAN CHECK (bookkeeping = 1), \n", "\tPRIMARY KEY (languoid_id), \n", "\tFOREIGN KEY(languoid_id) REFERENCES languoid (id), \n", "\tUNIQUE (name), \n", "\tFOREIGN KEY(name) REFERENCES languoid (name), \n", "\tUNIQUE (config_section), \n", "\tUNIQUE (bookkeeping)\n", ") WITHOUT ROWID\n", "8\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT pseudofamily.languoid_id, pseudofamily.name, pseudofamily.config_section, pseudofamily.description, pseudofamily.bookkeeping \n", "FROM pseudofamily ORDER BY pseudofamily.name\n", "[generated in 0.00057s] ()\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
languoid_idnamedescriptionbookkeeping
config_section
artificial_languagearti1236Artificial LanguageA language known to have been created by consc...None
bookkeepingbook1242BookkeepingAn alleged language that has been replaced wit...True
mixed_languagemixe1287Mixed LanguageNoneNone
pidginpidg1258PidginA language used for interethnic communication ...None
sign_languagesign1238Sign LanguageA language with visible manual signs as the mo...None
speech_registerspee1234Speech RegisterA language not used by a community of speakers...None
unattestedunat1236UnattestedA language arguably different from all other e...None
unclassifiableuncl1493UnclassifiableA language arguably different from all other e...None
\n", "
" ], "text/plain": [ " languoid_id name \\\n", "config_section \n", "artificial_language arti1236 Artificial Language \n", "bookkeeping book1242 Bookkeeping \n", "mixed_language mixe1287 Mixed Language \n", "pidgin pidg1258 Pidgin \n", "sign_language sign1238 Sign Language \n", "speech_register spee1234 Speech Register \n", "unattested unat1236 Unattested \n", "unclassifiable uncl1493 Unclassifiable \n", "\n", " description \\\n", "config_section \n", "artificial_language A language known to have been created by consc... \n", "bookkeeping An alleged language that has been replaced wit... \n", "mixed_language None \n", "pidgin A language used for interethnic communication ... \n", "sign_language A language with visible manual signs as the mo... \n", "speech_register A language not used by a community of speakers... \n", "unattested A language arguably different from all other e... \n", "unclassifiable A language arguably different from all other e... \n", "\n", " bookkeeping \n", "config_section \n", "artificial_language None \n", "bookkeeping True \n", "mixed_language None \n", "pidgin None \n", "sign_language None \n", "speech_register None \n", "unattested None \n", "unclassifiable None " ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from treedb.models import PseudoFamily\n", "\n", "print_sql(PseudoFamily)\n", "read_sql(sa.select(PseudoFamily).order_by('name'), index_col='config_section')" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "WITH RECURSIVE tree(parent_id, child_id) AS \n", "(SELECT root.id AS parent_id, root.id AS child_id \n", "FROM languoid AS root \n", "WHERE root.parent_id IS NULL UNION ALL SELECT tree.parent_id AS parent_id, child.id AS child_id \n", "FROM tree JOIN languoid AS child ON tree.child_id = child.parent_id)\n", " SELECT ? AS kind, count(*) AS n \n", "FROM languoid UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM languoid \n", "WHERE languoid.level = ? AND languoid.parent_id IS NULL UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM languoid \n", "WHERE languoid.level = ? AND languoid.parent_id IS NULL UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM languoid \n", "WHERE languoid.parent_id IS NULL UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM languoid \n", "WHERE languoid.level = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM languoid \n", "WHERE languoid.level = ? AND languoid.parent_id IS NOT NULL UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM languoid \n", "WHERE languoid.level = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND (root.name NOT IN (?, ?, ?, ?, ?, ?, ?, ?)) UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name != ? UNION ALL SELECT ? AS kind, count(*) AS n \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? AND root.name = ?\n", "[generated in 0.00094s] ('languoids', 'families', 'family', 'isolates', 'language', 'roots', 'languages', 'language', 'subfamilies', 'family', 'dialects', 'dialect', 'Spoken L1 Languages', 'language', 'Sign Language', 'Unclassifiable', 'Pidgin', 'Unattested', 'Artificial Language', 'Mixed Language', 'Speech Register', 'Bookkeeping', 'Sign Language', 'language', 'Sign Language', 'Unclassifiable', 'language', 'Unclassifiable', 'Pidgin', 'language', 'Pidgin', 'Unattested', 'language', 'Unattested', 'Artificial Language', 'language', 'Artificial Language', 'Mixed Language', 'language', 'Mixed Language', 'Speech Register', 'language', 'Speech Register', 'All', 'language', 'Bookkeeping', 'Bookkeeping', 'language', 'Bookkeeping')\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "26,285 languoids\n", " 245 families\n", " 182 isolates\n", " 427 roots\n", " 8,565 languages\n", " 4,388 subfamilies\n", "13,087 dialects\n", " 7,628 Spoken L1 Languages\n", " 215 Sign Language\n", " 121 Unclassifiable\n", " 84 Pidgin\n", " 68 Unattested\n", " 32 Artificial Language\n", " 10 Mixed Language\n", " 15 Speech Register\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 8,173 All\n", " 392 Bookkeeping\n", "CPU times: total: 375 ms\n", "Wall time: 369 ms\n" ] } ], "source": [ "%time treedb.print_languoid_stats()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid.id, languoid.name, languoid.level, languoid.parent_id, languoid.hid, languoid.iso639_3, languoid.latitude, languoid.longitude \n", "FROM languoid\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00084s] (5, 0)\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namelevelparent_idhidiso639_3latitudelongitude
id
3adt12343Ad-Teklesdialectnort3292NoneNoneNaNNaN
aala1237Aalawadialectramo1244NoneNoneNaNNaN
aant1238Aantantaradialectnort2920NoneNoneNaNNaN
aari1238Aari-Gayilfamilyahkk1235aizaizNaNNaN
aari1239Aarilanguageaari1238aiwaiw5.9503436.5721
\n", "
" ], "text/plain": [ " name level parent_id hid iso639_3 latitude longitude\n", "id \n", "3adt1234 3Ad-Tekles dialect nort3292 None None NaN NaN\n", "aala1237 Aalawa dialect ramo1244 None None NaN NaN\n", "aant1238 Aantantara dialect nort2920 None None NaN NaN\n", "aari1238 Aari-Gayil family ahkk1235 aiz aiz NaN NaN\n", "aari1239 Aari language aari1238 aiw aiw 5.95034 36.5721" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_sql(sa.select(Languoid).limit(5), index_col='id')" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid.id, languoid.name, languoid.level, languoid.parent_id, languoid.hid, languoid.iso639_3, languoid.latitude, languoid.longitude \n", "FROM languoid ORDER BY languoid.id\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00062s] (5, 0)\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namelevelparent_idhidiso639_3latitudelongitude
id
3adt12343Ad-Teklesdialectnort3292NoneNoneNaNNaN
aala1237Aalawadialectramo1244NoneNoneNaNNaN
aant1238Aantantaradialectnort2920NoneNoneNaNNaN
aari1238Aari-Gayilfamilyahkk1235aizaizNaNNaN
aari1239Aarilanguageaari1238aiwaiw5.9503436.5721
\n", "
" ], "text/plain": [ " name level parent_id hid iso639_3 latitude longitude\n", "id \n", "3adt1234 3Ad-Tekles dialect nort3292 None None NaN NaN\n", "aala1237 Aalawa dialect ramo1244 None None NaN NaN\n", "aant1238 Aantantara dialect nort2920 None None NaN NaN\n", "aari1238 Aari-Gayil family ahkk1235 aiz aiz NaN NaN\n", "aari1239 Aari language aari1238 aiw aiw 5.95034 36.5721" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_sql(sa.select(Languoid).order_by('id').limit(5), index_col='id')" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid.id, languoid.name, languoid.level, languoid.parent_id, languoid.hid, languoid.iso639_3, languoid.latitude, languoid.longitude \n", "FROM languoid ORDER BY languoid.name\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00085s] (5, 0)\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namelevelparent_idhidiso639_3latitudelongitude
id
gane1238!Gã!nelanguageeast2867NOCODE_GaneNone-31.320028.7500
oung1238!O!unglanguagebook1242ounoun-15.300014.3500
kwii1241!Uifamilytuuu1241NoneNoneNaNNaN
abda1238'Abd Al-Kuridialectsoqo1240NoneNone12.195952.2282
aden1242'Adendialectjude1267NoneNoneNaNNaN
\n", "
" ], "text/plain": [ " name level parent_id hid iso639_3 latitude \\\n", "id \n", "gane1238 !Gã!ne language east2867 NOCODE_Gane None -31.3200 \n", "oung1238 !O!ung language book1242 oun oun -15.3000 \n", "kwii1241 !Ui family tuuu1241 None None NaN \n", "abda1238 'Abd Al-Kuri dialect soqo1240 None None 12.1959 \n", "aden1242 'Aden dialect jude1267 None None NaN \n", "\n", " longitude \n", "id \n", "gane1238 28.7500 \n", "oung1238 14.3500 \n", "kwii1241 NaN \n", "abda1238 52.2282 \n", "aden1242 NaN " ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_sql(sa.select(Languoid).order_by('name').limit(5), index_col='id')" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT child.level AS child_level, parent.level AS parent_level, count(*) AS n_languoids \n", "FROM languoid AS child LEFT OUTER JOIN languoid AS parent ON child.parent_id = parent.id GROUP BY child.level, parent.level ORDER BY child_level, parent_level\n", "[generated in 0.00091s] ()\n", "ROLLBACK\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", " \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_languoidsall
parent_levelNaNdialectfamilylanguage
child_level
dialect0231001077713087
family2450438804633
language1820838308565
all4272310127711077726285
\n", "
" ], "text/plain": [ " n_languoids all\n", "parent_level NaN dialect family language \n", "child_level \n", "dialect 0 2310 0 10777 13087\n", "family 245 0 4388 0 4633\n", "language 182 0 8383 0 8565\n", "all 427 2310 12771 10777 26285" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Child, Parent = (sa.orm.aliased(Languoid, name=n) for n in ('child', 'parent'))\n", "\n", "select_parent_levels = (sa.select(Child.level.label('child_level'),\n", " Parent.level.label('parent_level'),\n", " sa.func.count().label('n_languoids'))\n", " .outerjoin_from(Child, Parent, Child.parent_id == Parent.id)\n", " .group_by(Child.level, Parent.level)\n", " .order_by('child_level', 'parent_level'))\n", "\n", "(read_sql(select_parent_levels, index_col=['child_level', 'parent_level'])\n", " .unstack(fill_value=0).assign(all=lambda x: x.sum(axis='columns'))\n", " .pipe(lambda x: pd.concat([x, x.sum().rename('all').to_frame().T.rename_axis('child_level')])))" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid.level AS level, count(*) AS n_languoids, count(languoid.iso639_3) AS n_isos \n", "FROM languoid GROUP BY languoid.level ORDER BY level\n", "[generated in 0.00076s] ()\n", "ROLLBACK\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", " \n", " \n", " \n", "
n_languoidsn_isosratio
level
dialect130872491.902651
family4633440.949709
language8565783791.500292
\n", "
" ], "text/plain": [ " n_languoids n_isos ratio\n", "level \n", "dialect 13087 249 1.902651\n", "family 4633 44 0.949709\n", "language 8565 7837 91.500292" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "select_lang_nisos = (sa.select(Languoid.level.label('level'),\n", " sa.func.count().label('n_languoids'),\n", " sa.func.count(Languoid.iso639_3).label('n_isos'))\n", " .group_by(Languoid.level)\n", " .order_by('level'))\n", "\n", "(read_sql(select_lang_nisos, index_col='level')\n", " .assign(ratio=lambda x: 100 * x['n_isos'] / x['n_languoids']))" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid.level AS level, count(*) AS n_languoids, count(languoid.latitude) AS n_locations \n", "FROM languoid GROUP BY languoid.level ORDER BY level\n", "[generated in 0.00110s] ()\n", "ROLLBACK\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", " \n", " \n", " \n", "
n_languoidsn_locationsratio
level
dialect130874873.721250
family4633280.604360
language8565824096.205487
\n", "
" ], "text/plain": [ " n_languoids n_locations ratio\n", "level \n", "dialect 13087 487 3.721250\n", "family 4633 28 0.604360\n", "language 8565 8240 96.205487" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "select_lang_nlocations = (sa.select(Languoid.level.label('level'),\n", " sa.func.count().label('n_languoids'),\n", " sa.func.count(Languoid.latitude).label('n_locations'))\n", " .group_by(Languoid.level)\n", " .order_by('level'))\n", "\n", "(read_sql(select_lang_nlocations, index_col='level')\n", " .assign(ratio=lambda x: 100 * x['n_locations'] / x['n_languoids']))" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid.latitude, languoid.longitude \n", "FROM languoid \n", "WHERE languoid.level = ?\n", "[generated in 0.00092s] ('language',)\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "select_latlon = (sa.select(Languoid.latitude, Languoid.longitude)\n", " .select_from(Languoid)\n", " .filter_by(level=LANGUAGE))\n", "\n", "latitudes, longitudes = zip(*treedb.iterrows(select_latlon))\n", " \n", "plt.figure(figsize=(12, 6))\n", "plt.axis([-180, 180, -90, 90])\n", "plt.xticks(range(-180, 181, 60))\n", "plt.yticks(range(-90, 91, 30))\n", "plt.scatter(longitudes, latitudes, 1, 'black');" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "WITH RECURSIVE tree(parent_id, child_id) AS \n", "(SELECT root.id AS parent_id, child.id AS child_id \n", "FROM languoid AS root LEFT OUTER JOIN languoid AS child ON root.id = child.parent_id \n", "WHERE root.parent_id IS NULL AND root.level = ? UNION ALL SELECT tree.parent_id AS parent_id, child.id AS child_id \n", "FROM tree JOIN languoid AS child ON tree.child_id = child.parent_id)\n", " SELECT root.id AS family_id, count(child.id) AS n_languages \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id LEFT OUTER JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? GROUP BY root.id \n", "HAVING count(child.id) >= ? ORDER BY n_languages\n", "[generated in 0.00077s] ('family', 'language', 100)\n", "ROLLBACK\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAD4CAYAAAC5S3KDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAqaElEQVR4nO3debxVdb3/8dfbwySKgiBKah5UckIERdQyRTEjcywV/VmBA+Q8XUsbrtOtHG96S8twpBzSKEyxTC8OqIkKchgUFRVSlCsqDhCKDJ/fH+u7YXs4wz7jXkfez8djP87a3zXs7zoCH79rrf19KyIwMzPLm3XK3QEzM7OauECZmVkuuUCZmVkuuUCZmVkuuUCZmVkutSt3Bz5PevToEZWVleXuhplZmzJlypR3I2Lj6u0uUM2osrKSyZMnl7sbZmZtiqR/1dTuS3xmZpZLLlBmZpZLLlBmZpZLvgfVjGa8+SGV599f7m6YmbWquZd9s0WOm9sRlKQfV3u/uIR9bpa0QNLMau1XSnpR0nRJ4yR1Te3HSqoqeq2U1D+tO0bSjLTPA5J6NN/ZmZlZfXJboIAf17/JGm4FhtbQ/hDQNyL6AS8DPwKIiNsjon9E9Ae+C8yNiCpJ7YD/AfZN+0wHTmtEf8zMrJFyUaAk3SNpiqTnJY2SdBmwbhrV3F5t2/UlTZD0XBrhHFpYFxETgYXVjx8RD0bE8vR2ErB5Dd04Briz8DHptZ4kARsAbzX5RM3MrGR5uQd1fEQslLQu8CywD3BaGtlU9wlweER8lC67TZJ0b5SeG3I8cFcN7cOAQwEiYpmkk4EZwL+B2cCpNR1M0ihgFEDFBmt8z8zMzBopFyMo4AxJ08hGN1sAferYVsAvJE0H/hfYDNiklA+R9BNgOVB9VLY7sCQiZqb37YGTgQHAF8gu8f2opmNGxOiIGBgRAys6b1hKN8zMrARlH0FJGgzsD+wZEUskPQp0qmOXY4GNgV3TSGduPdsXPmc4cBAwpIbR1tGsvrwH0B8gIl5N+94NnF//2ZiZWXMpe4ECNgTeT8VpO2CP1L5MUvuIWFbD9gtScdoX2LK+D5A0FDgP2CcillRbtw5wJLB3UfObwA6SNo6Id4CvAbMac3JmZtY4ebjE9wDQLl2y+y+yy3wAo4Hp1R+SILs8N1DSZLLR1IuFFZLuBJ4CtpU0T9IJadW1QBfgofTgxfVFx9sbmBcRrxUaIuIt4GJgYupXf+AXzXK2ZmZWEpX+bIHVZ+DAgeHJYs3MGkbSlIgYWL09DyMoMzOzNbhAmZlZLrlAmZlZLrlAmZlZLrlAmZlZLrlAmZlZLrlAmZlZLrlAmZlZLuVhqqPPDSfqmlm5tFSqbTm12RGUpP6SDix6v52kpyQtlXRuUXsnSc9Impbypi4uWreRpIckzU4/u6X2WpN2zcysdbTZAkU2P96BRe8XAmcAV1XbbimwX0TsnPYZKqkwIe35wISI6ANMSO9rTdptmdMwM7OalK1AVU/RTW2Li9YfIenWtHykpJlpFDRRUgfgEmBYGuEMi4gFEfEs8JnZzyNTOG779CpMQHgoMCYtjwEOq6GrxUm7ZmbWSsp5D+ozKbqS/lzHthcAX4+INyV1jYhPJV0ADIyI0+r7IEkVwBRgG+C6iHg6rdokIuYDRMR8ST1r2H1V0q6ZmbWecl7ia0iK7pPArZJGAhUN/aCIWJEu120ODJLUt5T9qift1rLNKEmTJU1eseTDhnbNzMxqUZYCVS1Fd2dgKlkqbnH2x6qU3Ig4CfgpWSGrktS9MZ8bER8AjwJDU9PbknqlPvUCFlTbpXrSbk3HdOS7mVkLKNcIqrYU3bclbZ9Sbg8vbCxp64h4OiIuAN4lK1SLyEII6yRpY0ld0/K6ZIWxEHJ4LzA8LQ8H/lq0XyFp94+NPkszM2u0ct2DegA4KaXVvsTqFN3zgfHAG8BMYP3UfqWkPoDInrabBrwOnC+pCrgUeAyYDGwArJR0FrAD0AsYk+5DrQPcHRHj03EvA+5OybuvkxWkgjWSds3MrPU4UbcZOVHXzKzhnKhrZmZtiguUmZnlkguUmZnlkguUmZnlkguUmZnlkguUmZnlkguUmZnlkguUmZnlkhN1m5ETda3Y5zHh1Kw1lTMP6p8N3H6wpPH1bNOYVN0jU9tKSQOL2jtIukXSjLTf4Ib018zMmqZsI6iI+HILHLaQqntYtfZCqu5iSe2BJyT9PSImkc359y3gd9X2GZn6uVPKifq7pN0iYmUL9NvMzKop5whqcfo5WNKjksZKelHS7ZKU1g1NbU+QFZHCvhulRN7pkiZJ6gfQmFTdiJgVES/V0MUdyCamJSIWAB8Aa8wVZWZmLSMvD0kMAM4iKwpbAV+R1Am4ATgY+CqwadH2FwNTI6If8GPg9/V9gKSKNPP5AuCholTd2kwDDpXUTlJvYFeymA8zM2sFeSlQz0TEvHT5rAqoBLYD5kTE7MimXL+taPu9gD8ARMTDQHdJdaYFNiJV92ZgHlmExzXAP4Hl1Tdyoq6ZWcvIy1N8S4uWV7C6X7VlgaiGtpJyQyLiA0mPkqXq1hrlHhHLgbNXfWD2UMfsGrYbDYwG6Nirj7NLzMyaSV5GUDV5Eegtaev0/piidROBY2FVfPy7EfFRbQeqJ1W3tn06S1ovLX8NWB4RLzTqTMzMrMHyMoJaQ0R8ImkUcL+kd4EngMJluYuAW1Ii7xJSbLukTWlgqq6kw4FfAxunz6qKiK8DPYF/SFoJvAl8t+XP2szMCpyo24ycqGtm1nBO1DUzszbFBcrMzHLJBcrMzHLJBcrMzHLJBcrMzHLJBcrMzHLJBcrMzHLJBcrMzHIptzNJtEVO1G37nIJrlh8eQZmZWS7lqkBJulHSDo3cd29Jz0laLumIovb+KQb++RRwOKyGfX9dCFBM7wdL+lBSVXpd0LgzMjOzxsrVJb6IOLEJu78OjADOrda+BPheRMyW9AVgiqR/RMQHAJIGAl1rON7jEXFQE/pjZmZNUM7I9/Uk3S9pmqSZkoal6PeBaf1iST9P6ydJ2iS1bylpQhoNTZD0RYCImBsR04GVxZ8TES9HxOy0/BZZou7G6VgVwJXAD1vtxM3MrCTlvMQ3FHgrInaOiL7AA9XWrwdMioidyfKfRqb2a4Hfp7j324FflfqBkgYBHYBXU9NpwL0RMb+GzfdMxfHvknas45hO1DUzawHlLFAzgP0lXS7pqxFR/V/3T4HxaXkKWQw8wJ7AHWn5D2Tx7/WS1Cttf1xErEyX+44ky4Kq7jlgy1Qcfw3cU9txI2J0RAyMiIEVnetMnTczswYoW4GKiJeBXckK1aU1PIiwLFaHVRXHwK9xqPo+S9IGwP3ATyNiUmoeAGwDvCJpLtBZ0iupbx9FxOK0/DegvaQeJZ+cmZk1WTnvQX0BWBIRtwFXAbuUuOs/gaPT8rFkSbt1fU4HYBzZZcE/Fdoj4v6I2DQiKiOiMvVlm7TPppKUlgeR/Z7eK/nkzMysycr5FN9OwJUpUn0ZcDJZoarPGcDNkn4AvAMcByBpN7JC1A04WNLFEbEjcBSwN9Bd0oh0jBERUVXHZxwBnCxpOfAxcHTRaK72E9psQyb7i55mZs3Cke/NyJHvZmYN58h3MzNrU1ygzMwsl1ygzMwsl1ygzMwsl1ygzMwsl1ygzMwsl1ygzMwsl3IVt9HWOVG35Tnx1mzt4RGUmZnlUqsWKEmVkmY2w3Hm1jR5q6SbJS2o/hmSrpT0YsqQGiepa7X1X0z5U+em951TVtWLKYn3sqb22czMGubzNoK6lSxnqrqHgL4pQ+pl4EfV1l8N/L1a21URsR3ZrOdfkfSNZu6rmZnVoRwFqp2kMWk0MzaNVoZImippRhoFdQSorb1A0rqSHpA0EiAiJgILq39gRDwYEcvT20nA5kXHOAx4DXi+aPslEfFIWv6ULB9q1T5mZtbyylGgtgVGp9HMR8A5ZCOfYRGxE9mDGydL6lRTe9Fx1gfuA+6IiBsa8PnHk0ZLktYDzgMurm3jdDnwYGBCLeudqGtm1gLKUaDeiIgn0/JtwBBgTgowBBhDFo+xbS3tBX8FbomI35f6wZJ+Aiwni4qHrDBdXQgnrGH7dsCdwK8i4rWatnGirplZyyjHY+al5nuonvVPAt+QdEcpWU2ShgMHAUOKtt8dOELSFUBXYKWkTyLi2rR+NDA7Iq4psc9mZtZMyjGC+qKkPdPyMcD/ApWStklt3wUeA16spb3gArKU29/U94GShpJdyjskIpYU2iPiq0WJutcAvygUJ0k/AzYEzmrEOZqZWRO1amChpErgb8BE4MvAbLLCsydZmm474Fng5IhYKmlILe1zgYFkBepm4J2I+KGkO4HBQA/gbeDCiLhJ0itAR1bHtk+KiJOq9e0iYHFEXCVpc+ANsiK5NG1ybUTcWNf5ObDQzKzhagssdKJuM3KBMjNrOCfqmplZm+ICZWZmuVTnU3ySvlXX+oj4S/N2x8zMLFPfY+YHp589yR5qeDi93xd4FHCBMjOzFlFngYqI4wAkjQd2iIj56X0v4LqW756Zma2tSr0HVVkoTsnbwJdaoD9mZmZA6TNJPCrpH2TT/gRwNPBIi/XKzMzWeiV/Dyo9MPHV9HZiRIxrsV61UR179Ylew68pdzc+d5yia/b5Vtv3oEqeiy89seeHIszMrFXUeQ9K0hPp5yJJHxW9Fkn6qKU6JelISbMklXwZUdJ2kp6StLSQjJvat5D0SDre85LOLFp3kaQ3JVWl14GpvVLSx0Xt1zfvGZqZWX3qe4pvr/SzS13bSeoWEe83Y79OAE4phAYWfU67ouDB6hYCZwCHVWtfDvxHRDwnqQswRdJDEfFCWn91RFxVw/FejYj+jT4DMzNrkuaK25gA7NKYHSXdA2wBdAL+B9gU2AvoLelesqTbb6b160k6gmyC2K2AJcCoiJgeEQuABZI+c8MiPX04Py0vkjQL2Ax4ATMzy63mmuqovuymuhwfEbuSzU5+Btn3qyYDx0bED9I2ewLDI2I/spDBqSmR98dAQwILK4EBwNNFzael+PmbJXUrau+d4uYfk/RVauFEXTOzltFcBaopU6KfIWkaMIlsJNWnhm0eioiFaXkv4A8AEfEw0F1SvVG2ktYH/gycFRGF+2e/BbYG+pONsv47tc8HvhgRA8gi6e+QtEFNx3WirplZyyjrZLGSBgP7A3tGxM7AVLJLedX9u3i3GtbXWSAltScrTrcXzx8YEW9HxIqIWAncAAxK7Usj4r20PAV4FX8x2cysVZX7Et+GwPsRsUTSdsAeJewzETgWVhW4d4tGRGt2TBJwEzArIn5ZbV2voreHAzNT+8aSKtLyVmSjutdKPCczM2sGJT0kIekq4JaIeL6WTYY08vMfAE6SNB14iewyX30uAm5J+ywBhqc+bkp272oDYKWks4AdgH5kqb0zJFWlY/w4Iv4GXCGpP9kIbC7w/bR+b+ASScuBFcBJRZcYzcysFZQ0k4SkE4HjyAraLcCdEeEnAqpxoq6ZWcM1KVE3Im6MiK8A3wMqgemS7pC0b/N208zMLFPyPah0T2a79HoXmAacI+mPLdQ3MzNbi5V6D+qXwCFkX8j9RUQ8k1ZdLumlluqcmZmtvUqdSWIm8NOIWFLDukHN2B8zMzOgngIlqTB9URWwXfbE9moR8ZwfljAzs5ZQ3wjqv+tYF8B+zdgXMzOzVeqbzdxP6ZmZWVnUd4lvv4h4OKXprqF42iAzM7PmVN8lvn2Ah4GDa1gXOGH3M2a8+SGV599f7m7klqPbzawh6rvEd2H6eVzrdKfhJD0KnBsRkyX9nOzLxN0iYv2iba4GCpcrOwM9I6JrWjcc+Gla97OIGJPa9wOuAjoAU4AT6ghLNDOzZlbq96C6snoWiVX7RMQZLdKrxrsPuBaYXdwYEWcXliWdTpYJhaSNgAvJsqiCLG33XuBDYAwwJCJelnQJ2Zx/N7XGSZiZWekzSfyNrDjNIBtNFF6NJqlS0ixJN0h6XtKDktaV9KikgWmbHpLmpuUKSVdJmpECBk+vfsyImJQSdOtyDHBnWv46KWsqRdY/BAwFugNLI+LltN1DwLebcr5mZtYwpX5Rt1NEnNMCn98HOCYiRkq6m7qLwCigNzAgIpan0U+DSNoyHePh1LQZ8EbRJvNS27tAe0kDI2IycARZmGJNxxyV+kbFBhs3tEtmZlaLUkdQf5A0UlIvSRsVXs3w+XMioiotTyEbpdVmf+D6wn2gRsZfHA2MjYgV6X2N4YeRTfF+NHC1pGeARUCN95+cqGtm1jJKHUF9ClwJ/ITV6bUBbNXEz19atLwCWJesEBQKZ3G6rmhatDxkRefUovfzgMFF7zcHHgWIiKeArwJIOgAn6pqZtapSR1DnANtERGVE9E6vphan2swFdk3LRxS1P0gWbtgOVj3gUDJJ2wLdgKeKmv8BHCCpm6RuwAGpDUk908+OwHnA9Q0+EzMza7RSC9TzZOm1reEq4GRJ/wR6FLXfCLxOlkU1Dfh/1XeUdIWkeUBnSfMkXVS0+hjgj1GU0JguE/4X8Gx6XVJ06fAHkmYB04H7IuJhzMys1ZSaqDsO2BF4hKLLcjl8zLysnKhrZtZwtSXqlnoP6p70MjMzaxUlFajC7ApmZmatpdSZJPoAlwI7UPRkXQs+KGFmZmu5Uh+SuAX4Ldkj4PsCvwf+0FKdMjMzK7VArRsRE8geqvhXRFyEwwrNzKwFlfqQxCeS1gFmSzoNeBPo2XLdMjOztV2dIyhJhct4fyWLqTiD7Eu03yWb3dvMzKxF1DeC2jVNsHoscAPZl3X/o8V7ZWZma736CtT1wANkc+5NYfV8eIWffoqvyOc9UdeJuGbWmuq8xBcRv4qI7YGbI2Krwhx8LTwXX6NJ+rmkNyQtrtZ+jqQXUo7UhDQqLKxbIakqve4tau8t6WlJsyXdJalDa56LmdnarqSn+CLi5JbuSDO5DxhUQ/tUYGBE9APGAlcUrfs4Ivqn1yFF7ZcDV0dEH+B94ISW6rSZma2p1MfMGyWl5r4oaUwavYyV1FnSBZKelTRT0mhJSts/KulqSRNT2u5ukv6SRjE/KzruPZKmpCTeUYX22hJ1I+KRiChMdjuJLFajrn6L7DH6salpDHBYk34ZZmbWIC1aoJJtgdFp9PIRcApwbUTsFhF9yTKgDira/tOI2Jvs/tdfyfKb+gIjJHVP2xwfEbsCA4EzitpLcQLw96L3nSRNljRJ0mGprTvwQSEckdVJu2uQNCrtP3nFkg8b0A0zM6tLqd+Daoo3IuLJtHwb2aPqcyT9kOzR9Y3I4jzuS9sU7gPNAJ4vjIgkvUYWu/4eWVE6PG23BVl0/Hv1dUTSd8iK2j5FzV+MiLckbQU8LGkGWSGtrsZp3yNiNDAaoGOvPk0NVDQzs6Q1RlDV/9EO4DfAERGxE9nj68XJuYU4j5V8NnF3JdBO0mCy+Pc9I2JnsvtLxfvXSNL+ZInAh0REcWTIW+nna2RpugOAd4GuhXBEskuCb9X3GWZm1nxao0B9UdKeafkY4Im0/K6k9flsam4pNgTej4glkrYD9qhvB0kDgN+RFacFRe3dUmIuknoAXwFeSKGGjxT1bTjZ5UYzM2slrVGgZgHDJU0nu5z3W7JR0wyyjKlnG3i8B8hGUtPJ0nAnFVbUkah7JbA+8Kdqj5NvD0xOCb2PAJdFxAtp3XnAOZJeIbsndVMD+2lmZk1QUqJuow8uVQLj08MQn3tO1DUza7jaEnVbYwRlZmbWYC36FF9EzCV7RNzMzKxBPIIyM7NccoEyM7NccoEyM7NccoEyM7NccoEyM7NccoEyM7Ncao3JYtcabT1R14m5ZpYnuRpBSbpR0g5N2P8BSR9IGl+t/XZJL6X8qZsltU/th6acqqoUmbFX0T5np7ypmZLulFTvhLRmZtZ8clWgIuLEornwGuNK4Ls1tN8ObAfsRJY/dWJqnwDsHBH9geOBGwEkbUYWCzIwTdNUARzdhH6ZmVkDla1ASVpP0v2SpqVRyrCUqDswrT9B0sup7QZJ16b2WyX9StI/Jb0madVs6BExAVhU/bMi4m+RAM+QEnUjYnGsnoxwPT4bDdIOWDdFbnTGcRtmZq2qnCOoocBbEbFzGqU8UFgh6QvAf5JFaXyNbPRTrBewF1kS72WlfmC6tPfdap91uKQXgfvJRlFExJvAVcDrwHzgw4h4sJZjOlHXzKwFlLNAzQD2l3S5pK9GRPG/7oOAxyJiYUQsA/5Ubd97ImJluhy4SQM+8zfAxIh4vNAQEeMiYjvgMLL4DiR1Aw4FegNfANZLabxriIjRETEwIgZWdN6wAV0xM7O6lK1ARcTLwK5khepSSRcUrVY9uxcn7da3bbaRdCGwMXBOLf2ZCGydggv3B+ZExDupQP4F+HIpn2NmZs2jnPegvgAsiYjbyC6n7VK0+hlgn5R42w74dhM/60Tg68AxEbGyqH0bSUrLuwAdgPfILu3tIalzWj+ELHjRzMxaSTm/B7UTcKWklcAy4GSyQkVEvCnpF8DTZA8nvADUe4NH0uNk96vWT8m6J0TEP4DrgX8BT6V69JeIuISs8H1P0jLgY2BYemjiaUljgeeA5cBUYHSznbmZmdWrRRN1m0LS+hGxOI2gxgE3R8S4cverLk7UNTNruLaYqHuRpCpgJjAHuKesvTEzs1aV26mOIuLccvfBzMzKJ88jKDMzW4u5QJmZWS65QJmZWS65QJmZWS65QJmZWS65QJmZWS7l9jHztqgtJOo6NdfM2opyzsXXVdIpzXi8vSU9J2l5cUaUpP6SnkrpuNMlDStat1/aZ6akMWnWCtIcgOPS9s9I6ttc/TQzs9KU8xJfV6DZChTZBK8jgDuqtS8BvhcRO5JlUF2TiuM6wBjg6JRH9S9geNrnx0BVRPQDvgf8TzP208zMStBqBUrSOWmkMlPSWWRBg1tLqpJ0pTJXpvUzCiMdSYMlPSbp7pSwe5mkY9PIZoakrQEiYm5ETAdWFn9uRLwcEbPT8lvAArLYje7A0hT7AfAQq2dN34EsDp6IeBGolNSQ3CkzM2uiVrkHJWlX4Dhgd7L8pqeB7wB9I6J/2ubbQH9gZ6AH8KykiekQOwPbAwuB14AbI2KQpDOB04GzSuzHILJIjVfJ4t3bSxoYEZOBI4At0qbTgG8BT6R9tiSLiX+7cb8BMzNrqNYaQe0FjIuIf0fEYrIAwK/WsM2dEbEiIt4GHgN2S+uejYj5EbGUrLgU4tdnAJWldEBSL+APwHEpjTeAo4GrJT0DLCKL1oBsdNctTVZ7OlncxvI1j+rIdzOzltJaT/GVknpb1zbFCbori96vpIRzkLQBcD/w04iYVGiPiKdIhVLSAcCXUvtHZCM+UmDhnPRaQ0SMJmVFdezVJ5/ZJWZmbVBrjaAmAoelhNr1gMOBJ4Eu1bYZJqlC0sbA3mTJuk0iqQNZntTvI+JP1db1TD87AueRBRsWnjDskDY7EZiYipaZmbWSVilQEfEccCtZwXma7B7SFODJ9FDElWRFZDrZ/Z+HgR9GxP+V+hmSdkspukcCv5P0fFp1FFmxG5EeyKiS1D+t+4GkWelz74uIh1P79sDzkl4EvgGc2dhzNzOzxsltom5b5ERdM7OGa4uJumZmthZzgTIzs1xygTIzs1xygTIzs1xygTIzs1xygTIzs1xygTIzs1xygTIzs1xyom4zyluirtNzzawta7MjqJSUe2DR++1Scu5SSecWtXdK2VHTUqruxUXrNpL0kKTZ6We31F4p6eOiqZGub92zMzOzNlugyLKjDix6vxA4A7iq2nZLgf0iYue0z1BJe6R15wMTIqIPWUDh+UX7vRoR/dPrpBbov5mZ1aFsBUrSPZKmpFHNqNS2uGj9EZJuTctHpkllp0mamGYav4Rs9vMqScMiYkFEPAssK/6cyBSO2z69ChMQHkoW+076eVjLnK2ZmTVUOe9BHR8RCyWtS5ae++c6tr0A+HpEvCmpa0R8KukCYGBEnFbfB0mqAKYA2wDXRcTTadUmETEfICLmF+I3kt6SpgIfkeVIPd6IczQzs0Yq5yW+MyRNAyaRRa33qWPbJ4FbJY0EKhr6QSmltz9ZbPsgSX3r2WU+8MWIGACcA9yRQg/X4ERdM7OWUZYCJWkwsD+wZ7o3NBXoxOpLb6T3AKR7QD8lK2RVkro35nMj4gPgUWBoano7RcEXIuEXpO2WRsR7aXkKWcz8l2o55uiIGBgRAys6b9iYbpmZWQ3KNYLaEHg/IpZI2g4oPLTwtqTtJa1DlroLgKStI+LpiLgAeJesUC3is4m8NZK0saSuaXldssL4Ylp9LzA8LQ8H/lq0T0Va3opsdPdaE87XzMwaqFz3oB4ATpI0HXiJ7DIfZE/RjQfeAGYC66f2KyX1AUT2tN004HXgfElVwKXAY8BkYANgpaSzgB2AXsCYVHDWAe6OiPHpuJcBd0s6IR3vyNS+N3CJpOXACuCkiFjY3L8EM2t5y5YtY968eXzyySfl7spar1OnTmy++ea0b9++pO2dqNuMnKhrlj9z5syhS5cudO/eHUnl7s5aKyJ47733WLRoEb179/7MOifqmtla6ZNPPnFxygFJdO/evUEjWRcoM/vcc3HKh4b+d3CBMjOzXPJksWa2VmnuCZ09KXPL8QjKzCxHRowYwdixY8vdjVxwgTIzs1xygTIza2Fz585l++23Z+TIkey4444ccMABfPzxx/Xud8kll7DbbrvRt29fRo0aReFrQYMHD+a8885j0KBBfOlLX+Lxx7OpQpcsWcJRRx1Fv379GDZsGLvvvjuFr76sv/76q447duxYRowYAcB9993H7rvvzoABA9h///15++23AXjnnXf42te+xi677ML3v/99ttxyS959910AbrvtNgYNGkT//v35/ve/z4oVK1ixYgUjRoygb9++7LTTTlx99dVN/r25QJmZtYLZs2dz6qmn8vzzz9O1a1f+/Oe65sfOnHbaaTz77LPMnDmTjz/+mPHjx69at3z5cp555hmuueYaLr44i7n7zW9+Q7du3Zg+fTr/+Z//yZQpU+r9jL322otJkyYxdepUjj76aK644goALr74Yvbbbz+ee+45Dj/8cF5//XUAZs2axV133cWTTz5JVVUVFRUV3H777VRVVfHmm28yc+ZMZsyYwXHHHdeYX9Nn+CGJZtSaibq+MWvWtvTu3Zv+/fsDsOuuuzJ37tx693nkkUe44oorWLJkCQsXLmTHHXfk4IMPBuBb3/rWGsd64oknOPPMMwHo27cv/fr1q/cz5s2bx7Bhw5g/fz6ffvrpqi/RPvHEE4wbNw6AoUOH0q1bNwAmTJjAlClT2G233QD4+OOP6dmzJwcffDCvvfYap59+Ot/85jc54IADSvvF1MEjKDOzVtCxY8dVyxUVFSxfvrzO7T/55BNOOeUUxo4dy4wZMxg5cuRnvuRaOF7xseqaGaj4O0jFxzn99NM57bTTmDFjBr/73e9WravtWBHB8OHDqaqqoqqqipdeeomLLrqIbt26MW3aNAYPHsx1113HiSeeWOf5laLNj6AkPQqcGxGTJf0c+B7QLSLWr2HbI4A/AbtFxOTUdjlQGI78V0TcldpvAgaSzf/3MjCiKPjQzNqotnL1oVAoevToweLFixk7dixHHHFEnfvstdde3H333ey777688MILzJgxY9W6TTbZhFmzZrHtttsybtw4unTJ5tr+8MMP2WyzzQAYM2bMGsc677zzePDBB3n//fcBGDJkCIceeihnn302PXv2ZOHChSxatIj11luPDh068O1vf5utt9561T2upmjzBaqa+4BrgdnVV0jqQhYJ/3RR2zeBXcii4DsCj0n6e0R8BJydfiLpl8BpZJPLmpm1uK5duzJy5Eh22mknKisrV11Sq8spp5zC8OHD6devHwMGDKBfv35suGEWA3TZZZdx0EEHscUWW9C3b18WL87+f/uiiy7iyCOPZLPNNmOPPfZgzpw5AFx44YUcc8wx3HXXXeyzzz706tWLLl260KNHD372s59xwAEHsHLlStq3b891113Huuuuy3HHHcfKlSsBuPTSS5v8OyjbZLGSKoHxEdE3vT+XbPbywWRFZF+gK3BCRDyeZiO/HPg6WW7UDRHx6+IRVNGxF1cfQUm6Bvhf4FxWj7h+AHSMiJ+lbW4C/hERdxftJ+A3wNyIuLyuc+rYq0/0Gn5No34fDdVW/i/QrNxmzZrF9ttvX+5utIoVK1awbNkyOnXqxKuvvsqQIUN4+eWX6dChQ4OPtXTpUioqKmjXrh1PPfUUJ598MlVVVU3uY03/PWqbLDavI6h2ETFI0oHAhWQZTqOA3sCAiFguaaNSDyZpALBFRIxPhbBgGnBhGiF1JiuKLxTtdwtwYGr7j1qOPSr1jYoNNm7AKZqZNa8lS5aw7777smzZMiKC3/72t40qTgCvv/46Rx11FCtXrqRDhw7ccMMNzdzb+uW1QP0l/ZwCVKbl/YHrI2I5QKn5TCn88GpgRPV1EfGgpN2AfwLvAE8By4vWH5dGbr8GhgG31HCM0cBoyEZQpfTJzOzUU0/lySef/EzbmWee2aTHs7t06UJzRf706dOHqVOnNsuxGqucBWo5n32KsFPR8tL0cwWr+yg+Gwlfqi5AX+DR9BTLpsC9kg6JiMkR8XPg5wCS7qDa/auIWCHpLuAH1FCgzCz/IiJ3M5pfd9115e5Cq2voLaVyPmb+NtBTUndJHYGD6tn+QbIU3nYApV7ii4gPI6JHRFRGRCVZeu8h6R5UhaTu6Xj9gH7Ag8psk9oFHMzqmHgza0M6derEe++91+B/HK15FQILO3XqVP/GSdlGUBGxTNIlZA9EzKH+AnAj8CVguqRlwA1kT+ytIukK4P8BnSXNA26MiIvqOGZ74PH0f1YfAd9J97fWIYuJ34Bs5DYNOLm+c9ppsw2Z7IcXzHJl8803Z968ebzzzjvl7sparxD5XipHvjcjR76bmTWcI9/NzKxNcYEyM7NccoEyM7Nc8j2oZiRpEfBSufvRQD2Ad8vdiQZqi32GttnvtthnaJv9Xpv7vGVErDHTQV6/qNtWvVTTjb48kzTZfW4dbbHfbbHP0Db77T6vyZf4zMwsl1ygzMwsl1ygmtfocnegEdzn1tMW+90W+wxts9/uczV+SMLMzHLJIygzM8slFygzM8slF6hmIGmopJckvSLp/HL3p0DSFpIekTRL0vOSzkztG0l6SNLs9LNb0T4/SufxkqSvl7HvFZKmShrfhvrcVdJYSS+m3/meee+3pLPTn42Zku6U1CmPfZZ0s6QFkmYWtTW4n5J2lTQjrfuVWjCDo5Y+X5n+fEyXNE5S1zz1ubZ+F607V1JI6tEq/Y4Iv5rwAiqAV4GtgA5kM5/vUO5+pb71AnZJy12Al4EdgCuA81P7+cDlaXmH1P+OZOnFrwIVZer7OcAdwPj0vi30eQxwYlruAHTNc7+BzciSBNZN7+8mC/bMXZ+BvYFdgJlFbQ3uJ/AMsCdZSsHfgW+0cp8PIEsMB7g8b32urd+pfQvgH8C/gB6t0W+PoJpuEPBKRLwWEZ8CfwQOLXOfAIiI+RHxXFpeBMwi+0fpULJ/TEk/D0vLhwJ/jIilETEHeIXs/FqVpM2Bb5JFrBTkvc8bkP3FvgkgIj6NiA/Ieb/Jvqy/rrKctc7AW+SwzxExEaieot2gfkrqBWwQEU9F9i/o74v2aZU+R8SDkVLBybLpCtkTuehzbf1OrgZ+yGeDY1u03y5QTbcZ8EbR+3mpLVckVQIDyPK3NomI+ZAVMaBn2iwv53IN2V+ElUVtee/zVsA7wC3p0uSNktYjx/2OiDeBq4DXgfnAhxHxIDnuczUN7edmabl6e7kcTzaygJz3WdIhwJsRMa3aqhbttwtU09V0XTVXz+5LWh/4M3BWRHxU16Y1tLXquUg6CFgQEVNK3aWGtnL8/tuRXRb5bUQMAP5NdtmpNmXvd7pncyjZpZkvAOtJ+k5du9TQlqs/60lt/cxN/yX9BFgO3F5oqmGzXPRZUmfgJ8AFNa2uoa3Z+u0C1XTzyK7NFmxOdpkkFyS1JytOt0fEX1Lz22kITvq5ILXn4Vy+AhwiaS7Z5dL9JN1Gvvtc6Me8iHg6vR9LVrDy3O/9gTkR8U5ELAP+AnyZfPe5WEP7OY/Vl9SK21uVpOHAQcCx6fIX5LvPW5P9T8y09Pdyc+A5SZvSwv12gWq6Z4E+knpL6gAcDdxb5j4BkJ6auQmYFRG/LFp1LzA8LQ8H/lrUfrSkjpJ6A33IbnS2moj4UURsHhGVZL/LhyPiO3nuM0BE/B/whqRtU9MQ4AXy3e/XgT0kdU5/VoaQ3afMc5+LNaif6TLgIkl7pPP9XtE+rULSUOA84JCIWFK0Krd9jogZEdEzIirT38t5ZA9f/V+L97slnwZZW17AgWRPyL0K/KTc/Snq115kw+rpQFV6HQh0ByYAs9PPjYr2+Uk6j5do4aeFSuj/YFY/xZf7PgP9gcnp930P0C3v/QYuBl4EZgJ/IHsaK3d9Bu4ku0+2jOwfyBMa009gYDrXV4FrSbPptGKfXyG7Z1P4+3h9nvpcW7+rrZ9LeoqvpfvtqY7MzCyXfInPzMxyyQXKzMxyyQXKzMxyyQXKzMxyyQXKzMxyyQXKzMxyyQXKzMxy6f8D8pJV0bQStJsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "Family, Child, family_child = treedb.Languoid.parent_descendant(parent_root=True,\n", " parent_level=FAMILY)\n", "\n", "n_languages = sa.func.count(Child.id).label('n_languages')\n", "\n", "select_family_nlanguages = (sa.select(Family.id.label('family_id'), n_languages)\n", " .select_from(family_child)\n", " .where(Child.level == LANGUAGE)\n", " .group_by(Family.id))\n", "\n", "select_top_families = (select_family_nlanguages\n", " .having(n_languages >= 100)\n", " .order_by('n_languages'))\n", "\n", "(read_sql(select_top_families, index_col='family_id')\n", " .plot.barh());" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "WITH RECURSIVE tree(parent_id, child_id) AS \n", "(SELECT root.id AS parent_id, child.id AS child_id \n", "FROM languoid AS root LEFT OUTER JOIN languoid AS child ON root.id = child.parent_id \n", "WHERE root.parent_id IS NULL AND root.level = ? UNION ALL SELECT tree.parent_id AS parent_id, child.id AS child_id \n", "FROM tree JOIN languoid AS child ON tree.child_id = child.parent_id)\n", " SELECT family_nlanguages.n_languages AS family_size, count(*) AS n_families \n", "FROM (SELECT root.id AS family_id, count(child.id) AS n_languages \n", "FROM tree JOIN languoid AS root ON tree.parent_id = root.id LEFT OUTER JOIN languoid AS child ON tree.child_id = child.id \n", "WHERE child.level = ? GROUP BY root.id) AS family_nlanguages GROUP BY family_nlanguages.n_languages ORDER BY family_size\n", "[generated in 0.00084s] ('family', 'language')\n", "ROLLBACK\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
countminmax
family_size58.02.01406.0
\n", "
" ], "text/plain": [ " count min max\n", "family_size 58.0 2.0 1406.0" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "family_size = (select_family_nlanguages\n", " .alias('family_nlanguages')\n", " .c.n_languages.label('family_size'))\n", "\n", "select_family_sizes = (sa.select(family_size, sa.func.count().label('n_families'))\n", " .group_by(family_size)\n", " .order_by('family_size'))\n", "\n", "_ = read_sql(select_family_sizes, index_col='family_size')\n", "\n", "(_.plot.area(figsize=(12, 3), logx=True)\n", " .xaxis.set_major_formatter(mpl.ticker.ScalarFormatter()))\n", "(_.index.to_series().describe()\n", " .to_frame().transpose()[['count', 'min', 'max']])" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "WITH levels AS \n", "(SELECT ? AS level UNION ALL SELECT ? AS level UNION ALL SELECT ? AS level)\n", " SELECT parent.id AS parent_id, parent.level AS parent_level, levels.level AS child_level, count(child.id) AS n_children \n", "FROM languoid AS parent JOIN levels ON 1 = 1 LEFT OUTER JOIN languoid AS child ON parent.id = child.parent_id AND child.level = levels.level GROUP BY parent.id, parent.level, levels.level\n", "[generated in 0.00093s] ('family', 'language', 'dialect')\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", "
summaxmean
child_leveldialectfamilylanguagedialectfamilylanguagedialectfamilylanguage
parent_level
dialect23100022000.1765110.0000000.000000
family0438883830463790.0000000.9471181.809411
language107770032001.2582600.0000000.000000
\n", "
" ], "text/plain": [ " sum max mean \\\n", "child_level dialect family language dialect family language dialect \n", "parent_level \n", "dialect 2310 0 0 22 0 0 0.176511 \n", "family 0 4388 8383 0 46 379 0.000000 \n", "language 10777 0 0 32 0 0 1.258260 \n", "\n", " \n", "child_level family language \n", "parent_level \n", "dialect 0.000000 0.000000 \n", "family 0.947118 1.809411 \n", "language 0.000000 0.000000 " ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "levels = (sa.union_all(*[sa.select(sa.literal(l).label('level')) for l in LEVEL])\n", " .cte(name='levels'))\n", "\n", "select_parent_nchildren = (sa.select(Parent.id.label('parent_id'),\n", " Parent.level.label('parent_level'),\n", " levels.c.level.label('child_level'),\n", " sa.func.count(Child.id).label('n_children'))\n", " .join_from(Parent, levels, sa.true())\n", " .outerjoin(Child, sa.and_(Parent.id == Child.parent_id, \n", " Child.level == levels.c.level))\n", " .group_by(Parent.id, Parent.level, levels.c.level))\n", "\n", "(read_sql(select_parent_nchildren)\n", " .pivot_table(index='parent_level', columns='child_level', values='n_children',\n", " aggfunc=['sum', 'max', 'mean'], fill_value=0))" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "WITH RECURSIVE tree(parent_id, child_id) AS \n", "(SELECT parent.id AS parent_id, child.id AS child_id \n", "FROM languoid AS parent LEFT OUTER JOIN languoid AS child ON parent.id = child.parent_id UNION ALL SELECT tree.parent_id AS parent_id, child.id AS child_id \n", "FROM tree JOIN languoid AS child ON tree.child_id = child.parent_id)\n", " SELECT parent_ndescendants.parent_level, min(parent_ndescendants.n_descendants) AS min, max(parent_ndescendants.n_descendants) AS max, CAST(sum(parent_ndescendants.n_descendants) AS FLOAT) / count(parent_ndescendants.n_descendants) AS mean \n", "FROM (SELECT parent.id AS parent_id, parent.level AS parent_level, count(child.id) AS n_descendants \n", "FROM tree JOIN languoid AS parent ON tree.parent_id = parent.id LEFT OUTER JOIN languoid AS child ON tree.child_id = child.id GROUP BY parent.id, parent.level) AS parent_ndescendants GROUP BY parent_ndescendants.parent_level ORDER BY parent_ndescendants.parent_level\n", "[generated in 0.00083s] ()\n", "ROLLBACK\n", "BEGIN (implicit)\n", "WITH RECURSIVE tree(parent_id, child_id) AS \n", "(SELECT parent.id AS parent_id, child.id AS child_id \n", "FROM languoid AS parent LEFT OUTER JOIN languoid AS child ON parent.id = child.parent_id UNION ALL SELECT tree.parent_id AS parent_id, child.id AS child_id \n", "FROM tree JOIN languoid AS child ON tree.child_id = child.parent_id)\n", " SELECT ? AS parent_level, min(parent_ndescendants.n_descendants) AS min, max(parent_ndescendants.n_descendants) AS max, CAST(sum(parent_ndescendants.n_descendants) AS FLOAT) / count(parent_ndescendants.n_descendants) AS mean \n", "FROM (SELECT parent.id AS parent_id, parent.level AS parent_level, count(child.id) AS n_descendants \n", "FROM tree JOIN languoid AS parent ON tree.parent_id = parent.id LEFT OUTER JOIN languoid AS child ON tree.child_id = child.id GROUP BY parent.id, parent.level) AS parent_ndescendants\n", "[generated in 0.00066s] ('total',)\n", "ROLLBACK\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
n_descendants
minmaxmean
parent_level
dialect0570.242989
family1481535.261170
language01251.527963
total048156.834012
\n", "
" ], "text/plain": [ " n_descendants \n", " min max mean\n", "parent_level \n", "dialect 0 57 0.242989\n", "family 1 4815 35.261170\n", "language 0 125 1.527963\n", "total 0 4815 6.834012" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Parent, Child, parent_child = treedb.Languoid.parent_descendant()\n", "\n", "select_parent_ndescendants = (sa.select(Parent.id.label('parent_id'),\n", " Parent.level.label('parent_level'),\n", " sa.func.count(Child.id).label('n_descendants'))\n", " .select_from(parent_child)\n", " .group_by(Parent.id, Parent.level)\n", " .alias('parent_ndescendants'))\n", "\n", "parent_level = select_parent_ndescendants.c.parent_level\n", "\n", "n_descendants = select_parent_ndescendants.c.n_descendants\n", "\n", "d_min = sa.func.min(n_descendants).label('min')\n", "d_max = sa.func.max(n_descendants).label('max')\n", "d_mean = (sa.func.sum(n_descendants).cast(sa.Float) / sa.func.count(n_descendants)).label('mean')\n", "\n", "select_level_mean_descendants = (sa.select(parent_level, d_min, d_max, d_mean)\n", " .group_by(parent_level)\n", " .order_by(parent_level))\n", "\n", "select_total_mean_descendants = sa.select(sa.literal('total').label('parent_level'),\n", " d_min, d_max, d_mean)\n", "\n", "select_mean_descendants = [select_level_mean_descendants, select_total_mean_descendants]\n", "\n", "_ = pd.concat([read_sql(q, index_col='parent_level') for q in select_mean_descendants])\n", "_.columns = pd.MultiIndex.from_product([['n_descendants'], _.columns])\n", "_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## macroarea" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 5.656s ago] ('table', 'macroarea')\n", "SELECT count(*) AS n_rows \n", "FROM macroarea\n", "[generated in 0.00036s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE macroarea (\n", "\tname VARCHAR NOT NULL CHECK (name != ''), \n", "\tconfig_section VARCHAR NOT NULL CHECK (config_section != ''), \n", "\tdescription TEXT NOT NULL CHECK (description != ''), \n", "\tPRIMARY KEY (name), \n", "\tUNIQUE (config_section)\n", ") WITHOUT ROWID\n", "6\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 5.662s ago] ('table', 'languoid_macroarea')\n", "SELECT count(*) AS n_rows \n", "FROM languoid_macroarea\n", "[generated in 0.00027s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE languoid_macroarea (\n", "\tlanguoid_id VARCHAR(8) NOT NULL, \n", "\tmacroarea_name VARCHAR NOT NULL, \n", "\tPRIMARY KEY (languoid_id, macroarea_name), \n", "\tFOREIGN KEY(languoid_id) REFERENCES languoid (id), \n", "\tFOREIGN KEY(macroarea_name) REFERENCES macroarea (name)\n", ") WITHOUT ROWID\n", "21616\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT macroarea.name, macroarea.config_section, macroarea.description \n", "FROM macroarea ORDER BY macroarea.name\n", "[generated in 0.00073s] ()\n", "ROLLBACK\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedescription
config_section
africaAfricaThe continent
australiaAustraliaThe continent
eurasiaEurasiaThe Eurasian landmass North of Sinai. Includes...
northamericaNorth AmericaNorth and Middle America up to Panama. Include...
pacificPapunesiaAll islands between Sumatra and the Americas, ...
southamericaSouth AmericaEverything South of Darién.
\n", "
" ], "text/plain": [ " name \\\n", "config_section \n", "africa Africa \n", "australia Australia \n", "eurasia Eurasia \n", "northamerica North America \n", "pacific Papunesia \n", "southamerica South America \n", "\n", " description \n", "config_section \n", "africa The continent \n", "australia The continent \n", "eurasia The Eurasian landmass North of Sinai. Includes... \n", "northamerica North and Middle America up to Panama. Include... \n", "pacific All islands between Sumatra and the Americas, ... \n", "southamerica Everything South of Darién. " ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from treedb.models import Macroarea, languoid_macroarea\n", "\n", "print_sql(Macroarea)\n", "print_sql(languoid_macroarea)\n", "read_sql(sa.select(Macroarea).order_by('name'), index_col='config_section')" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT macroarea.name AS macroarea, count(*) AS n_languages \n", "FROM macroarea LEFT OUTER JOIN languoid_macroarea ON macroarea.name = languoid_macroarea.macroarea_name JOIN languoid ON languoid.id = languoid_macroarea.languoid_id \n", "WHERE languoid.level = ? GROUP BY macroarea.name ORDER BY n_languages DESC\n", "[generated in 0.00114s] ('language',)\n", "ROLLBACK\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", " \n", " \n", " \n", " \n", " \n", "
n_languages
macroarea
Africa2365
Papunesia2209
Eurasia2001
North America792
South America716
Australia388
\n", "
" ], "text/plain": [ " n_languages\n", "macroarea \n", "Africa 2365\n", "Papunesia 2209\n", "Eurasia 2001\n", "North America 792\n", "South America 716\n", "Australia 388" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "select_macroarea_nlanguages = (sa.select(Macroarea.name.label('macroarea'),\n", " sa.func.count().label('n_languages'))\n", " .outerjoin_from(Macroarea, languoid_macroarea).join(Languoid)\n", " .filter_by(level=LANGUAGE)\n", " .group_by(Macroarea.name)\n", " .order_by(sa.desc('n_languages')))\n", "\n", "_ = read_sql(select_macroarea_nlanguages, index_col='macroarea')\n", "_.plot.pie(y='n_languages')\n", "_" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid.id, languoid.name, group_concat(macroarea.name, ?) AS macroareas \n", "FROM languoid JOIN languoid_macroarea ON languoid.id = languoid_macroarea.languoid_id JOIN macroarea ON macroarea.name = languoid_macroarea.macroarea_name \n", "WHERE languoid.level = ? GROUP BY languoid.id \n", "HAVING count(*) > ? ORDER BY languoid.id\n", "[generated in 0.00083s] (', ', 'language', 1)\n", "ROLLBACK\n" ] } ], "source": [ "macroareas = sa.func.group_concat(Macroarea.name, ', ').label('macroareas')\n", "\n", "select_multiarea_languages = (sa.select(Languoid.id, Languoid.name, macroareas)\n", " .select_from(Languoid)\n", " .filter_by(level=LANGUAGE)\n", " .join(languoid_macroarea).join(Macroarea)\n", " .group_by(Languoid.id)\n", " .having(sa.func.count() > 1)\n", " .order_by('id'))\n", " \n", "assert read_sql(select_multiarea_languages).empty" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## country" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 5.862s ago] ('table', 'country')\n", "SELECT count(*) AS n_rows \n", "FROM country\n", "[generated in 0.00048s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE country (\n", "\tid VARCHAR(2) NOT NULL CHECK (length(id) = 2), \n", "\tname TEXT NOT NULL CHECK (name != ''), \n", "\tPRIMARY KEY (id), \n", "\tUNIQUE (name)\n", ") WITHOUT ROWID\n", "246\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 5.869s ago] ('table', 'languoid_country')\n", "SELECT count(*) AS n_rows \n", "FROM languoid_country\n", "[generated in 0.00038s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE languoid_country (\n", "\tlanguoid_id VARCHAR(8) NOT NULL, \n", "\tcountry_id VARCHAR(2) NOT NULL, \n", "\tPRIMARY KEY (languoid_id, country_id), \n", "\tFOREIGN KEY(languoid_id) REFERENCES languoid (id), \n", "\tFOREIGN KEY(country_id) REFERENCES country (id)\n", ") WITHOUT ROWID\n", "11463\n" ] } ], "source": [ "from treedb.models import Country, languoid_country\n", "\n", "print_sql(Country)\n", "print_sql(languoid_country)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT country.name AS country, count(*) AS n_languages \n", "FROM country LEFT OUTER JOIN languoid_country ON country.id = languoid_country.country_id JOIN languoid ON languoid.id = languoid_country.languoid_id \n", "WHERE languoid.level = ? GROUP BY country.id ORDER BY n_languages DESC\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00092s] ('language', 10, 0)\n", "ROLLBACK\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
n_languages
country
Papua New Guinea896
Indonesia748
Nigeria581
India508
China406
Australia398
Mexico333
Brazil330
United States322
Cameroon315
\n", "
" ], "text/plain": [ " n_languages\n", "country \n", "Papua New Guinea 896\n", "Indonesia 748\n", "Nigeria 581\n", "India 508\n", "China 406\n", "Australia 398\n", "Mexico 333\n", "Brazil 330\n", "United States 322\n", "Cameroon 315" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "select_country_nlanguages = (sa.select(Country.name.label('country'),\n", " sa.func.count().label('n_languages'))\n", " .outerjoin_from(Country, languoid_country).join(Languoid)\n", " .filter_by(level=LANGUAGE)\n", " .group_by(Country.id)\n", " .order_by(sa.desc('n_languages'))\n", " .limit(10))\n", "\n", "read_sql(select_country_nlanguages, index_col='country')" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT lang_country.id, lang_country.name, count(*) AS n_countries, group_concat(lang_country.country, ?) AS countries \n", "FROM (SELECT languoid.id AS id, languoid.name AS name, country.id AS country \n", "FROM languoid JOIN languoid_country ON languoid.id = languoid_country.languoid_id JOIN country ON country.id = languoid_country.country_id \n", "WHERE languoid.level = ? ORDER BY languoid.id, country) AS lang_country GROUP BY lang_country.id, lang_country.name \n", "HAVING count(*) > ? ORDER BY n_countries DESC, lang_country.id\n", " LIMIT ? OFFSET ?\n", "[generated in 0.00105s] (', ', 'language', 1, 10, 0)\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namen_countriescountries
id
stan1293English34AU, BM, BR, BZ, CA, CC, CK, CU, CX, DO, FK, GB...
stan1288Spanish30AD, AR, BO, BR, BZ, CL, CO, CR, CU, DO, EC, ES...
stan1318Standard Arabic25AE, BH, DJ, DZ, EG, ER, IL, IQ, JO, KM, KW, LB...
amer1248American Sign Language22BB, BF, BJ, BO, CA, CD, CF, CI, CN, GA, GH, JM...
east2295Eastern Yiddish22AR, AU, BE, BY, CA, CR, EE, HU, IL, LT, LV, MD...
russ1263Russian20BY, CN, EE, FI, GE, KG, KP, KZ, LT, LV, MD, MN...
stan1295German16AT, BE, CH, CZ, DE, DK, FR, HU, IT, LI, LU, NL...
port1283Portuguese15AD, AR, BO, BR, CO, ES, FR, GF, GY, PE, PT, PY...
sint1235Sinte-Manus Romani13AT, CH, CZ, DE, FR, HR, IT, KZ, ME, NL, PL, RS...
nucl1301Turkish12AL, AM, AZ, BG, CY, GE, GR, IQ, IR, MK, SY, TR
\n", "
" ], "text/plain": [ " name n_countries \\\n", "id \n", "stan1293 English 34 \n", "stan1288 Spanish 30 \n", "stan1318 Standard Arabic 25 \n", "amer1248 American Sign Language 22 \n", "east2295 Eastern Yiddish 22 \n", "russ1263 Russian 20 \n", "stan1295 German 16 \n", "port1283 Portuguese 15 \n", "sint1235 Sinte-Manus Romani 13 \n", "nucl1301 Turkish 12 \n", "\n", " countries \n", "id \n", "stan1293 AU, BM, BR, BZ, CA, CC, CK, CU, CX, DO, FK, GB... \n", "stan1288 AD, AR, BO, BR, BZ, CL, CO, CR, CU, DO, EC, ES... \n", "stan1318 AE, BH, DJ, DZ, EG, ER, IL, IQ, JO, KM, KW, LB... \n", "amer1248 BB, BF, BJ, BO, CA, CD, CF, CI, CN, GA, GH, JM... \n", "east2295 AR, AU, BE, BY, CA, CR, EE, HU, IL, LT, LV, MD... \n", "russ1263 BY, CN, EE, FI, GE, KG, KP, KZ, LT, LV, MD, MN... \n", "stan1295 AT, BE, CH, CZ, DE, DK, FR, HU, IT, LI, LU, NL... \n", "port1283 AD, AR, BO, BR, CO, ES, FR, GF, GY, PE, PT, PY... \n", "sint1235 AT, CH, CZ, DE, FR, HR, IT, KZ, ME, NL, PL, RS... \n", "nucl1301 AL, AM, AZ, BG, CY, GE, GR, IQ, IR, MK, SY, TR " ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "select_lang_country = (sa.select(Languoid.id, Languoid.name, Country.id.label('country'))\n", " .select_from(Languoid)\n", " .filter_by(level=LANGUAGE)\n", " .join(languoid_country).join(Country)\n", " .order_by(Languoid.id, 'country')\n", " .alias('lang_country'))\n", "\n", "countries = sa.func.group_concat(select_lang_country.c.country, ', ').label('countries')\n", "\n", "select_multicountry_languages = (sa.select(select_lang_country.c.id,\n", " select_lang_country.c.name,\n", " sa.func.count().label('n_countries'),\n", " countries)\n", " .group_by(select_lang_country.c.id,\n", " select_lang_country.c.name)\n", " .having(sa.func.count() > 1)\n", " .order_by(sa.desc('n_countries'),\n", " select_lang_country.c.id)\n", " .limit(10))\n", " \n", "read_sql(select_multicountry_languages, index_col='id')" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT language_ncountries.n_countries, count(*) AS n_languages \n", "FROM (SELECT languoid.id AS id, count(*) AS n_countries \n", "FROM languoid LEFT OUTER JOIN languoid_country ON languoid.id = languoid_country.languoid_id \n", "WHERE languoid.level = ? GROUP BY languoid.id) AS language_ncountries GROUP BY language_ncountries.n_countries ORDER BY language_ncountries.n_countries\n", "[generated in 0.00098s] ('language',)\n", "ROLLBACK\n", "BEGIN (implicit)\n", "SELECT ? AS value, count(*) AS count, sum(language_ncountries.n_countries) AS sum, min(language_ncountries.n_countries) AS min, max(language_ncountries.n_countries) AS max, avg(language_ncountries.n_countries) AS mean \n", "FROM (SELECT languoid.id AS id, count(*) AS n_countries \n", "FROM languoid LEFT OUTER JOIN languoid_country ON languoid.id = languoid_country.languoid_id \n", "WHERE languoid.level = ? GROUP BY languoid.id) AS language_ncountries\n", "[generated in 0.00108s] ('n_countries', 'language')\n", "ROLLBACK\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", "
countsumminmaxmean
n_countries8565110201341.286632
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_countries 8565 11020 1 34 1.286632" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAswAAADUCAYAAACIy3XFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAguklEQVR4nO3de5RddX338ffXCSSxcidEmokmtaFCAgYIgVaqaBBiuXpBYtdTAg8lFCLS2i4NT9slWPMYaCuKBfqgIqFSIYIIXlAwilUKwhACIUQkcgkjEULwAnKRJN/nj/MLPQ6TPTNkZs+GvF9rnXX2+e7b58yZZL6z57f3jsxEkiRJUu9eNdwBJEmSpCazYZYkSZIq2DBLkiRJFWyYJUmSpAo2zJIkSVIFG2ZJkiSpwojhDtCXnXfeOSdMmDDcMSRJkvQKdvvttz+emWN6m9f4hnnChAl0dXUNdwxJkiS9gkXEQ5ua55AMSZIkqYINsyRJklTBhlmSJEmq0PgxzJIkSa8Ezz//PN3d3Tz77LPDHWWLNmrUKDo7O9lqq636vY4NsyRJUg26u7vZZpttmDBhAhEx3HG2SJnJ2rVr6e7uZuLEif1er88hGRHxRxGxtO3x64j464jYMSJuiIj7yvMObeucERErI+LeiDi0rb5vRCwr884Lv1skSdIW4tlnn2WnnXayWR5GEcFOO+004KP8fR5hzsx7gallJx3Az4CrgXnA4sxcEBHzyuuPRMQewCxgMvD7wHciYrfMXA9cCMwBbgG+CcwErhtQ4h4mzPvG5qwOwIMLDtvsbUiSJPXFZnn4vZTPYKAn/c0AfpqZDwFHAQtLfSFwdJk+Crg8M5/LzAeAlcD0iNgV2DYzb87MBC5tW0eSJElqpIGOYZ4FfKlMj83M1QCZuToidin1cbSOIG/UXWrPl+medUmSpC3OYPyVvN1g/8X8+OOP5/DDD+e9733voG735ajfR5gjYmvgSODLfS3aSy0r6r3ta05EdEVE15o1a/obUZIkSRp0AxmS8U5gSWY+Wl4/WoZZUJ4fK/VuYHzbep3AI6Xe2Uv9RTLzosyclpnTxozp9ZbekiRJGqAHH3yQ3XffnZNOOonJkydzyCGH8Mwzz/S53sc+9jH2228/pkyZwpw5c2iNroWDDjqIj3zkI0yfPp3ddtuNH/zgBwA8/fTTvO9972Ovvfbi2GOPZf/996erqwuA17zmNS9s98orr+T4448H4Gtf+xr7778/e++9NwcffDCPPtpqOdesWcM73vEO9tlnH04++WRe//rX8/jjjwPwxS9+kenTpzN16lROPvlk1q9fz/r16zn++OOZMmUKe+65J+eee+5mf90G0jC/n/8ZjgFwLTC7TM8Grmmrz4qIkRExEZgE3FqGbzwZEQeUq2Mc17aOJEmSanDfffcxd+5cli9fzvbbb89VV13V5zof+MAHuO2227j77rt55pln+PrXv/7CvHXr1nHrrbfyqU99irPOOguACy64gB122IG77rqLf/zHf+T222/vcx8HHnggt9xyC3fccQezZs3inHPOAeCss87i7W9/O0uWLOFd73oXq1atAmDFihVcccUV3HTTTSxdupSOjg4uu+wyli5dys9+9jPuvvtuli1bxgknnPBSvky/o19jmCPi1cA7gJPbyguARRFxIrAKOAYgM5dHxCLgHmAdMLdcIQPgFOASYDStq2Ns1hUyJEmSNDATJ05k6tSpAOy77748+OCDfa7zve99j3POOYenn36aJ554gsmTJ3PEEUcA8O53v/tF2/rhD3/I6aefDsCUKVPYa6+9+txHd3c3xx57LKtXr+a3v/3tC9dJ/uEPf8jVV18NwMyZM9lhh9aVjBcvXsztt9/OfvvtB8AzzzzDLrvswhFHHMH999/PaaedxmGHHcYhhxzSvy9MhX41zJn5NLBTj9paWlfN6G35+cD8XupdwJSBx5QkSdJgGDly5AvTHR0dfQ7JePbZZzn11FPp6upi/PjxnHnmmb9zHeON2+vo6GDdunUALwzZ6E37Zd3at3PaaafxoQ99iCOPPJIbb7yRM888s3Jbmcns2bP5xCc+8aJ5d955J9/+9rc5//zzWbRoERdffHHle+zLQC8rJ0mSpC3IxqZ255135qmnnuLKK6/sc50DDzyQRYsWAXDPPfewbNmyF+aNHTuWFStWsGHDhheOHAP86le/Yty41gXUFi5c2Ou2rr/+en7xi18AMGPGDK688koee6x1Gt0TTzzBQw89xOOPP86GDRt4z3vewz/90z+xZMmSzXn7gLfGliRJGhYvlxunbb/99px00knsueeeTJgw4YUhEFVOPfVUZs+ezV577cXee+/NXnvtxXbbbQfAggULOPzwwxk/fjxTpkzhqaeeAuDMM8/kmGOO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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_countries = (sa.select(Languoid.id, sa.func.count().label('n_countries'))\n", " .select_from(Languoid)\n", " .filter_by(level=LANGUAGE)\n", " .outerjoin(languoid_country)\n", " .group_by(Languoid.id)\n", " .alias('language_ncountries')\n", " .c.n_countries)\n", "\n", "select_lc_dist = (sa.select(n_countries, sa.func.count().label('n_languages'))\n", " .group_by(n_countries)\n", " .order_by('n_countries'))\n", "\n", "_ = read_sql(select_lc_dist, index_col='n_countries')\n", "\n", "_.plot.bar(figsize=(12, 3))\n", "\n", "(read_sql(sa.select(sa.literal('n_countries').label('value'),\n", " sa.func.count().label('count'),\n", " sa.func.sum(n_countries).label('sum'),\n", " sa.func.min(n_countries).label('min'),\n", " sa.func.max(n_countries).label('max'),\n", " sa.func.avg(n_countries).label('mean')),\n", " index_col='value')\n", " .rename_axis(None))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## altname" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT altnameprovider.name AS altname_provider, count(DISTINCT altname.languoid_id) AS n_languoids \n", "FROM altnameprovider JOIN altname ON altnameprovider.id = altname.provider_id GROUP BY altnameprovider.name ORDER BY n_languoids, altname_provider\n", "[generated in 0.00095s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from treedb.models import Altname, AltnameProvider\n", "\n", "select_provider_nlanguoids = (sa.select(AltnameProvider.name.label('altname_provider'),\n", " sa.func.count(sa.distinct(Altname.languoid_id)).label('n_languoids'))\n", " .join_from(AltnameProvider, Altname)\n", " .group_by(AltnameProvider.name)\n", " .order_by('n_languoids', 'altname_provider'))\n", "\n", "(read_sql(select_provider_nlanguoids, index_col='altname_provider')\n", " .plot.barh());" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT languoid_naltnames.n_altnames, count(*) AS n_languoids \n", "FROM (SELECT languoid.id AS id, count(*) AS n_altnames \n", "FROM languoid LEFT OUTER JOIN altname ON languoid.id = altname.languoid_id GROUP BY languoid.id) AS languoid_naltnames GROUP BY languoid_naltnames.n_altnames ORDER BY languoid_naltnames.n_altnames\n", "[generated in 0.00077s] ()\n", "ROLLBACK\n", "BEGIN (implicit)\n", "SELECT ? AS value, count(*) AS count, sum(languoid_naltnames.n_altnames) AS sum, min(languoid_naltnames.n_altnames) AS min, max(languoid_naltnames.n_altnames) AS max, avg(languoid_naltnames.n_altnames) AS mean \n", "FROM (SELECT languoid.id AS id, count(*) AS n_altnames \n", "FROM languoid LEFT OUTER JOIN altname ON languoid.id = altname.languoid_id GROUP BY languoid.id) AS languoid_naltnames\n", "[generated in 0.00072s] ('n_altnames',)\n", "ROLLBACK\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", "
countsumminmaxmean
n_altnames2628516661012616.338596
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_altnames 26285 166610 1 261 6.338596" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtIAAADRCAYAAADhYVUtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAfpElEQVR4nO3de5SddX3v8fd3ZnIlIQQSEJLYRIQeJcRQQvBCWzxZFdrDEvSgRlwCwiJe4EBXT9dRe46KnmKxarWsChw8cmupSIMcqAssKJwiNgITGnMhAlECjESIqDEcSDKX7/ljPzvshLlk7z2ZPTPP+7XWrHn297ns38zDDp/88n2eJzITSZIkSfVpa/UAJEmSpLHIIC1JkiQ1wCAtSZIkNcAgLUmSJDXAIC1JkiQ1wCAtSZIkNaCj1QNo1KxZs3L+/PmtHoYkSZLGudWrV/8yM2fvXR+zQXr+/Pl0dna2ehiSJEka5yLiqf7qtnZIkiRJDTBIS5IkSQ0wSEuSJEkNGLM90pIkSeNRd3c3XV1d7Nixo9VDKZ3Jkyczd+5cJkyYsE/bG6Tr8NKuHp751cvMnTmFAyb5q5MkScOvq6uL6dOnM3/+fCKi1cMpjczkhRdeoKuriwULFuzTPrZ21GFd1zZO+er93L3hF60eiiRJGqd27NjBIYccYogeYRHBIYccUte/BBik69DRXvl1ff8nz7d4JJIkaTwzRLdGvb93g3QdOtoqv9zu3r4Wj0SSJEmtNmSjb0RcC5wGPJ+ZC4vapcAFwNZis7/IzDuLdZ8Ezgd6gYsz81+K+vHA9cAU4E7gkszMiJgE3AgcD7wAvC8zNw/Tzzes2osgvavHIC1JkkbGkr+8h1++uGvYjjdr2kQ6/8cfDdvxzj33XE477TTOPPPMYTtmI66++mqmTp3K2WefvUd98+bNnHbaaaxfv37Y33Nfrpi7Hvg7KmG31lcy80u1hYh4I7AcOAY4AvheRBydmb3AVcAK4EdUgvSpwF1UQvevM/P1EbEc+ALwvoZ/ov1oQtHa0d2bLR6JJEkqi+EM0fvjeKPFRz7ykRF/zyFbOzLzfuBX+3i804GbM3NnZj4JbAKWRsThwIGZuSozk0ooP6NmnxuK5ZXAshiljUHttnZIkqQS2Lx5M294wxu44IILOOaYY3jHO97Byy+/POR+n/vc5zjhhBNYuHAhK1asoBL74OSTT+bjH/84S5cu5eijj+YHP/gBAC+99BLvfe97WbRoEe973/s48cQT6ezsBGDatGm7j7ty5UrOPfdcAJ566imWLVvGokWLWLZsGU8//TQAl156KV/6UmWOd/Xq1bzpTW/iLW95C1/72td2H2fDhg0sXbqUxYsXs2jRIp544ommfk/N9EhfFBFrI+LaiJhZ1OYAz9Rs01XU5hTLe9f32Ccze4BtwCH9vWFErIiIzojo3Lp1a3+b7Fev9Eg7Iy1Jksa3J554ggsvvJANGzZw0EEHceuttw65z0UXXcTDDz/M+vXrefnll/nOd76ze11PTw8PPfQQX/3qV/nsZz8LwJVXXsnMmTNZu3Ytn/rUp1i9evU+vcfZZ5/N2rVr+cAHPsDFF1/8qm0+9KEPccUVV7Bq1ao96ldffTWXXHIJa9asobOzk7lz5w75foNpNEhfBRwJLAa2AF8u6v3NJOcg9cH2eXUx85rMXJKZS2bPnl3XgIdDR3tlqD3OSEuSpHFuwYIFLF68GIDjjz+ezZs3D7nPfffdx4knnsixxx7Lvffey4YNG3ave/e73/2qYz3wwAMsX74cgIULF7Jo0aIh32PVqlWcddZZAHzwgx/kgQce2GP9tm3b+M1vfsMf/uEf7t6m6i1veQuf//zn+cIXvsBTTz3FlClThny/wTQUpDPzuczszcw+4OvA0mJVFzCvZtO5wLNFfW4/9T32iYgOYAb73koyojraKr+unj6DtCRJGt8mTZq0e7m9vZ2enp5Bt9+xYwcf+9jHWLlyJevWreOCCy7Y457M1ePVHqva+tGf2k7fwe7tvHdHcGYOeBu7s846izvuuIMpU6ZwyimncO+99w76Mw2loSBd9DxXvQuoXgZ5B7A8IiZFxALgKOChzNwCbI+INxf9z2cDt9fsc06xfCZwbw72W22hV2akR+XwJEmSWqYadmfNmsWLL77IypUrh9znpJNO4pZbbgHg0UcfZd26dbvXHXbYYWzcuJG+vj5uu+223fW3vvWt3HzzzQDcdNNNnHTSSXsc86CDDmLGjBm7Z6pvuumm3et+9rOf8brXvY6LL76Yd77znaxdu7bBn7ZiX25/903gZGBWRHQBnwFOjojFVFowNgMfBsjMDRFxC/Ao0ANcWNyxA+CjvHL7u7uKL4BvAH8fEZuozEQvb+on2o+qPdI9ozPnS5KkcWjWtInDfvu7/eGggw7iggsu4Nhjj2X+/PmccMIJQ+7zsY99jHPOOYdFixZx3HHHsWjRImbMmAHA5Zdfzmmnnca8efNYuHAhL774IgBXXHEF5513Hl/84heZPXs211133auOe91113HeeecxdepUTjnllN31b33rW/zDP/wDEyZM4DWveQ2f/vSnm/qZY5RO/g5pyZIlWb2qc6Rs39HNsZfeze8cPJV//W9vH9H3liRJ5bBx40be8IY3tHoYI6K3t5fu7m4mT57MT3/6U5YtW8bjjz/OxIn7J+zvi/5+/xGxOjOX7L3tvtxHWoXqfaR7+sbmXz4kSZJGk5deeom3v/3tdHd3k5lcddVVLQ3R9TJI16F6H+leg7QkSSqZCy+8kB/+8Id71C655BI+9KEPNXzM6dOnM9IdBsPJIF2Hao90X3rXDkmSVC61DzZRRTMPZCmdiCACvI20JEnan8bqNWxjXb2/d4N0ndoi6PM/bkmStJ9MnjyZF154wTA9wjKTF154gcmTJ+/zPrZ21Kkt7JGWJEn7z9y5c+nq6mLr1q2tHkrpTJ48ua7Hhhuk6+SMtCRJ2p8mTJjAggULWj0M7QNbO+pUCdKtHoUkSZJazSBdp7bwAgBJkiQZpOvW1uaMtCRJkgzSdWuLcEZakiRJBul6tQXOSEuSJMkgXa+2CMzRkiRJMkjXKbzYUJIkSRik69bujLQkSZIwSNct2gKTtCRJkoYM0hFxbUQ8HxHra2pfjIifRMTaiLgtIg4q6vMj4uWIWFN8XV2zz/ERsS4iNkXEFRERRX1SRHyrqD8YEfOH/8ccPs5IS5IkCfZtRvp64NS9avcACzNzEfA48MmadT/NzMXF10dq6lcBK4Cjiq/qMc8Hfp2Zrwe+Anyh7p9iBFXiv33SkiRJZTdkkM7M+4Ff7VW7OzN7ipc/AuYOdoyIOBw4MDNXZSWB3gicUaw+HbihWF4JLKvOVo9GbcXQvAWeJElSuQ1Hj/R5wF01rxdExL9HxL9GxO8XtTlAV802XUWtuu4ZgCKcbwMO6e+NImJFRHRGROfWrVuHYej1aysifndvX0veX5IkSaNDU0E6Iv470APcVJS2AK/NzOOAPwP+MSIOBPqbYa7O6Q62bs9i5jWZuSQzl8yePbuZoTesOiPd65S0JElSqXU0umNEnAOcBiwr2jXIzJ3AzmJ5dUT8FDiaygx0bfvHXODZYrkLmAd0RUQHMIO9WklGk7ZiSrqn1yAtSZJUZg3NSEfEqcDHgXdm5ks19dkR0V4sv47KRYU/y8wtwPaIeHPR/3w2cHux2x3AOcXymcC9OYqv5Ku2dvT02dohSZJUZkPOSEfEN4GTgVkR0QV8hspdOiYB9xTXBf6ouEPHHwCfi4geoBf4SGZWZ5c/SuUOIFOo9FRX+6q/Afx9RGyiMhO9fFh+sv3E1g5JkiTBPgTpzHx/P+VvDLDtrcCtA6zrBBb2U98BvGeocYwW1SDdbZCWJEkqNZ9sWKdqa0evPdKSJEmlZpCuU3VG2h5pSZKkcjNI12n3XTts7ZAkSSo1g3Sddt+1w9YOSZKkUjNI1yls7ZAkSRIG6bq1h60dkiRJMkjXLXa3djgjLUmSVGYG6TpV79qxq8cgLUmSVGYG6Tq1F1cb7nJGWpIkqdQM0nWqtnbsdEZakiSp1AzSdWq3tUOSJEkYpOtWnZHe1dPb2oFIkiSppQzSdapebLizx9vfSZIklZlBuk7VR4R3e7GhJElSqRmk69S2u7XDIC1JklRmBuk6eR9pSZIkwT4E6Yi4NiKej4j1NbWDI+KeiHii+D6zZt0nI2JTRDwWEafU1I+PiHXFuisiKok0IiZFxLeK+oMRMX+Yf8ZhVQ3StnZIkiSV277MSF8PnLpX7RPA9zPzKOD7xWsi4o3AcuCYYp8rI6K92OcqYAVwVPFVPeb5wK8z8/XAV4AvNPrDjIRqa0d3rxcbSpIkldmQQToz7wd+tVf5dOCGYvkG4Iya+s2ZuTMznwQ2AUsj4nDgwMxclZkJ3LjXPtVjrQSWVWerR6O23U829PZ3kiRJZdZoj/RhmbkFoPh+aFGfAzxTs11XUZtTLO9d32OfzOwBtgGH9PemEbEiIjojonPr1q0NDr05u1s7vP2dJElSqQ33xYb9zSTnIPXB9nl1MfOazFySmUtmz57d4BCbs7u1o88eaUmSpDJrNEg/V7RrUHx/vqh3AfNqtpsLPFvU5/ZT32OfiOgAZvDqVpJRwxlpSZIkQeNB+g7gnGL5HOD2mvry4k4cC6hcVPhQ0f6xPSLeXPQ/n73XPtVjnQncW/RRj0retUOSJEkAHUNtEBHfBE4GZkVEF/AZ4HLglog4H3gaeA9AZm6IiFuAR4Ee4MLMrF6V91EqdwCZAtxVfAF8A/j7iNhEZSZ6+bD8ZPtJ9TLInQZpSZKkUhsySGfm+wdYtWyA7S8DLuun3gks7Ke+gyKIjwXtPiJckiRJ+GTDutnaIUmSJDBI1233XTu82FCSJKnUDNJ1ckZakiRJYJCuW+x+RLhBWpIkqcwM0nWqXmzY22drhyRJUpkZpOsU1dYOg7QkSVKpGaTrVL3YsMfWDkmSpFIzSNeperGhrR2SJEnlZpCuk0FakiRJYJCuW7W1wyAtSZJUbgbpOrV51w5JkiRhkK5bMSFNbxqkJUmSyswgXafq7e/6nJGWJEkqNYN0g3rN0ZIkSaVmkG6QM9KSJEnlZpBuUB8GaUmSpDJrOEhHxO9GxJqar99GxJ9GxKUR8fOa+p/U7PPJiNgUEY9FxCk19eMjYl2x7oqoNiKPYk5IS5IklVvDQTozH8vMxZm5GDgeeAm4rVj9leq6zLwTICLeCCwHjgFOBa6MiPZi+6uAFcBRxdepjY5rpKR37ZAkSSq14WrtWAb8NDOfGmSb04GbM3NnZj4JbAKWRsThwIGZuSor6fRG4IxhGtd+44y0JElSuQ1XkF4OfLPm9UURsTYiro2ImUVtDvBMzTZdRW1Osbx3/VUiYkVEdEZE59atW4dp6I1xRlqSJKncmg7SETEReCfwT0XpKuBIYDGwBfhyddN+ds9B6q8uZl6TmUsyc8ns2bObGXbTzNGSJEnlNhwz0n8MPJKZzwFk5nOZ2ZuZfcDXgaXFdl3AvJr95gLPFvW5/dRHNWekJUmSym04gvT7qWnrKHqeq94FrC+W7wCWR8SkiFhA5aLChzJzC7A9It5c3K3jbOD2YRjXfmWMliRJKreOZnaOiKnAHwEfrin/dUQsppI1N1fXZeaGiLgFeBToAS7MzN5in48C1wNTgLuKr1HNCWlJkqRyaypIZ+ZLwCF71T44yPaXAZf1U+8EFjYzlpFmjpYkSSo3n2woSZIkNcAg3YQ+byYtSZJUWgbpJvQYpCVJkkrLIN2EXoO0JElSaRmkm9DT19fqIUiSJKlFDNINCqCn1xlpSZKksjJIN8EeaUmSpPIySDfBHmlJkqTyMkg3obvXHmlJkqSyMkg3wRlpSZKk8jJINyjxrh2SJEllZpBughcbSpIklZdBugne/k6SJKm8DNJNcEZakiSpvAzSTei1R1qSJKm0mgrSEbE5ItZFxJqI6CxqB0fEPRHxRPF9Zs32n4yITRHxWEScUlM/vjjOpoi4IiKimXGNlO4eg7QkSVJZDceM9Nszc3FmLilefwL4fmYeBXy/eE1EvBFYDhwDnApcGRHtxT5XASuAo4qvU4dhXPvdTu8jLUmSVFr7o7XjdOCGYvkG4Iya+s2ZuTMznwQ2AUsj4nDgwMxclZkJ3Fizz6i20xlpSZKk0mo2SCdwd0SsjogVRe2wzNwCUHw/tKjPAZ6p2berqM0plveuj3q7ug3SkiRJZdXR5P5vy8xnI+JQ4J6I+Mkg2/bX95yD1F99gEpYXwHw2te+tt6xDrtdtnZIkiSVVlMz0pn5bPH9eeA2YCnwXNGuQfH9+WLzLmBeze5zgWeL+tx+6v293zWZuSQzl8yePbuZoQ+LXbZ2SJIklVbDQToiDoiI6dVl4B3AeuAO4Jxis3OA24vlO4DlETEpIhZQuajwoaL9Y3tEvLm4W8fZNfuMajt7els9BEmSJLVIM60dhwG3FXeq6wD+MTO/GxEPA7dExPnA08B7ADJzQ0TcAjwK9AAXZmY1iX4UuB6YAtxVfI163T7ZUJIkqbQaDtKZ+TPgTf3UXwCWDbDPZcBl/dQ7gYWNjqVV7JGWJEkqL59s2AR7pCVJksrLIN2EHmekJUmSSssg3QRbOyRJksrLIN2E7h4vNpQkSSorg3QTnJGWJEkqL4N0E+yRliRJKi+DdBO8j7QkSVJ5GaSbYGuHJElSeRmkm+B9pCVJksrLIN2EbmekJUmSSssg3QR7pCVJksrLIN0EZ6QlSZLKyyDdBIO0JElSeRmkm2CQliRJKi+DdBN6++yRliRJKiuDdBN6vNhQkiSptBoO0hExLyLui4iNEbEhIi4p6pdGxM8jYk3x9Sc1+3wyIjZFxGMRcUpN/fiIWFesuyIiorkfa2T0OCMtSZJUWh1N7NsD/NfMfCQipgOrI+KeYt1XMvNLtRtHxBuB5cAxwBHA9yLi6MzsBa4CVgA/Au4ETgXuamJsI8LWDkmSpPJqeEY6M7dk5iPF8nZgIzBnkF1OB27OzJ2Z+SSwCVgaEYcDB2bmqsxM4EbgjEbHNZKckZYkSSqvYemRjoj5wHHAg0XpoohYGxHXRsTMojYHeKZmt66iNqdY3rs+6vWmQVqSJKmsmg7SETENuBX408z8LZU2jSOBxcAW4MvVTfvZPQep9/deKyKiMyI6t27d2uzQm9br7e8kSZJKq6kgHRETqITomzLz2wCZ+Vxm9mZmH/B1YGmxeRcwr2b3ucCzRX1uP/VXycxrMnNJZi6ZPXt2M0MfFnZ2SJIklVczd+0I4BvAxsz8m5r64TWbvQtYXyzfASyPiEkRsQA4CngoM7cA2yPizcUxzwZub3RcI8nWDkmSpPJq5q4dbwM+CKyLiDVF7S+A90fEYirtGZuBDwNk5oaIuAV4lModPy4s7tgB8FHgemAKlbt1jPo7dgD0OSUtSZJUWg0H6cx8gP77m+8cZJ/LgMv6qXcCCxsdS6v0OSMtSZJUWj7ZsAlOSEuSJJWXQboJzkhLkiSVl0G6CTu6+9jR3dPqYUiSJKkFDNJN+u7651o9BEmSJLWAQbpJ336ka+iNJEmSNO4YpJu0+ulft3oIkiRJagGDdJP+385efv3SrlYPQ5IkSSPMID0MVnY+0+ohSJIkaYQZpIfBd9ZuafUQJEmSNMIM0sNg45bftnoIkiRJGmEG6WGwqze5a52z0pIkSWVikB4ml9z87/zGiw4lSZJKwyA9THb1Ju/9X6tIHxsuSZJUCh2tHsB48vhzL3L8X36PP174Gk56/SyOOWIG8w6eQkS0emiSJEkaZgbpYbbt5W5uevBpbnrwaQCmT+rg94+exclHH8qs6ROZ3NHOvIOnMnemAVuSJGksM0gPs96+V1o72gJe7u7lznW/4M51v9hju+mTOzj6sOlM6mijo72NRXNmcNJRszjmiAOZNqnDkC1JkjTKjZogHRGnAn8LtAP/OzMvb/GQmtaX0NdPz3RbwMu7eln91CuPF7//8a383X2bAJjY3sYh0yYye/okXnPgZA49cBKzp01mysQ2+rKy/shDp/H6Q6cxY8oEJhdhXJIkSSNnVATpiGgHvgb8EdAFPBwRd2Tmo60d2f4xUMAGmNAeJMnz23fyi207WMu2fTrmzKkTOGH+wRxzxAx6M9nV08chB0xkzswpTJnQzos7e9jV08cBkzo4cEoHrzlwMkccNIVJHW1sL9YdPHUibW3OhEuSJO2LURGkgaXApsz8GUBE3AycDozLID2Y7t59v+tHewTtbQEB23f0cPejz3H3o8/V9X5tUQn2AB1twaHTJ3HwAROZNrmDAyZ2MGViO5M62unp66O7t4/JHe1Mn9zBxI42dvX0sau3Etq7e/s4YFI7Bx8wkemTJzCxvY2O9ijWJVMntjPzgIlMm9RORBBAW0TxBUTldXvbK7XqchTrdn+HyjGC3dsGldev1F5Z39EWdLQHE9rbaG8LevuSHd297Ort23283fu0sefrvY7ZFth2I0mSgNETpOcAz9S87gJObNFYxozeTHrrCN61IipBPDPpKGahk2TLth08u23HcA5zXKqEeXb/paCarSuvKhtEzbav1PYthCeV87r3P1xUX2Ymma+8rn2f6l8AqI6xOpisvn71WGp/ltqfr7Kudsz5qjEFNRsXY6s9br13hKy+X+1x2mrHsMfvtvjB9hzNIMeubyySpNGjvS34t0/8x1E1oTVagnR/v5FX/e83IlYAK4qXL0bEY/t1VHuaBfyybeqMg9unHfLaEXzflqhkqra2fcx9Y1LvS9tonzqj1cPQMPKcjj+e0/HHczr+jOQ5bfvUU+vo7W7FE/B+p7/iaAnSXcC8mtdzgWf33igzrwGuGalB1YqIzsxc0or31v4REZ092573nI4jntPxx3M6/nhOx58yn9PRcquHh4GjImJBREwElgN3tHhMkiRJ0oBGxYx0ZvZExEXAv1C5/d21mbmhxcOSJEmSBjQqgjRAZt4J3NnqcQyiJS0l2q88p+OP53T88ZyOP57T8ae05zSy3kvqJUmSJI2aHmlJkiRpTDFI74OIODUiHouITRHxiVaPR42JiM0RsS4i1kREZ1E7OCLuiYgniu8zWz1ODSwiro2I5yNifU1twHMYEZ8sPrePRcQprRm1BjPAOb00In5efFbXRMSf1KzznI5yETEvIu6LiI0RsSEiLinqflbHqEHOaek/q7Z2DKF4fPnj1Dy+HHj/eH18+XgWEZuBJZn5y5raXwO/yszLi78kzczMj7dqjBpcRPwB8CJwY2YuLGr9nsOIeCPwTSpPTj0C+B5wdGb2tmj46scA5/RS4MXM/NJe23pOx4CIOBw4PDMfiYjpwGrgDOBc/KyOSYOc0/dS8s+qM9JD2/348szcBVQfX67x4XTghmL5Bip/MGiUysz7gV/tVR7oHJ4O3JyZOzPzSWATlc+zRpEBzulAPKdjQGZuycxHiuXtwEYqTzD2szpGDXJOB1Kac2qQHlp/jy8f7D8ejV4J3B0Rq4unZAIclplboPIHBXBoy0anRg10Dv3sjm0XRcTaovWj2gLgOR1jImI+cBzwIH5Wx4W9zimU/LNqkB7aPj2+XGPC2zLz94A/Bi4s/klZ45ef3bHrKuBIYDGwBfhyUfecjiERMQ24FfjTzPztYJv2U/O8jkL9nNPSf1YN0kPbp8eXa/TLzGeL788Dt1H5Z6bnit6vag/Y860boRo00Dn0sztGZeZzmdmbmX3A13nln4Q9p2NEREygErhuysxvF2U/q2NYf+fUz6pBel/4+PJxICIOKC6QICIOAN4BrKdyLs8pNjsHuL01I1QTBjqHdwDLI2JSRCwAjgIeasH4VKdq2Cq8i8pnFTynY0JEBPANYGNm/k3NKj+rY9RA59TP6ih6suFo5ePLx43DgNsqfxbQAfxjZn43Ih4GbomI84Gngfe0cIwaQkR8EzgZmBURXcBngMvp5xxm5oaIuAV4FOgBLhyPV4yPdQOc05MjYjGVfwreDHwYPKdjyNuADwLrImJNUfsL/KyOZQOd0/eX/bPq7e8kSZKkBtjaIUmSJDXAIC1JkiQ1wCAtSZIkNcAgLUmSJDXAIC1JkiQ1wCAtSZIkNcAgLUljXERcGhF/XiyfGxFHtHpMklQGBmlJGl/OBQzSkjQCDNKS1EIRMT8iNkbE1yNiQ0TcHRFTBtj2goh4OCJ+HBG3RsTUvdafCSwBboqINRExJSI2R8RnI+KRiFgXEf+h2HZpRPxbRPx78f13i/q5EfF/IuKfI+LJiLgoIv6s2O5HEXFwsd2REfHdiFgdET+oOe57ImJ9Mcb79+fvTpJazSAtSa13FPC1zDwG+A3wnwfY7tuZeUJmvgnYCJxfuzIzVwKdwAcyc3Fmvlys+mVm/h5wFfDnRe0nwB9k5nHAp4HP1xxqIXAWsBS4DHip2G4VcHaxzTXAf8nM44tjXlnUPw2cUozxnfX9GiRpbOlo9QAkSTyZmWuK5dXA/AG2WxgRfwkcBEwD/mUfj//tmmO/u1ieAdwQEUcBCUyo2f6+zNwObI+IbcA/F/V1wKKImAa8FfiniKjuM6n4/kPg+oi4peZ9JWlcMkhLUuvtrFnuBfpt7QCuB87IzB9HxLnAyXUev5dX/tz/n1QC87siYj7wfwcYT1/N675i/zbgN5m5eO83ysyPRMSJwH8C1kTE4sx8YR/HKUljiq0dkjR2TAe2RMQE4AMDbLO92G4oM4CfF8vn1jOIzPwt8GREvAcgKt5ULB+ZmQ9m5qeBXwLz6jm2JI0lBmlJGjs+BTwI3EOlx7k/1wNXVy82HORYfw38VUT8EGhvYCwfAM6PiB8DG4DTi/oXi4sa1wP3Az9u4NiSNCZEZrZ6DJIkSdKY44y0JEmS1AAvNpSkUSYivga8ba/y32bmda0YjySpf7Z2SJIkSQ2wtUOSJElqgEFakiRJaoBBWpIkSWqAQVqSJElqgEFakiRJasD/B7OYlmoX97SRAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_altnames = (sa.select(Languoid.id, sa.func.count().label('n_altnames'))\n", " .outerjoin_from(Languoid, Altname)\n", " .group_by(Languoid.id)\n", " .alias('languoid_naltnames')\n", " .c.n_altnames)\n", "\n", "select_la_dist = (sa.select(n_altnames, sa.func.count().label('n_languoids'))\n", " .group_by(n_altnames)\n", " .order_by(n_altnames))\n", "\n", "_ = read_sql(select_la_dist, index_col='n_altnames')\n", "\n", "_.plot.area(figsize=(12, 3))\n", "\n", "(read_sql(sa.select(sa.literal('n_altnames').label('value'),\n", " sa.func.count().label('count'),\n", " sa.func.sum(n_altnames).label('sum'),\n", " sa.func.min(n_altnames).label('min'),\n", " sa.func.max(n_altnames).label('max'),\n", " sa.func.avg(n_altnames).label('mean')),\n", " index_col='value')\n", " .rename_axis(None))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## source" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sourceprovider.name AS provider, languoid.level, count(*) AS n_sources \n", "FROM sourceprovider JOIN source ON sourceprovider.id = source.provider_id JOIN languoid ON languoid.id = source.languoid_id GROUP BY sourceprovider.name, languoid.level ORDER BY provider, n_sources DESC\n", "[generated in 0.00080s] ()\n", "ROLLBACK\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_sources
providerlevel
glottologlanguage193508
family2464
dialect1819
\n", "
" ], "text/plain": [ " n_sources\n", "provider level \n", "glottolog language 193508\n", " family 2464\n", " dialect 1819" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from treedb.models import Source, SourceProvider\n", "\n", "select_provider_nsources = (sa.select(SourceProvider.name.label('provider'),\n", " Languoid.level,\n", " sa.func.count().label('n_sources'))\n", " .join_from(SourceProvider, Source).join(Languoid)\n", " .group_by(SourceProvider.name, Languoid.level)\n", " .order_by('provider', sa.desc('n_sources')))\n", "\n", "read_sql(select_provider_nsources, index_col=['provider', 'level'])" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT lang_nsources.n_sources, count(*) AS n_languoids \n", "FROM (SELECT languoid.id AS id, count(source.languoid_id) AS n_sources \n", "FROM languoid LEFT OUTER JOIN source ON languoid.id = source.languoid_id GROUP BY languoid.id) AS lang_nsources GROUP BY lang_nsources.n_sources ORDER BY n_languoids\n", "[generated in 0.00073s] ()\n", "ROLLBACK\n", "BEGIN (implicit)\n", "SELECT ? AS value, count(*) AS count, sum(lang_nsources.n_sources) AS sum, min(lang_nsources.n_sources) AS min, max(lang_nsources.n_sources) AS max, avg(lang_nsources.n_sources) AS mean \n", "FROM (SELECT languoid.id AS id, count(source.languoid_id) AS n_sources \n", "FROM languoid LEFT OUTER JOIN source ON languoid.id = source.languoid_id GROUP BY languoid.id) AS lang_nsources\n", "[generated in 0.00098s] ('n_sources',)\n", "ROLLBACK\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", "
countsumminmaxmean
n_sources26285197791015497.524862
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_sources 26285 197791 0 1549 7.524862" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAARQAAADYCAYAAAAqLRwCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAT3ElEQVR4nO3de5DV5X3H8fcnBkGqAUVFE6CLBlMV1zUgqDGJhlRNwpjGekGtoFiIFUcyaSZqGg3JjBmspqakXkaraCtRCERrE5NoxGnUemMNchEVL4vZ6CBivFDAAH77x3nOelb3es4D5+zu5zXzm/Pb53c5z2HZz/xu5/soIjAzy+Ej1e6AmfUeDhQzy8aBYmbZOFDMLBsHipll40Axs2w+Wu0OlGvPPfeMurq6anfDrM9pbGx8PSL2amtZjw2Uuro6lixZUu1umPU5kta0t6zTUx5JN0t6TdKKkrb5kpamqUnS0tReJ2lTybLrS7YZI2m5pOclzZGk1N4/7e95SY9Jqqvkw5pZ9XTlGsotwAmlDRFxWkQ0REQDsAj4ecniF4rLIuK8kvbrgOnAqDQV93ku8KeI+CRwNXBFOR/EzKqv00CJiN8Bb7S1LB1lnArc3tE+JO0LfCwiHonCs/7/AfxNWvxV4NY0vxCYUDx6MbOepdJrKJ8F1kbE6pK2kZJ+D7wNfDciHgQ+ATSXrNOc2kivfwCIiK2S3gKGAK9/8M0kTadwlMOIESMq7Lr1BFu2bKG5uZnNmzdXuyt9zoABAxg2bBj9+vXr8jaVBsrptD46eRUYERHrJY0B7pJ0MNDWEUfxW4kdLWvdGHEDcAPA2LFj/a3GPqC5uZnddtuNuro6fOC640QE69evp7m5mZEjR3Z5u7KfQ5H0UeAkYH5JJ96NiPVpvhF4ATiAwhHJsJLNhwGvpPlmYHjJPgfRzimW9T2bN29myJAhDpMdTBJDhgzp9pFhJUcoXwSeiYiWUxlJewFvRMQ2SftRuPj6YkS8IekdSUcAjwGTgZ+kze4GpgCPACcDi6MGayrUXfzLandhu2qa/ZVqd6FdDpPqKOffvSu3jW+n8Mf+KUnNks5Niybx4YuxnwOWSXqKwgXW8yKieLTxD8C/A89TOHL5VWq/CRgi6Xngm8DF3f4UZlYTOj1CiYjT22k/u422RRRuI7e1/hJgdBvtm4FTOuuHGeQ/Usx9ZHb22WczceJETj755Kz77a7rr7+egQMHMnny5FbtTU1NTJw4kRUrVrSzZWV67JOyZta+8847r/OVtgN/OdCsE01NTRx44IFMmzaNgw8+mOOOO45NmzZ1ut0PfvADDj/8cEaPHs306dMpXho85phjuOiiixg3bhwHHHAADz74IAAbN27k1FNPpb6+ntNOO43x48e3fL1k1113bdnvwoULOfvsswFYs2YNEyZMoL6+ngkTJvDyyy8DMGvWLK666ioAGhsbOfTQQznyyCO55pprWvazcuVKxo0bR0NDA/X19axeXfr0R3kcKGZdsHr1ambMmMHKlSsZPHgwixa1eWbfygUXXMATTzzBihUr2LRpE7/4xS9alm3dupXHH3+cH//4x3z/+98H4Nprr2X33Xdn2bJlXHrppTQ2NnbpPSZPnsyyZcs488wzufDCCz+0zjnnnMOcOXN45JFHWrVff/31zJw5k6VLl7JkyRKGDRv2oW27y4Fi1gUjR46koaEBgDFjxtDU1NTpNg888ADjx4/nkEMOYfHixaxcubJl2UknnfShfT300ENMmjQJgNGjR1NfX9/pezzyyCOcccYZAJx11lk89NBDrZa/9dZbvPnmm3z+859vWafoyCOP5Ic//CFXXHEFa9asYZdddun0/TrjQDHrgv79+7fM77TTTmzdurXD9Tdv3sz555/PwoULWb58OdOmTWv1TEdxf6X76uhpidJbuB09G/LBW70R0e7t3zPOOIO7776bXXbZheOPP57Fixd3+Jm6woFith0U/+j33HNPNmzYwMKFCzvd5uijj2bBggUAPP300yxfvrxl2dChQ1m1ahXvvfced955Z0v7UUcdxR133AHAvHnzOProo1vtc/DgwQwaNKjlyGXevHkty1588UX2228/LrzwQk488USWLVtW5qd9n+/yWI9Syw/glRo8eDDTpk3jkEMOoa6ujsMPP7zTbc4//3ymTJlCfX09hx12GPX19QwaNAiA2bNnM3HiRIYPH87o0aPZsGEDAHPmzGHq1KlceeWV7LXXXsydO/dD+507dy5Tp05l4MCBHH/88S3t8+fP57bbbqNfv37ss88+XHbZZRV/btXgQ6ldMnbs2NiRBZb8pGx1rFq1igMPPLDa3dghtm3bxpYtWxgwYAAvvPACEyZM4LnnnmPnnXeuWp/a+veX1BgRY9ta30coZjVi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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_sources = (sa.select(Languoid.id,\n", " sa.func.count(Source.languoid_id).label('n_sources'))\n", " .outerjoin_from(Languoid, Source)\n", " .group_by(Languoid.id)\n", " .alias('lang_nsources')\n", " .c.n_sources)\n", "\n", "select_nsources_nlangs = (sa.select(n_sources, sa.func.count().label('n_languoids'))\n", " .group_by(n_sources)\n", " .order_by('n_languoids'))\n", "\n", "_ = read_sql(select_nsources_nlangs, index_col='n_sources')\n", "(_.groupby(_.index != 0).sum().rename_axis('n_sources')\n", " .rename(index={False: '= 0', True: '> 0'}).plot.bar(figsize=(4, 3)))\n", "(_.drop(0).plot.area(figsize=(8, 3), logx=True)\n", " .xaxis.set_major_formatter(mpl.ticker.ScalarFormatter()))\n", "\n", "(read_sql(sa.select(sa.literal('n_sources').label('value'),\n", " sa.func.count().label('count'),\n", " sa.func.sum(n_sources).label('sum'),\n", " sa.func.min(n_sources).label('min'),\n", " sa.func.max(n_sources).label('max'),\n", " sa.func.avg(n_sources).label('mean')),\n", " index_col='value')\n", " .rename_axis(None))" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT lang_nsources.level, lang_nsources.n_sources, count(*) AS n_languoids \n", "FROM (SELECT languoid.id AS id, languoid.level AS level, count(source.languoid_id) AS n_sources \n", "FROM languoid LEFT OUTER JOIN source ON languoid.id = source.languoid_id GROUP BY languoid.id, languoid.level) AS lang_nsources GROUP BY lang_nsources.level, lang_nsources.n_sources ORDER BY n_languoids\n", "[generated in 0.00079s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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NEhVufXWWxk6dCinnXYa27Zto6CgAIDc3FyGDx8OwKhRo9i0aRPl5eVUVVUxZswYAH74wx82azvPP/88I0eOZMSIEaxZs4bPPvuMzz//nEMPPZTc3FyAnQa7WLRoETNnzmT48OGcfPLJBAIBNm/evF/72vHuMfcZRsXY61m94u8c7/fz3ZpatnncvJSZyUtZGeR7Wn+X15ev58LXLuSZ7z2D1+Vt9e0bY0x798wzz1BUVMSKFSvwer3079+/bujH+sM+ut1u/H4/exoHwuPx4DhO3fsd9WzcuJF7772XZcuWkZOTw9SpUwkEAnusS1WZN28eAwcO3N9drNPxzpiB7O4DGBt14XaUpSkpFLvdXF1ewb+3bOfveYWMr67B28pn0WtL1zJ14VQizp7HBjXGGLO7iooKevXqhdfrZfHixXz99dd7LJ+Tk0NWVhYffvghAHPmzKlb1r9/fz755BMcx2HLli0sXRobmbiyspKMjAyys7MpKChg4cKFABxxxBF89dVXbNq0CYDnnnuurq7x48fz17/+tS55r1y5cr/3teOdMdeTARwTjN3f3exxs9nr5fBQmHuLSigvKePVzHReyMzkixRfq8SzqngV337226S4UxARXLhir+JCiL26JDav/vv65erPq//+gIwDuP3bt5Odkt0q+2KMMa3pwgsvZOLEiYwePZrhw4dzxBFHNLnO448/zuWXX05GRgYnn3wy2dmx78exY8eSm5vLkCFDOOqooxg5ciQAw4YNY8SIEQwePJhDDz2UsWPHApCWlsZDDz3EmWeeSY8ePTjmmGPqtvHrX/+an//85wwdOhRVpX///rzyyiv7ta8dcthHPv4nLLwJwrW7LQoDq1N8hMXF8EAAH7DG5+PFrAxey8igyt2yFxE84gGJv1FQdv/8d5rXnDJxPdN6Mn/SfDJ9ne+5P2NM4u02VGE7e1yqurq67jnomTNnkpeXx/33379fdakqV199NQMGDOCGG25o9vo27OMeeIERwdh4okUuF+t9PnpHo9xeUsavSst5Mz2NF7MyWZaagorsubJ9ENEIDeTUhCjyF9WNdpXmSWuZjRhjOq929szxq6++yt13300kEuGQQw5h1qxZ+1zXY489xuzZswmFQowYMYIrr7wycYHuotOdMTdEgc+9Xso8HoYEAmSpsrVeg7GCJDQY2x/9u/Rn3lnz8Llb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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "select_lang_nsources = (sa.select(Languoid.id, Languoid.level,\n", " sa.func.count(Source.languoid_id).label('n_sources'))\n", " .outerjoin_from(Languoid, Source)\n", " .group_by(Languoid.id, Languoid.level)\n", " .alias('lang_nsources'))\n", "\n", "select_ln_nlangs = (sa.select(select_lang_nsources.c.level,\n", " select_lang_nsources.c.n_sources,\n", " sa.func.count().label('n_languoids'))\n", " .group_by(select_lang_nsources.c.level, select_lang_nsources.c.n_sources)\n", " .order_by('n_languoids'))\n", "\n", "_ = read_sql(select_ln_nlangs).pivot(index='n_sources', columns='level', values='n_languoids')\n", "(_.groupby(_.index != 0).sum()[list(treedb.LEVEL)].rename_axis('n_sources')\n", " .rename(index={False: '= 0', True: '> 0'}).plot.bar(figsize=(4, 3)))\n", "(_.drop(0)[list(treedb.LEVEL)].plot.area(figsize=(8, 3), logx=True)\n", " .xaxis.set_major_formatter(mpl.ticker.ScalarFormatter()))" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT bibfile.name AS bibfile, count(*) AS n_used \n", "FROM bibfile JOIN bibitem ON bibfile.id = bibitem.bibfile_id GROUP BY bibfile.name ORDER BY n_used DESC\n", "[generated in 0.00086s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtIAAAFGCAYAAABHdXhiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABiF0lEQVR4nO3dd5hkRdn+8e9NkCASXRBZYBcFJAhIEhQlKaIooIJiAhEFFBWzYEJRfI2vIgrIixJVkiKgKCA5wy4sGX4goq4iIEFRAQnP74+neqend8I53T3dPbv357rmmukzU9XVPd2n61Q99ZQiAjMzMzMzq2eBfjfAzMzMzGwyckfazMzMzKwN7kibmZmZmbXBHWkzMzMzsza4I21mZmZm1gZ3pM3MzMzM2rBQvxvQruc+97kxbdq0fjfDzMzMzOZxM2fO/HtETGk9Pmk70tOmTWPGjBn9boaZmZmZzeMk/XGk45VCOyTdI+kmSbMkzSjHlpV0nqQ7y/dlmv7+QEl3SbpD0muajm9U6rlL0vckqRxfRNLJ5fjVkqZ19GjNzMzMzCZYnRjprSNig4jYuNw+ADg/IlYHzi+3kbQ2sBuwDrA9cLikBUuZI4C9gdXL1/bl+F7AwxHxQuA7wNfbf0hmZmZmZhOvk8WGOwHHlZ+PA3ZuOn5SRDwREX8A7gI2lbQisGREXBm5L/nxLWUadZ0GbNsYrTYzMzMzG0RVY6QDOFdSAD+MiKOAFSLiXoCIuFfS8uVvVwKuaio7uxx7svzcerxR5s+lrqck/QNYDvh7cyMk7U2OaLPKKqtUbLqZmZmZNTz55JPMnj2bxx9/vN9NGTiLLrooU6dOZeGFF67091U70i+PiL+WzvJ5km4f429HGkmOMY6PVWb4gezAHwWw8cYbz/V7MzMzMxvb7Nmzec5znsO0adNwAMCQiODBBx9k9uzZTJ8+vVKZSqEdEfHX8v1+4HRgU+C+Eq5B+X5/+fPZwMpNxacCfy3Hp45wfFgZSQsBSwEPVXoEZmZmZlbZ448/znLLLedOdAtJLLfccrVG6scdkZb0bGCBiHi0/LwdcDBwJrAH8LXy/YxS5Ezgp5L+F3g+uajwmoh4WtKjkjYDrgZ2Bw5rKrMHcCWwC3BBiaOubNoBvx73b+752g51qjQzMzObJ7kTPbK6z0uV0I4VgNNLxQsBP42I30q6FjhF0l7An4BdASLiFkmnALcCTwH7RcTTpa73A8cCiwG/KV8APwJOkHQXORK9W61HYWZmZmbWY+N2pCPibmD9EY4/CGw7SplDgENGOD4DWHeE449TOuJmZmZm1jtVZvXrmAwRAMceeywzZszg+9//fkf1dJL+zszMzMxsvuWOtJmZmZn11D333MNaa63F+973PtZZZx222247HnvssRH/dquttmLGjBkA/P3vf2fatGkA3HLLLWy66aZssMEGrLfeetx5550AnHjiiXOO77PPPjz9dEYYH3PMMayxxhpsueWWXH755V15HO5Im5mZmVnP3Xnnney3337ccsstLL300vz85z+vVf7II49k//33Z9asWcyYMYOpU6dy2223cfLJJ3P55Zcza9YsFlxwQX7yk59w7733ctBBB3H55Zdz3nnnceutt3blMVTNI21mZmZm1jXTp09ngw02AGCjjTbinnvuqVV+880355BDDmH27Nm86U1vYvXVV+f8889n5syZbLLJJgA89thjLL/88lx99dVstdVWTJkyBYC3vvWt/L//9/86fgwekTYzMzOznltkkUXm/Lzgggvy1FNPjfh3Cy20EM888wzAsBzPb3/72znzzDNZbLHFeM1rXsMFF1xARLDHHnswa9YsZs2axR133MEXv/hFYGJS/rkjbWZmZmYDa9q0acycOROA0047bc7xu+++m9VWW40Pf/jD7Ljjjtx4441su+22nHbaadx/f+4T+NBDD/HHP/6Rl770pVx00UU8+OCDPPnkk5x66qldaZtDO8zMzMzmY4Oeru4Tn/gEb3nLWzjhhBPYZptt5hw/+eSTOfHEE1l44YV53vOexxe+8AWWXXZZvvKVr7DddtvxzDPPsPDCC/ODH/yAzTbbjC9+8YtsvvnmrLjiimy44YZzFiF2QjU3EBwYG2+8cTRWcIJ3NjQzMzOr4rbbbmOttdbqdzMG1kjPj6SZEbFx6986tMPMzMzMrA0O7TAzMzOzvttvv/3myu+8//77s+eee/apReNzR9rMzMzM+u4HP/hBv5tQm0M7zMzMzOYzk3WN3ESr+7y4I21mZmY2H1l00UV58MEH3ZluERE8+OCDLLroopXLOLTDzMzMbD4ydepUZs+ezQMPPNDvpgycRRddlKlTp1b+e3ekzczMzOYjCy+8MNOnT+93M+YJDu0wMzMzM2uDO9JmZmZm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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from treedb.models import Bibfile, Bibitem\n", "\n", "select_bibfile_nused = (sa.select(Bibfile.name.label('bibfile'), sa.func.count().label('n_used'))\n", " .join_from(Bibfile, Bibitem)\n", " .group_by(Bibfile.name)\n", " .order_by(sa.desc('n_used')))\n", "\n", "(read_sql(select_bibfile_nused, index_col='bibfile')\n", " .plot.bar(figsize=(12, 3)));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## classification" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT classificationref.kind, languoid.level, count(*) AS n_classificationrefs \n", "FROM classificationref JOIN languoid ON languoid.id = classificationref.languoid_id GROUP BY classificationref.kind, languoid.level ORDER BY classificationref.kind, languoid.level\n", "[generated in 0.00088s] ()\n", "ROLLBACK\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", " \n", "
n_classificationrefs
leveldialectfamilylanguage
kind
family8444256
sub114628610213
\n", "
" ], "text/plain": [ " n_classificationrefs \n", "level dialect family language\n", "kind \n", "family 8 444 256\n", "sub 114 6286 10213" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from treedb.models import ClassificationRef\n", "\n", "select_cr_levels = (sa.select(ClassificationRef.kind, Languoid.level,\n", " sa.func.count().label('n_classificationrefs'))\n", " .join_from(ClassificationRef, Languoid)\n", " .group_by(ClassificationRef.kind, Languoid.level)\n", " .order_by('kind', 'level'))\n", "\n", "read_sql(select_cr_levels, index_col=['kind', 'level']).unstack()" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT lang_ncrefs.n_crefs, count(*) AS n_languoids \n", "FROM (SELECT languoid.id AS id, count(*) AS n_crefs \n", "FROM languoid LEFT OUTER JOIN classificationref ON languoid.id = classificationref.languoid_id GROUP BY languoid.id) AS lang_ncrefs GROUP BY lang_ncrefs.n_crefs ORDER BY lang_ncrefs.n_crefs\n", "[generated in 0.00100s] ()\n", "ROLLBACK\n", "BEGIN (implicit)\n", "SELECT ? AS value, count(*) AS count, sum(lang_ncrefs.n_crefs) AS sum, min(lang_ncrefs.n_crefs) AS min, max(lang_ncrefs.n_crefs) AS max, avg(lang_ncrefs.n_crefs) AS mean \n", "FROM (SELECT languoid.id AS id, count(*) AS n_crefs \n", "FROM languoid LEFT OUTER JOIN classificationref ON languoid.id = classificationref.languoid_id GROUP BY languoid.id) AS lang_ncrefs\n", "[generated in 0.00086s] ('n_crefs',)\n", "ROLLBACK\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", "
countsumminmaxmean
n_crefs26285315121111.198859
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_crefs 26285 31512 1 11 1.198859" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_crefs = (sa.select(Languoid.id, sa.func.count().label('n_crefs'))\n", " .outerjoin_from(Languoid, ClassificationRef)\n", " .group_by(Languoid.id)\n", " .alias('lang_ncrefs')\n", " .c.n_crefs)\n", "\n", "select_lcr_dist = (sa.select(n_crefs, sa.func.count().label('n_languoids'))\n", " .group_by(n_crefs)\n", " .order_by(n_crefs))\n", "\n", "_ = read_sql(select_lcr_dist, index_col='n_crefs')\n", "\n", "_.plot.area(figsize=(12, 3))\n", "\n", "(read_sql(sa.select(sa.literal('n_crefs').label('value'),\n", " sa.func.count().label('count'),\n", " sa.func.sum(n_crefs).label('sum'),\n", " sa.func.min(n_crefs).label('min'),\n", " sa.func.max(n_crefs).label('max'),\n", " sa.func.avg(n_crefs).label('mean')),\n", " index_col='value')\n", " .rename_axis(None))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## link" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 7.984s ago] ('table', 'link')\n", "SELECT count(*) AS n_rows \n", "FROM link\n", "[generated in 0.00036s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE link (\n", "\tlanguoid_id VARCHAR(8) NOT NULL, \n", "\tord INTEGER NOT NULL CHECK (ord >= 1), \n", "\turl TEXT NOT NULL CHECK (url != ''), \n", "\ttitle TEXT CHECK (title != ''), \n", "\tscheme TEXT, \n", "\tPRIMARY KEY (languoid_id, ord), \n", "\tUNIQUE (languoid_id, url), \n", "\tCHECK (substr(url, 1, length(scheme) + 3) = scheme || '://'), \n", "\tFOREIGN KEY(languoid_id) REFERENCES languoid (id), \n", "\tCHECK (scheme IN ('http', 'https'))\n", ") WITHOUT ROWID\n", "29722\n" ] } ], "source": [ "from treedb.models import Link\n", "\n", "print_sql(Link)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT link.scheme AS link_scheme, count(*) AS n_links \n", "FROM link GROUP BY link.scheme ORDER BY n_links DESC\n", "[generated in 0.00089s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "select_scheme_nlinks = (sa.select(Link.scheme.label('link_scheme'), sa.func.count().label('n_links'))\n", " .group_by(Link.scheme)\n", " .order_by(sa.desc('n_links')))\n", "\n", "(read_sql(select_scheme_nlinks, index_col='link_scheme')\n", " .plot.pie(y='n_links'));" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT link.url \n", "FROM link\n", "[generated in 0.00093s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from urllib.parse import urlparse\n", "\n", "hosts = collections.Counter(urlparse(url).hostname for url, in treedb.iterrows(sa.select(Link.url)))\n", "\n", "(pd.DataFrame.from_dict(hosts, orient='index', columns=['n_links'])\n", " .sort_values(by='n_links')\n", " .plot.barh());" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## endangerment" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 8.491s ago] ('table', 'endangerment')\n", "SELECT count(*) AS n_rows \n", "FROM endangerment\n", "[generated in 0.00045s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE endangerment (\n", "\tlanguoid_id VARCHAR(8) NOT NULL, \n", "\tstatus VARCHAR NOT NULL, \n", "\tsource_id INTEGER NOT NULL, \n", "\tdate DATETIME NOT NULL, \n", "\tcomment TEXT NOT NULL CHECK (comment != ''), \n", "\tPRIMARY KEY (languoid_id), \n", "\tFOREIGN KEY(languoid_id) REFERENCES languoid (id), \n", "\tFOREIGN KEY(status) REFERENCES endangermentstatus (name), \n", "\tFOREIGN KEY(source_id) REFERENCES endangermentsource (id)\n", ") WITHOUT ROWID\n", "8345\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 8.501s ago] ('table', 'endangermentstatus')\n", "SELECT count(*) AS n_rows \n", "FROM endangermentstatus\n", "[generated in 0.00036s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE endangermentstatus (\n", "\tname VARCHAR NOT NULL CHECK (name != ''), \n", "\tconfig_section VARCHAR NOT NULL CHECK (config_section != ''), \n", "\tordinal INTEGER NOT NULL CHECK (ordinal >= 1), \n", "\tegids VARCHAR NOT NULL CHECK (egids != ''), \n", "\tunesco VARCHAR NOT NULL CHECK (unesco != ''), \n", "\telcat VARCHAR NOT NULL CHECK (elcat != ''), \n", "\ticon VARCHAR NOT NULL CHECK (icon != ''), \n", "\tbibitem_id INTEGER, \n", "\tPRIMARY KEY (name), \n", "\tUNIQUE (config_section), \n", "\tFOREIGN KEY(bibitem_id) REFERENCES bibitem (id)\n", ") WITHOUT ROWID\n", "6\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT sqlite_master.sql \n", "FROM sqlite_master \n", "WHERE sqlite_master.type = ? AND sqlite_master.name = ?\n", "[cached since 8.507s ago] ('table', 'endangermentsource')\n", "SELECT count(*) AS n_rows \n", "FROM endangermentsource\n", "[generated in 0.00043s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CREATE TABLE endangermentsource (\n", "\tid INTEGER NOT NULL, \n", "\tname TEXT NOT NULL CHECK (name != ''), \n", "\tbibitem_id INTEGER, \n", "\tpages TEXT CHECK (pages != ''), \n", "\tPRIMARY KEY (id), \n", "\tUNIQUE (bibitem_id, pages), \n", "\tCHECK ((bibitem_id IS NULL) = (pages IS NULL)), \n", "\tUNIQUE (name), \n", "\tFOREIGN KEY(bibitem_id) REFERENCES bibitem (id)\n", ")\n", "52\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT endangermentstatus.name, endangermentstatus.config_section, endangermentstatus.ordinal, endangermentstatus.egids, endangermentstatus.unesco, endangermentstatus.elcat, endangermentstatus.icon, endangermentstatus.bibitem_id \n", "FROM endangermentstatus ORDER BY endangermentstatus.ordinal\n", "[generated in 0.00100s] ()\n", "ROLLBACK\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", " \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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nameordinalegidsunescoelcaticonbibitem_id
config_section
safenot endangered1<=6asafeat riskc00ff001
vulnerablethreatened26bvulnerablevulnerableca0fb751
definiteshifting37definitely endangeredthreatened/endangeredsff66001
severemoribund48aseverely endangeredseverly endangereddff44001
criticalnearly extinct58bcritically endangeredcritically endangeredtff00001
extinctextinct6>=9extinctdormant/awakeningf0000001
\n", "
" ], "text/plain": [ " name ordinal egids unesco \\\n", "config_section \n", "safe not endangered 1 <=6a safe \n", "vulnerable threatened 2 6b vulnerable \n", "definite shifting 3 7 definitely endangered \n", "severe moribund 4 8a severely endangered \n", "critical nearly extinct 5 8b critically endangered \n", "extinct extinct 6 >=9 extinct \n", "\n", " elcat icon bibitem_id \n", "config_section \n", "safe at risk c00ff00 1 \n", "vulnerable vulnerable ca0fb75 1 \n", "definite threatened/endangered sff6600 1 \n", "severe severly endangered dff4400 1 \n", "critical critically endangered tff0000 1 \n", "extinct dormant/awakening f000000 1 " ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from treedb.models import Endangerment, EndangermentStatus, EndangermentSource\n", "\n", "print_sql(Endangerment)\n", "print_sql(EndangermentStatus)\n", "print_sql(EndangermentSource)\n", "read_sql(sa.select(EndangermentStatus).order_by('ordinal'), index_col='config_section')" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT endangermentsource.name AS source, count(*) AS n_endangerments \n", "FROM endangerment JOIN endangermentsource ON endangermentsource.id = endangerment.source_id GROUP BY endangermentsource.name ORDER BY n_endangerments\n", "[generated in 0.00080s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "e_source = EndangermentSource.name.label('source')\n", "\n", "select_source_nendangerments = (sa.select(e_source, sa.func.count().label('n_endangerments'))\n", " .join_from(Endangerment, EndangermentSource)\n", " .group_by(e_source)\n", " .order_by('n_endangerments'))\n", "\n", "(read_sql(select_source_nendangerments, index_col='source')\n", " .plot.barh());" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example query" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "WITH RECURSIVE tree(child_id, parent_id, steps, terminal) AS \n", "(SELECT child.id AS child_id, child.id AS parent_id, ? AS steps, child.parent_id IS NULL AS terminal \n", "FROM languoid AS child UNION ALL SELECT tree.child_id AS child_id, parent.parent_id AS parent_id, tree.steps + ? AS steps, grandparent.parent_id IS NULL AS terminal \n", "FROM tree JOIN languoid AS parent ON tree.parent_id = parent.id AND parent.parent_id IS NOT NULL LEFT OUTER JOIN languoid AS grandparent ON parent.parent_id = grandparent.id)\n", " SELECT languoid.id, languoid.name, languoid.level, languoid.parent_id, (SELECT group_concat(parent_path.path_part, ?) AS path \n", "FROM (SELECT tree.parent_id AS path_part \n", "FROM tree \n", "WHERE tree.child_id = languoid.id ORDER BY tree.steps DESC) AS parent_path) AS path, (SELECT tree.parent_id \n", "FROM tree \n", "WHERE tree.child_id = languoid.id AND tree.steps > ? AND tree.terminal = 1) AS family_id, (SELECT tree.parent_id \n", "FROM tree \n", "WHERE tree.child_id = languoid.id AND languoid.level = ? AND (EXISTS (SELECT * \n", "FROM languoid AS ancestor \n", "WHERE tree.parent_id = ancestor.id AND ancestor.level = ?))) AS dialect_language_id, languoid.hid, languoid.iso639_3, languoid.latitude, languoid.longitude, (SELECT group_concat(lang_ma.macroarea_name, ?) AS macroareas \n", "FROM (SELECT languoid_macroarea.macroarea_name AS macroarea_name \n", "FROM languoid_macroarea \n", "WHERE languoid_macroarea.languoid_id = languoid.id ORDER BY languoid_macroarea.macroarea_name) AS lang_ma) AS macroareas, (SELECT group_concat(lang_country.country_id, ?) AS countries \n", "FROM (SELECT languoid_country.country_id AS country_id \n", "FROM languoid_country \n", "WHERE languoid_country.languoid_id = languoid.id ORDER BY languoid_country.country_id) AS lang_country) AS countries, (SELECT group_concat(lang_link.printf, ?) AS links \n", "FROM (SELECT CASE WHEN (link.title IS NOT NULL) THEN printf(?, link.title, link.url) ELSE link.url END AS printf \n", "FROM link \n", "WHERE link.languoid_id = languoid.id ORDER BY link.ord) AS lang_link) AS links, (SELECT group_concat(lang_source_glottolog.printf, ?) AS sources_glottolog \n", "FROM (SELECT CASE WHEN (source_glottolog.pages IS NOT NULL AND source_glottolog.\"trigger\" IS NOT NULL) THEN printf(?, source_bibfile.name, source_bibitem.bibkey, source_glottolog.pages, source_glottolog.\"trigger\") WHEN (source_glottolog.pages IS NOT NULL) THEN printf(?, source_bibfile.name, source_bibitem.bibkey, source_glottolog.pages) WHEN (source_glottolog.\"trigger\" IS NOT NULL) THEN printf(?, source_bibfile.name, source_bibitem.bibkey, source_glottolog.\"trigger\") ELSE printf(?, source_bibfile.name, source_bibitem.bibkey) END AS printf \n", "FROM source AS source_glottolog JOIN sourceprovider AS source_provider ON source_provider.id = source_glottolog.provider_id JOIN bibitem AS source_bibitem ON source_bibitem.id = source_glottolog.bibitem_id JOIN bibfile AS source_bibfile ON source_bibfile.id = source_bibitem.bibfile_id \n", "WHERE source_glottolog.languoid_id = languoid.id AND source_provider.name = ? ORDER BY source_bibfile.name, source_bibitem.bibkey) AS lang_source_glottolog) AS sources_glottolog, (SELECT group_concat(lang_altname_aiatsis.printf, ?) AS altnames_aiatsis \n", "FROM (SELECT CASE WHEN (altname_aiatsis.lang = ?) THEN altname_aiatsis.name ELSE printf(?, altname_aiatsis.name, altname_aiatsis.lang) END AS printf \n", "FROM altname AS altname_aiatsis JOIN altnameprovider AS altname_aiatsis_provider ON altname_aiatsis_provider.id = altname_aiatsis.provider_id \n", "WHERE altname_aiatsis.languoid_id = languoid.id AND altname_aiatsis_provider.name = ? ORDER BY altname_aiatsis.name, altname_aiatsis.lang) AS lang_altname_aiatsis) AS altnames_aiatsis, (SELECT group_concat(lang_altname_elcat.printf, ?) AS altnames_elcat \n", "FROM (SELECT CASE WHEN (altname_elcat.lang = ?) THEN altname_elcat.name ELSE printf(?, altname_elcat.name, altname_elcat.lang) END AS printf \n", "FROM altname AS altname_elcat JOIN altnameprovider AS altname_elcat_provider ON altname_elcat_provider.id = altname_elcat.provider_id \n", "WHERE altname_elcat.languoid_id = languoid.id AND altname_elcat_provider.name = ? ORDER BY altname_elcat.name, altname_elcat.lang) AS lang_altname_elcat) AS altnames_elcat, (SELECT group_concat(lang_altname_ethnologue.printf, ?) AS altnames_ethnologue \n", "FROM (SELECT CASE WHEN (altname_ethnologue.lang = ?) THEN altname_ethnologue.name ELSE printf(?, altname_ethnologue.name, altname_ethnologue.lang) END AS printf \n", "FROM altname AS altname_ethnologue JOIN altnameprovider AS altname_ethnologue_provider ON altname_ethnologue_provider.id = altname_ethnologue.provider_id \n", "WHERE altname_ethnologue.languoid_id = languoid.id AND altname_ethnologue_provider.name = ? ORDER BY altname_ethnologue.name, altname_ethnologue.lang) AS lang_altname_ethnologue) AS altnames_ethnologue, (SELECT group_concat(lang_altname_glottolog.printf, ?) AS altnames_glottolog \n", "FROM (SELECT CASE WHEN (altname_glottolog.lang = ?) THEN altname_glottolog.name ELSE printf(?, altname_glottolog.name, altname_glottolog.lang) END AS printf \n", "FROM altname AS altname_glottolog JOIN altnameprovider AS altname_glottolog_provider ON altname_glottolog_provider.id = altname_glottolog.provider_id \n", "WHERE altname_glottolog.languoid_id = languoid.id AND altname_glottolog_provider.name = ? ORDER BY altname_glottolog.name, altname_glottolog.lang) AS lang_altname_glottolog) AS altnames_glottolog, (SELECT group_concat(lang_altname_hhbib_lgcode.printf, ?) AS altnames_hhbib_lgcode \n", "FROM (SELECT CASE WHEN (altname_hhbib_lgcode.lang = ?) THEN altname_hhbib_lgcode.name ELSE printf(?, altname_hhbib_lgcode.name, altname_hhbib_lgcode.lang) END AS printf \n", "FROM altname AS altname_hhbib_lgcode JOIN altnameprovider AS altname_hhbib_lgcode_provider ON altname_hhbib_lgcode_provider.id = altname_hhbib_lgcode.provider_id \n", "WHERE altname_hhbib_lgcode.languoid_id = languoid.id AND altname_hhbib_lgcode_provider.name = ? ORDER BY altname_hhbib_lgcode.name, altname_hhbib_lgcode.lang) AS lang_altname_hhbib_lgcode) AS altnames_hhbib_lgcode, (SELECT group_concat(lang_altname_lexvo.printf, ?) AS altnames_lexvo \n", "FROM (SELECT CASE WHEN (altname_lexvo.lang = ?) THEN altname_lexvo.name ELSE printf(?, altname_lexvo.name, altname_lexvo.lang) END AS printf \n", "FROM altname AS altname_lexvo JOIN altnameprovider AS altname_lexvo_provider ON altname_lexvo_provider.id = altname_lexvo.provider_id \n", "WHERE altname_lexvo.languoid_id = languoid.id AND altname_lexvo_provider.name = ? ORDER BY altname_lexvo.name, altname_lexvo.lang) AS lang_altname_lexvo) AS altnames_lexvo, (SELECT group_concat(\"lang_altname_moseley & asher (1994)\".printf, ?) AS \"altnames_moseley & asher (1994)\" \n", "FROM (SELECT CASE WHEN (\"altname_moseley & asher (1994)\".lang = ?) THEN \"altname_moseley & asher (1994)\".name ELSE printf(?, \"altname_moseley & asher (1994)\".name, \"altname_moseley & asher (1994)\".lang) END AS printf \n", "FROM altname AS \"altname_moseley & asher (1994)\" JOIN altnameprovider AS \"altname_moseley & asher (1994)_provider\" ON \"altname_moseley & asher (1994)_provider\".id = \"altname_moseley & asher (1994)\".provider_id \n", "WHERE \"altname_moseley & asher (1994)\".languoid_id = languoid.id AND \"altname_moseley & asher (1994)_provider\".name = ? ORDER BY \"altname_moseley & asher (1994)\".name, \"altname_moseley & asher (1994)\".lang) AS \"lang_altname_moseley & asher (1994)\") AS \"altnames_moseley & asher (1994)\", (SELECT group_concat(lang_altname_multitree.printf, ?) AS altnames_multitree \n", "FROM (SELECT CASE WHEN (altname_multitree.lang = ?) THEN altname_multitree.name ELSE printf(?, altname_multitree.name, altname_multitree.lang) END AS printf \n", "FROM altname AS altname_multitree JOIN altnameprovider AS altname_multitree_provider ON altname_multitree_provider.id = altname_multitree.provider_id \n", "WHERE altname_multitree.languoid_id = languoid.id AND altname_multitree_provider.name = ? ORDER BY altname_multitree.name, altname_multitree.lang) AS lang_altname_multitree) AS altnames_multitree, (SELECT group_concat(\"lang_altname_ruhlen (1987)\".printf, ?) AS \"altnames_ruhlen (1987)\" \n", "FROM (SELECT CASE WHEN (\"altname_ruhlen (1987)\".lang = ?) THEN \"altname_ruhlen (1987)\".name ELSE printf(?, \"altname_ruhlen (1987)\".name, \"altname_ruhlen (1987)\".lang) END AS printf \n", "FROM altname AS \"altname_ruhlen (1987)\" JOIN altnameprovider AS \"altname_ruhlen (1987)_provider\" ON \"altname_ruhlen (1987)_provider\".id = \"altname_ruhlen (1987)\".provider_id \n", "WHERE \"altname_ruhlen (1987)\".languoid_id = languoid.id AND \"altname_ruhlen (1987)_provider\".name = ? ORDER BY \"altname_ruhlen (1987)\".name, \"altname_ruhlen (1987)\".lang) AS \"lang_altname_ruhlen (1987)\") AS \"altnames_ruhlen (1987)\", (SELECT group_concat(lang_altname_wals.printf, ?) AS altnames_wals \n", "FROM (SELECT CASE WHEN (altname_wals.lang = ?) THEN altname_wals.name ELSE printf(?, altname_wals.name, altname_wals.lang) END AS printf \n", "FROM altname AS altname_wals JOIN altnameprovider AS altname_wals_provider ON altname_wals_provider.id = altname_wals.provider_id \n", "WHERE altname_wals.languoid_id = languoid.id AND altname_wals_provider.name = ? ORDER BY altname_wals.name, altname_wals.lang) AS lang_altname_wals) AS altnames_wals, (SELECT group_concat(\"lang_altname_wals other\".printf, ?) AS \"altnames_wals other\" \n", "FROM (SELECT CASE WHEN (\"altname_wals other\".lang = ?) THEN \"altname_wals other\".name ELSE printf(?, \"altname_wals other\".name, \"altname_wals other\".lang) END AS printf \n", "FROM altname AS \"altname_wals other\" JOIN altnameprovider AS \"altname_wals other_provider\" ON \"altname_wals other_provider\".id = \"altname_wals other\".provider_id \n", "WHERE \"altname_wals other\".languoid_id = languoid.id AND \"altname_wals other_provider\".name = ? ORDER BY \"altname_wals other\".name, \"altname_wals other\".lang) AS \"lang_altname_wals other\") AS \"altnames_wals other\", (SELECT group_concat(lang_trigger_lgcode.\"trigger\", ?) AS triggers_lgcode \n", "FROM (SELECT trigger_lgcode.\"trigger\" AS \"trigger\" \n", "FROM \"trigger\" AS trigger_lgcode \n", "WHERE trigger_lgcode.languoid_id = languoid.id AND trigger_lgcode.field = ? ORDER BY trigger_lgcode.ord) AS lang_trigger_lgcode) AS triggers_lgcode, (SELECT group_concat(lang_trigger_inlg.\"trigger\", ?) AS triggers_inlg \n", "FROM (SELECT trigger_inlg.\"trigger\" AS \"trigger\" \n", "FROM \"trigger\" AS trigger_inlg \n", "WHERE trigger_inlg.languoid_id = languoid.id AND trigger_inlg.field = ? ORDER BY trigger_inlg.ord) AS lang_trigger_inlg) AS triggers_inlg, ident_endangeredlanguages.identifier AS identifier_endangeredlanguages, ident_languagelandscape.identifier AS identifier_languagelandscape, ident_multitree.identifier AS identifier_multitree, ident_wals.identifier AS identifier_wals, cc_sub.comment AS classification_sub, (SELECT group_concat(lang_cref_sub.printf, ?) AS classification_subrefs \n", "FROM (SELECT printf(CASE WHEN (cr_sub.pages IS NOT NULL) THEN ? ELSE ? END, bibfile_cr_sub.name, bibitem_cr_sub.bibkey, cr_sub.pages) AS printf \n", "FROM classificationref AS cr_sub JOIN bibitem AS bibitem_cr_sub ON bibitem_cr_sub.id = cr_sub.bibitem_id JOIN bibfile AS bibfile_cr_sub ON bibfile_cr_sub.id = bibitem_cr_sub.bibfile_id \n", "WHERE cr_sub.languoid_id = languoid.id AND cr_sub.kind = ? ORDER BY cr_sub.ord) AS lang_cref_sub) AS classification_subrefs, cc_family.comment AS classification_family, (SELECT group_concat(lang_cref_family.printf, ?) AS classification_familyrefs \n", "FROM (SELECT printf(CASE WHEN (cr_family.pages IS NOT NULL) THEN ? ELSE ? END, bibfile_cr_family.name, bibitem_cr_family.bibkey, cr_family.pages) AS printf \n", "FROM classificationref AS cr_family JOIN bibitem AS bibitem_cr_family ON bibitem_cr_family.id = cr_family.bibitem_id JOIN bibfile AS bibfile_cr_family ON bibfile_cr_family.id = bibitem_cr_family.bibfile_id \n", "WHERE cr_family.languoid_id = languoid.id AND cr_family.kind = ? ORDER BY cr_family.ord) AS lang_cref_family) AS classification_familyrefs, endangerment.status AS endangerment_status, endangerment.date AS endangerment_date, endangerment.comment AS endangerment_comment, CASE WHEN (endangermentsource.bibitem_id IS NULL) THEN endangermentsource.name ELSE printf(?, bibfile_e.name, bibitem_e.bibkey, endangermentsource.pages) END AS endangerment_source, ethnologuecomment.isohid AS elcomment_isohid, ethnologuecomment.comment_type AS elcomment_comment_type, ethnologuecomment.ethnologue_versions AS elcomment_ethnologue_versions, ethnologuecomment.comment AS elcomment_comment, isoretirement.code AS iso_retirement_code, isoretirement.name AS iso_retirement_name, isoretirement.change_request AS iso_retirement_change_request, isoretirement.effective AS iso_retirement_effective, isoretirement.reason AS iso_retirement_reason, isoretirement.remedy AS iso_retirement_remedy, isoretirement.comment AS iso_retirement_comment, (SELECT group_concat(lang_irct.code, ?) AS iso_retirement_change_to \n", "FROM (SELECT isoretirement_changeto.code AS code \n", "FROM isoretirement_changeto \n", "WHERE isoretirement_changeto.languoid_id = isoretirement.languoid_id ORDER BY isoretirement_changeto.ord) AS lang_irct) AS iso_retirement_change_to \n", "FROM languoid LEFT OUTER JOIN (identifier AS ident_endangeredlanguages JOIN identifiersite AS ident_endangeredlanguages_site ON ident_endangeredlanguages.site_id = ident_endangeredlanguages_site.id) ON ident_endangeredlanguages_site.name = ? AND ident_endangeredlanguages.languoid_id = languoid.id LEFT OUTER JOIN (identifier AS ident_languagelandscape JOIN identifiersite AS ident_languagelandscape_site ON ident_languagelandscape.site_id = ident_languagelandscape_site.id) ON ident_languagelandscape_site.name = ? AND ident_languagelandscape.languoid_id = languoid.id LEFT OUTER JOIN (identifier AS ident_multitree JOIN identifiersite AS ident_multitree_site ON ident_multitree.site_id = ident_multitree_site.id) ON ident_multitree_site.name = ? AND ident_multitree.languoid_id = languoid.id LEFT OUTER JOIN (identifier AS ident_wals JOIN identifiersite AS ident_wals_site ON ident_wals.site_id = ident_wals_site.id) ON ident_wals_site.name = ? AND ident_wals.languoid_id = languoid.id LEFT OUTER JOIN classificationcomment AS cc_sub ON cc_sub.kind = ? AND cc_sub.languoid_id = languoid.id LEFT OUTER JOIN classificationcomment AS cc_family ON cc_family.kind = ? AND cc_family.languoid_id = languoid.id LEFT OUTER JOIN (endangerment JOIN endangermentsource ON endangermentsource.id = endangerment.source_id) ON languoid.id = endangerment.languoid_id LEFT OUTER JOIN (bibitem AS bibitem_e JOIN bibfile AS bibfile_e ON bibfile_e.id = bibitem_e.bibfile_id) ON bibitem_e.id = endangermentsource.bibitem_id LEFT OUTER JOIN ethnologuecomment ON languoid.id = ethnologuecomment.languoid_id LEFT OUTER JOIN isoretirement ON languoid.id = isoretirement.languoid_id ORDER BY languoid.id\n", "[generated in 0.00134s] (0, 1, '/', 0, 'dialect', 'language', ', ', ', ', ', ', '[%s](%s)', ', ', '**%s:%s**:%s', '**%s:%s**:%s', '**%s:%s**', '**%s:%s**', 'glottolog', ', ', '', '%s [%s]', 'aiatsis', ', ', '', '%s [%s]', 'elcat', ', ', '', '%s [%s]', 'ethnologue', ', ', '', '%s [%s]', 'glottolog', ', ', '', '%s [%s]', 'hhbib_lgcode', ', ', '', '%s [%s]', 'lexvo', ', ', '', '%s [%s]', 'moseley & asher (1994)', ', ', '', '%s [%s]', 'multitree', ', ', '', '%s [%s]', 'ruhlen (1987)', ', ', '', '%s [%s]', 'wals', ', ', '', '%s [%s]', 'wals other', ', ', 'lgcode', ', ', 'inlg', ', ', '**%s:%s**:%s', '**%s:%s**', 'sub', ', ', '**%s:%s**:%s', '**%s:%s**', 'family', '**%s:%s**:%s', ', ', 'endangeredlanguages', 'languagelandscape', 'multitree', 'wals', 'sub', 'family')\n", "[INFO@treedb.backend.export] hash rows with 'sha256', csv header: ['id', 'name', 'level', 'parent_id', 'path', 'family_id', 'dialect_language_id', 'hid', 'iso639_3', 'latitude', 'longitude', 'macroareas', 'countries', 'links', 'sources_glottolog', 'altnames_aiatsis', 'altnames_elcat', 'altnames_ethnologue', 'altnames_glottolog', 'altnames_hhbib_lgcode', 'altnames_lexvo', 'altnames_moseley & asher (1994)', 'altnames_multitree', 'altnames_ruhlen (1987)', 'altnames_wals', 'altnames_wals other', 'triggers_lgcode', 'triggers_inlg', 'identifier_endangeredlanguages', 'identifier_languagelandscape', 'identifier_multitree', 'identifier_wals', 'classification_sub', 'classification_subrefs', 'classification_family', 'classification_familyrefs', 'endangerment_status', 'endangerment_date', 'endangerment_comment', 'endangerment_source', 'elcomment_isohid', 'elcomment_comment_type', 'elcomment_ethnologue_versions', 'elcomment_comment', 'iso_retirement_code', 'iso_retirement_name', 'iso_retirement_change_request', 'iso_retirement_effective', 'iso_retirement_reason', 'iso_retirement_remedy', 'iso_retirement_comment', 'iso_retirement_change_to']\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CPU times: total: 4.5 s\n", "Wall time: 4.49 s\n" ] }, { "data": { "text/plain": [ "'4479476b397fa7dfbfd560a4bef5be06513ddc54f7c103d1f565e3a26404a90f'" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time treedb.hash_csv(treedb.get_example_query())" ] } ], "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.10.4" } }, "nbformat": 4, "nbformat_minor": 4 }