{ "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.7.1\n", "pycountry version: 24.6.1\n", "sqlalchemy version: 2.0.41\n", "sqlite_version: 3.50.1\n", "csv23 version: 0.3.4\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: 53.1 s\n" ] }, { "data": { "text/plain": [ "(CompletedProcess(args=['git', 'clone', '-c', 'advice.detachedHead=false', '--single-branch', '--branch', 'v5.2.1', '--depth', '1', 'https://github.com/glottolog/glottolog.git', WindowsPath('../glottolog')], returncode=0),\n", " CompletedProcess(args=['git', 'checkout', '-B', 'treedb', 'v5.2.1'], returncode=0))" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "\n", "GLOTTOLOG_TAG = 'v5.2.1'\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='435c83af977dbe0235f7aeb4f514cc6612e0b01b', describe='v5.2.1')" ] }, "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://endangeredlanguages.com/lang/1763',\n", " 'title': 'Abinomn',\n", " 'scheme': 'https'},\n", " {'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': 'cldf',\n", " 'bibkey': 'hammarstroem:17',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'cldf',\n", " 'bibkey': 'lewis:ed:09',\n", " 'pages': None,\n", " 'trigger': None},\n", " {'bibfile': 'cldf', 'bibkey': 'np:nd:264', 'pages': None, 'trigger': None},\n", " {'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", " 'elcat': [{'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", " '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': 'nearly extinct',\n", " 'source': {'name': 'ElCat', 'bibfile': None, 'bibkey': None, 'pages': None},\n", " 'date': datetime.datetime(2023, 7, 6, 16, 7, 13),\n", " 'comment': 'Abinomn (1763-bsa) = Critically Endangered (40 percent certain, based on the evidence available) (Speakers are shifting to the neighbouring Mander language, which also has few native speakers. The number of Foya speakers is likely to be considerably less than fifty. It has been seriously endangered before, but is now more likely to be moribund.) [Wurm 2007](cldf:wurm:07:1)'},\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: 24 s\n", "Wall time: 2min 50s\n" ] }, { "data": { "text/plain": [ "'path_languoid:path:sha256:0f0b5cb36fa2b9c1c8ed087f8bff0e46b7fc37f0c6ad14fc65139486db88c3dd'" ] }, "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:44.432835\n", "CPU times: total: 44.1 s\n", "Wall time: 44.7 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(2025, 6, 12, 23, 56, 55, 628208)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "engine.file_mtime()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "74.8359375" ] }, "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: 55 ms\n" ] }, { "data": { "text/plain": [ "'8d33a50c94d31cdb739b78c699e8784983b5cf5877b0ee9ab9afabe3972b5e94'" ] }, "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: 93.8 ms\n", "Wall time: 90.2 ms\n" ] }, { "data": { "text/plain": [ "'strong:sha256:e0f1c60ee4ef83c92a4ebc430cf504ac7cc9cb75bb1b10b12b2e2dbc1e20e281'" ] }, "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.05 s\n", "Wall time: 3.04 s\n" ] }, { "data": { "text/plain": [ "'weak:sha256:4919879262a20b088a3e1753b102febcbdd1edab14e14bddf325b184fa321681'" ] }, "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.84 s\n", "Wall time: 4.87 s\n" ] }, { "data": { "text/plain": [ "'path_languoid:path:sha256:0f0b5cb36fa2b9c1c8ed087f8bff0e46b7fc37f0c6ad14fc65139486db88c3dd'" ] }, "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.84 s\n", "Wall time: 5.86 s\n" ] }, { "data": { "text/plain": [ "'path_languoid:path:sha256:0f0b5cb36fa2b9c1c8ed087f8bff0e46b7fc37f0c6ad14fc65139486db88c3dd'" ] }, "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: 953 ms\n", "Wall time: 951 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.7.1\n", "BEGIN (implicit)\n", "SELECT sqlite_version() AS sqlite_version_1\n", "[generated in 0.00078s] ()\n", "ROLLBACK\n" ] }, { "data": { "text/plain": [ "'3.50.1'" ] }, "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.00087s] ()\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.00076s] ('table', 'sqlite_%')\n", "ROLLBACK\n", "[INFO@treedb.backend.pandas] pandas version: 2.3.0\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.00099s] ('__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
_config407
_file27037
_option53
_value664989
altname161574
altnameprovider11
bibfile37
bibitem157931
classificationcomment12553
classificationref19473
country246
endangerment8567
endangermentsource66
endangermentstatus6
ethnologuecomment639
identifier21365
identifiersite4
isoretirement371
isoretirement_changeto455
languoid27037
languoid_country11900
languoid_macroarea22175
languoidlevel3
link34593
macroarea6
pseudofamily8
source221409
sourceprovider1
timespan1068
trigger30140
\n", "
" ], "text/plain": [ " n_rows\n", "table_name \n", "__dataset__ 1\n", "__producer__ 1\n", "_config 407\n", "_file 27037\n", "_option 53\n", "_value 664989\n", "altname 161574\n", "altnameprovider 11\n", "bibfile 37\n", "bibitem 157931\n", "classificationcomment 12553\n", "classificationref 19473\n", "country 246\n", "endangerment 8567\n", "endangermentsource 66\n", "endangermentstatus 6\n", "ethnologuecomment 639\n", "identifier 21365\n", "identifiersite 4\n", "isoretirement 371\n", "isoretirement_changeto 455\n", "languoid 27037\n", "languoid_country 11900\n", "languoid_macroarea 22175\n", "languoidlevel 3\n", "link 34593\n", "macroarea 6\n", "pseudofamily 8\n", "source 221409\n", "sourceprovider 1\n", "timespan 1068\n", "trigger 30140" ] }, "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.0539s 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": { "tags": [] }, "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.00079s] ('table', 'sqlite_master')\n", "SELECT count(*) AS n_rows \n", "FROM sqlite_master\n", "[generated in 0.00050s] ()\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.00093s] ()\n", "SELECT __producer__.id, __producer__.name, __producer__.version \n", "FROM __producer__\n", "[cached since 15s ago] ()\n", "ROLLBACK\n", "[INFO@treedb.backend.models] git describe 'v5.2.1' clean: True\n", "[INFO@treedb.backend.models] __dataset__.git_commit: '435c83af977dbe0235f7aeb4f514cc6612e0b01b'\n", "[INFO@treedb.backend.models] __dataset__.version: '5.2.1'\n", "[INFO@treedb.backend.models] __producer__.name: treedb\n", "[INFO@treedb.backend.models] __producer__.version: 2.7.1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "git describe 'v5.2.1' clean: True\n", "__dataset__.title: 'Glottolog treedb''\n", "__dataset__.git_commit: '435c83af977dbe0235f7aeb4f514cc6612e0b01b'\n", "__dataset__.version: '5.2.1'\n", "__dataset__.exclude_raw: False\n", "__producer__.name: treedb\n", "__producer__.version: 2.7.1\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.01597s ago] ('table', '__dataset__')\n", "SELECT count(*) AS n_rows \n", "FROM __dataset__\n", "[generated in 0.00049s] ()\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.01605s 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_commit435c83af977dbe0235f7aeb4f514cc6612e0b01b
git_describev5.2.1
cleanTrue
version5.2.1
exclude_rawFalse
\n", "
" ], "text/plain": [ " __dataset__\n", "id 1\n", "title Glottolog treedb\n", "git_commit 435c83af977dbe0235f7aeb4f514cc6612e0b01b\n", "git_describe v5.2.1\n", "clean True\n", "version 5.2.1\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.03125s ago] ('table', '__producer__')\n", "SELECT count(*) AS n_rows \n", "FROM __producer__\n", "[generated in 0.00036s] ()\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 15.03s 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.7.1
\n", "
" ], "text/plain": [ " __producer__\n", "id 1\n", "name treedb\n", "version 2.7.1" ] }, "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.04684s ago] ('table', '_file')\n", "SELECT count(*) AS n_rows \n", "FROM _file\n", "[generated in 0.00041s] ()\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", "27037\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.05165s ago] ('table', '_option')\n", "SELECT count(*) AS n_rows \n", "FROM _option\n", "[generated in 0.00034s] ()\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.05536s ago] ('table', '_value')\n", "SELECT count(*) AS n_rows \n", "FROM _value\n", "[generated in 0.00040s] ()\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", "664989\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.00074s] (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
1abin1243abin124315857dd58b5807179c50acfaefadaf8501ea65d33f2a4f4fc1...
2abis1238abis12381959b52c67f0f5863447db32905759047bd018eb7a1ad5d918...
3abkh1242abkh12423065dd28ae1265a0967b1a236d06c7fd6e7ac3b9e32d866dd...
4abkh1243abkh1242/abkh1243257a5900355c69af22d94eaa0a147b95fc291270634bc033c...
5abaz1241abkh1242/abkh1243/abaz124128262893f419b8e54e5d4441d9551707a77a0e2c8f61d158da...
\n", "
" ], "text/plain": [ " glottocode path size \\\n", "id \n", "1 abin1243 abin1243 1585 \n", "2 abis1238 abis1238 1959 \n", "3 abkh1242 abkh1242 306 \n", "4 abkh1243 abkh1242/abkh1243 257 \n", "5 abaz1241 abkh1242/abkh1243/abaz1241 2826 \n", "\n", " sha256 \n", "id \n", "1 7dd58b5807179c50acfaefadaf8501ea65d33f2a4f4fc1... \n", "2 b52c67f0f5863447db32905759047bd018eb7a1ad5d918... \n", "3 5dd28ae1265a0967b1a236d06c7fd6e7ac3b9e32d866dd... \n", "4 a5900355c69af22d94eaa0a147b95fc291270634bc033c... \n", "5 2893f419b8e54e5d4441d9551707a77a0e2c8f61d158da... " ] }, "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.00079s] (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.00087s] (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.00080s] ('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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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
links9[Abinomn](https://endangeredlanguages.com/lang...
10https://en.wikipedia.org/wiki/Abinomn_language
11https://www.wikidata.org/entity/Q56648
sourcesglottolog12**cldf:hammarstroem:17**
13**cldf:lewis:ed:09**
14**cldf:np:nd:264**
15**hh:e:Lagerberg:Moegip**
16**hh:h:SilzerClouse:Index**
17**hh:h:SilzerHeikkinen:Irian**
18**hh:hv:Foley:Northwest-New-Guinea**
19**hh:hvtyp:DonohueMusgrave:Melanesia**
20**hh:w:Fiwei:Abinomn**
altnamesmultitree21\"Baso\"
22Abinomn
23Avinomen
24Foja
25Foya
lexvo26Abinomn [en]
27Abinomn language [en]
28Abinomneg [br]
29Lingua abinomn [gl]
30Llingua Abinomn [ast]
hhbib_lgcode31Baso
elcat32\"Baso\"
33Abinomn
34Avinomen
35Foja
36Foya
triggerslgcode37macrohistory
38moegip
identifiermultitree39bsa
endangeredlanguages401763
classificationfamilyrefs41**hh:h:SilzerClouse:Index**
42**hh:hvtyp:DonohueMusgrave:Melanesia**
endangermentstatus43nearly extinct
source44ElCat
date452023-07-06T16:07:13
comment46Abinomn (1763-bsa) = Critically Endangered (40...
\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 [Abinomn](https://endangeredlanguages.com/lang...\n", " 10 https://en.wikipedia.org/wiki/Abinomn_language\n", " 11 https://www.wikidata.org/entity/Q56648\n", "sources glottolog 12 **cldf:hammarstroem:17**\n", " 13 **cldf:lewis:ed:09**\n", " 14 **cldf:np:nd:264**\n", " 15 **hh:e:Lagerberg:Moegip**\n", " 16 **hh:h:SilzerClouse:Index**\n", " 17 **hh:h:SilzerHeikkinen:Irian**\n", " 18 **hh:hv:Foley:Northwest-New-Guinea**\n", " 19 **hh:hvtyp:DonohueMusgrave:Melanesia**\n", " 20 **hh:w:Fiwei:Abinomn**\n", "altnames multitree 21 \"Baso\"\n", " 22 Abinomn\n", " 23 Avinomen\n", " 24 Foja\n", " 25 Foya\n", " lexvo 26 Abinomn [en]\n", " 27 Abinomn language [en]\n", " 28 Abinomneg [br]\n", " 29 Lingua abinomn [gl]\n", " 30 Llingua Abinomn [ast]\n", " hhbib_lgcode 31 Baso\n", " elcat 32 \"Baso\"\n", " 33 Abinomn\n", " 34 Avinomen\n", " 35 Foja\n", " 36 Foya\n", "triggers lgcode 37 macrohistory\n", " 38 moegip\n", "identifier multitree 39 bsa\n", " endangeredlanguages 40 1763\n", "classification familyrefs 41 **hh:h:SilzerClouse:Index**\n", " 42 **hh:hvtyp:DonohueMusgrave:Melanesia**\n", "endangerment status 43 nearly extinct\n", " source 44 ElCat\n", " date 45 2023-07-06T16:07:13\n", " comment 46 Abinomn (1763-bsa) = Critically Endangered (40..." ] }, "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) + ?) / (? + 0.0)) 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) + ?) / (? + 0.0)), languoid.level ORDER BY path_depth, languoid.level\n", "[generated in 0.00094s] (1, 9, 1, 9)\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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fGf02KFDh7LUbpEiRWzmzJlWuHBh279/v3Xp0sVyKwJvAAAAZOrXX3+1lStXuqBbJ07Kp59+GkrbBQsWtLS0NFdiosC7a9eu7sTN3IrAG4DDia4AgIwce+yxbiQTnWypIQZVXjJgwIDQ2r/uuuusbt267va8efMsN6PGGwAAAJnSqCUvvfSSLVq0yJWX3HnnnTZq1KjQ2q9du7YbT/yUU06xpk2bWm5GxhsAACBkWb2SZNh02fboS7e3adPGjWASLfqKkzrZMv0VKHX59/SP9ejRw02+9COc6EqZ6WkZP//8s91yyy2W2xF4AwAAIClt2bLFZds3btxo1157reV2BN4AAABIShUrVrTy5cu7+nLVmud2BN4AAABISl66UpXcjpMrAQAAgBAQeAMAAAAhIPAGAAAAQkDgDQAAAISAwBsAAAAIAYE3AAAAEAICbwAAABx21cnoK1ciPhjHGwAAIGxDSofc3rZw20OGyHgDAAAAyRZ4Dx8+3M4880wrWbKku4Rnx44dbeXKlTHz7Nmzx2699VYrV66clShRwjp37mybNm2KmWfdunV2ySWXWPHixd1y7r77bjtw4EDMPHPnzrVGjRpZkSJF7KSTTrJJkyYF2U4AAABkw5QpU6xJkyYu/qtcubJ169bNNm/eHBOz5cuXz+bMmePmU3x39tlnHxYjPvjggy7u03Kuu+46GzBggDVs2PCI5S2KNXv06HHU6yJvvPGG1a5d24oWLWrnnXeeTZ482a3f1q1bI/N8+umn1rJlSytWrJhVr17dbr/9dtu1a5clVeD90UcfuaD6888/t/fee8/2799vF110UcyK3nnnnfbmm2/aK6+84ub/+eefrVOnTpHnDx486ILuffv22fz5892boaB60KBBkXnWrFnj5tGbtXjxYvch6AN655134rXdAAAAOAqK9x544AFbsmSJvfbaa7Z27dqYYNh377332mOPPWZffvmlFSxY0Hr27Bl5burUqfbQQw/ZI488YosWLbIaNWrY+PHj474uiiG7dOniAnbNc+ONN7r1irZ69Wpr166dSw5/88039vLLL7tAvHfv3pZUNd6zZ8+Oua+AWT0XvYGtWrWybdu22XPPPWfTpk2z888/380zceJEq1u3rgvWmzVrZu+++64tX77c3n//fatUqZLr6egN7N+/vw0ZMsQKFy5sEyZMsFq1arkPT/R6vSGPP/64tW3bNp7bDwAAgCOIDqBPOOEEe+KJJ1wFxM6dO111g0+BdevWrd1tZbOVRFUlhDLP48aNs169etm1117rnlfCVTGhlhHPdfnHP/5hderUsVGjRrl5dHvZsmVu3aIrOK6++upIdl3ZcS1H667OgNY3KWu8FWhL2bJl3V8F4OqJtGnTJjLPKaec4no1n332mbuvv/Xr13dBt0/B9Pbt2+3bb7+NzBO9DH8efxkZ2bt3r1tG9AQAAIBgFN916NDBxXMq8fCDa5UOR2vQoEHkdpUqVdxfvwxEZSdnnXVWzPzp78djXdSOAvEjtaNMuJLHCtT9SXHmoUOHXMY8kbIdeGvl1FM455xz7LTTTnOPbdy40WWsy5QpEzOvgmw9588THXT7z/vPHWkeBdO7d+/OcH3UeyldunRkUr0OAAAAsk/lxApKS5Uq5cpFFi5caDNnznTPqWw4WqFChSK3VVPtx4tHK3/+/OZ5XsxjSuhmZ12ORNlxlaConNmfFIyvWrXKTjzxREvK4QRV663UvUpAksHAgQOtb9++kfsK0gm+geRSf3L9LL9madrShKwLAODPrVixwn799VcbMWJEJK5SDXdWqeRj4cKF1r1798hjuh+tQoUK9ssvv8ScF6hYU+f8He26qJ2333475rH07WjwDpU9a/COsGUr463i81mzZtmHH35o1apVizyus0vV44g+a1Q0qome8+dJP8qJf//P5lEPR2efZkSjn+j56AkAAADZp5IOVTOoRvvHH390I4bo3Lysuu2229x5gBpUQ5lljXCiExv9zLjo/MC33nrLTQqyb7755piY8mjWRZlsvVbnDn7//fc2ffr0yMh4flt6TgN8KJ5Vtlvr8/rrr4dycmWWAm+l/7VSSut/8MEH7gTIaI0bN3Y/M2g4GZ9qbVR307x5c3dff5cuXRoz9ItGSFGgXK9evcg80cvw5/GXAQAAgMRTFlqBq0arU5ymbPOjjz6a5eXoZMaBAwdav379XMZZtdQajST6REadOJmWluay4qrd1smTfrb7aNdFsem///1ve/XVV13NuU6W9Ec1UZJW9LhG3lNgriEFzzjjDHeyZ9WqVS3R8nnpi2mO4JZbbnEjlqhXoFS+TzXVfiZavROl+PXGKJhWD0fUs/B/NtBIJtq4kSNHunrua665xg0X+PDDD7t59GGoblzlLPoQFORrfEX1gI52VBOVmmi9dAIo2e+8XXqQ1TayU9qQCm0k42eRnTYAIJloVA/FNQoIEzlaRm504YUXuioHjc2dSBrRRCPmrV+/PiGfZVZizizVePvjLWqA82gaMtAfQ1FD/qk4XmMjaqQRBcpPP/10ZN4CBQq4MhUF6MpgH3PMMa53M2zYsMg82iAF2RoTfOzYsa6c5dlnn2UoQQAAgFzojz/+cMGvYjnFgi+++KIbWloVDfGmuFMjm+hijvPmzXNDC4ZRRnI0shR4H01yXD2Ap556yk2ZqVmz5mGF7+kpuP/666+zsnqIM7KTAAAgHlRf/fbbb7vsszLHqpyYMWPGYcNHx4NfQ/7bb7+5uvC77rrLlbkkg2yPagIAAAAcDZUkv//++6G0peoLTcko0AV0AAAAABwdAm8AAAAgBATeAAAAQAgIvAEAAIAQEHgDAAAAISDwBgAAAEJA4A0AAICjouus9OnTx90+/vjjbcyYMUf92kmTJlmZMmUsL2McbwAAgFxwkbogEnGBu4ULF7orkOeUSZMmuU7A1q1bLbcg8AaQpw9mXG0VALKnQoUKOb0KuQ6lJgAAADjMrl27rHv37laiRAmrUqWKPfbYYzHPpy81GT16tNWvX99lwatXr2633HKL7dy584htvP7669aoUSMrWrSonXDCCTZ06FA7cOBA5Hlls2+88UarVKmSm+e0006zWbNm2dy5c+3aa6+1bdu2ucvRaxoyZIglOzLeuRiZPQAAkCh33323ffTRRy44rlixov3973+3r776yho2bJjh/Pnz57cnnnjCatWqZT/++KMLvO+55x57+umnM5z/k08+cYG9XtOyZUtbvXq13XDDDe65wYMH26FDh6x9+/a2Y8cO+9e//mUnnniiLV++3AoUKGBnn322C/oHDRpkK1eudK9RByHZEXgDAAAghjLVzz33nAt4L7jgAvfY5MmTrVq1apm+xj/p0s+GP/jgg3bTTTdlGngPHTrUBgwYYGlpae6+Mt4PPPCAC9YVeL///vu2YMEC++677+zkk0+OzOMrXbq0y3RXrlzZcgsCbwAAAMRQ9nnfvn3WtGnTyGNly5a1OnXqZPoaBcrDhw+3FStW2Pbt213JyJ49e+yPP/6w4sWLHzb/kiVLbN68efbQQw9FHjt48GDkNYsXL3aBvh90pwICbwAAAASydu1au/TSS+3mm292gbSC9E8//dR69erlAviMAu+dO3e6rHenTp0Oe0713MWKFbNUQ+ANAACAGKqnLlSokH3xxRdWo0YN99jvv/9u33//vbVu3fqw+RctWuRqsnUCpmq9Zfr06Udso1GjRq4++6STTsrw+QYNGtiGDRtcmxllvQsXLuwy5LkJgTcAAABi6ERFZat1gmW5cuXcyZX33ntvJKhOT8Hz/v37bdy4cdahQwdXQjJhwoQjtjFo0CCXJVdg36VLF7dslZ8sW7bM1YcrwG/VqpV17tzZjZiiNlTGorrudu3auTpyZc3nzJljp59+usuqZ5RZTyYMJwgAAIDDjBo1yo02okC6TZs21qJFC2vcuHGG8yrwVXD8yCOPuCH/pk6d6uq9j6Rt27ZuaMB3333XzjzzTGvWrJk9/vjjVrNmzcg8M2bMcM9dddVVVq9ePXfipZ/l1sgmOnnzyiuvdGOKjxw50pIdGW8AyCKG8gQQVG7YLyjrPWXKFDf5lAGPruuOduedd7op2jXXXBO53aNHDzelD741ZUa14s8//3ymz48fP95NuQWBN1Le0jXrcnoVAAAAKDUBAAAAwkDgDQAAAISAUpMEoQb06FAGAgAA8goy3gAAAEAICLwBAAASzPO8nF4FBKQLBAVFqQkAAECC6OqPuuDLli1b3FjTuo3c12nSZe/1GeoiP7piZnYReAMAACRIgQIFrFq1au7S5+nHvUbuoqti6iqbmV2982gQeANxwEmiAIAjXYimdu3a7pLqyL0dqIIFCwb+xYLAGwAAIITATRPyNgLvBCEDCgAAgGgE3sgUnQcAAID4IfDOxQiMAQAAcg/G8QYAAABCQOANAAAAhIDAGwAAAAgBgTcAAAAQAk6uBIAkVH9y/SzNvzRtacLWBQAQH2S8AQAAgBAQeAMAAAAhoNQEyCUYtx0AgNyNjDcAAACQjIH3xx9/bB06dLCqVatavnz57LXXXot53vM8GzRokFWpUsWKFStmbdq0sVWrVsXM89tvv9nVV19tpUqVsjJlylivXr1s586dMfN888031rJlSytatKhVr17dRo4cmd1tBAAAAHJf4L1r1y47/fTT7amnnsrweQXITzzxhE2YMMG++OILO+aYY6xt27a2Z8+eyDwKur/99lt77733bNasWS6Yv+GGGyLPb9++3S666CKrWbOmLVq0yEaNGmVDhgyxZ555JrvbCQAAAOSuGu/27du7KSPKdo8ZM8buu+8+u/zyy91jL7zwglWqVMllxrt27WrfffedzZ492xYuXGhNmjRx84wbN84uvvhie/TRR10mferUqbZv3z57/vnnrXDhwnbqqafa4sWLbfTo0TEBOgAAAJAna7zXrFljGzdudOUlvtKlS1vTpk3ts88+c/f1V+UlftAtmj9//vwuQ+7P06pVKxd0+5Q1X7lypf3+++8Ztr13716XKY+eAAAAgJQMvBV0izLc0XTff05/K1asGPN8wYIFrWzZsjHzZLSM6DbSGz58uAvy/Ul14QAAAECySJlRTQYOHGjbtm2LTOvXr8/pVQIAAAASE3hXrlzZ/d20aVPM47rvP6e/mzdvjnn+wIEDbqST6HkyWkZ0G+kVKVLEjZISPQEAAAApGXjXqlXLBcZz5syJPKZaa9VuN2/e3N3X361bt7rRSnwffPCBHTp0yNWC+/NopJP9+/dH5tEIKHXq1LFjjz02nqsMAAAAJOeoJhpv+4cffog5oVIjjqhGu0aNGtanTx978MEHrXbt2i4Qv//++91IJR07dnTz161b19q1a2fXX3+9G3JQwXXv3r3diCeaT7p162ZDhw5143v379/fli1bZmPHjrXHH388ntsOIApXxgQAIMkC7y+//NLOO++8yP2+ffu6v2lpaTZp0iS755573FjfGvZPme0WLVq44QN1IRyfhgtUsH3BBRe40Uw6d+7sxv726eTId99912699VZr3LixlS9f3l2Uh6EEAQAAkGcC73PPPdeN150ZXc1y2LBhbsqMsuPTpk07YjsNGjSwTz75JKurBwAAACSllBnVBAAAAEipjDcAZBd15ACAvIyMNwAAABACAm8AAAAgBATeAAAAQAgIvAEAAIAQEHgDAAAAISDwBgAAAEJA4A0AAACEgHG8AaQUxgo/OvUn18/ya5amLU3IugBAXkHGGwAAAAgBgTcAAAAQAgJvAAAAIAQE3gAAAEAIOLkSOer4PdOy/Jq1CVkTAACAxCLjDQAAAISAwBsAAAAIAaUmSPkykKxuRzJuAwAAyP3IeAMAAAAhIOOdi5HJBQAAyD3IeAMAAAAhIOMNAFm0dM26nF4FAEAuROCdIJSB5C183gAA4M/kzcB7SOkszr8tUWsCACmr/uT6WX7N0rSlCVkXAEgG1HgDAAAAISDwBgAAAEJA4A0AAACEIG/WeAO5ECdwAgCQu5HxBgAAAEJAxhtAtjLqQlYduW3kFEZNAZCTyHgDAAAAISDjDSA0ZNUBAHkZgTcAJCEuSw8AqSdPBt6MDgEAAICwUeMNAAAAhIDAGwAAAAhBniw1AZC6KCUDACQrAm8AyIM4efPoMVY4gHih1AQAAAAIAYE3AAAAEAJKTQAgi6gjPzqUswBALAJvAECulSrBPXXkQN6Q1IH3U089ZaNGjbKNGzfa6aefbuPGjbOzzjorp1cLABKOrDoApJ6kDbxffvll69u3r02YMMGaNm1qY8aMsbZt29rKlSutYsWKOb16AIA8IhWy6lnNqAtZdSAPBd6jR4+266+/3q699lp3XwH4W2+9Zc8//7wNGDAgp1cPAPJURj07WfUw2kgVqRDcpwrKfpDnAu99+/bZokWLbODAgZHH8ufPb23atLHPPvssw9fs3bvXTb5t27a5v9u3bz9s3kN7/8jS+mS0jD+TCm1kdfmp0kYyfhZhtJGMn0UYbSTjZxFGG8n4WWSnjdO2PZul+Zdl47MIow3b62Vt/iy2cXD3wawtPzv/t8OrZbkNG7ghsW1kdflmNm/FfxP+/W42rVmW5v+82+cJXX6qtPF5FpcfL/7/gOcdxffYS0I//fST1tybP39+zON33323d9ZZZ2X4msGDB7vXMDExMTExMTExMVnI0/r16/80xk3KjHd2KDuumnDfoUOH7LfffrNy5cpZvnz5jqq3Ur16dVu/fr2VKlUqIetIG8mxfNpIrjZSYRtoI3mWTxvJ1UYqbANtJM/yk7UNZbp37NhhVatW/dN5kzLwLl++vBUoUMA2bdoU87juV65cOcPXFClSxE3RypQpk+W29QYn6oOkjeRaPm0kVxupsA20kTzLp43kaiMVtoE2kmf5ydhG6dKlc++VKwsXLmyNGze2OXPmxGSwdb958+Y5um4AAABAdiRlxltUNpKWlmZNmjRxY3drOMFdu3ZFRjkBAAAAcpOkDbyvvPJK27Jliw0aNMhdQKdhw4Y2e/Zsq1SpUkLaU5nK4MGDDytXoY3w20iFbaCN5Fk+bSRXG6mwDbSRPMunjeRqIxW2IdFt5NMZlnFfKgAAAIDkr/EGAAAAUg2BNwAAABACAm8AAAAgBATeAAAAQAgIvJFlnI8LAACQQsMJInlpeJ0lS5ZY3bp1c3pVkAC//PKLjR8/3j799FN3O3/+/HbCCSdYx44drUePHu6qsgAAIOsIvDOxfv16N4bj888/n+1l7N692xYtWmRly5a1evXqxTy3Z88emz59unXv3j3Qen733Xf2+eefuyt6nnLKKbZixQobO3as7d271/72t7/Z+eefH+giRhk5ePCgjRgxwsqVK+fujx492uJJF0rSe/PDDz9YlSpV7Kqrroq0lR1fffWVHXvssVarVi13f8qUKTZhwgRbt26d1axZ03r37m1du3YNtM633XabXXHFFdayZUtLpCeffNIWLFhgF198sVtnbcvw4cPdlV07depkw4YNs4IFs/+1/vLLL61NmzZ20kknWbFixWzVqlXWrVs327dvn/Xr1899HzSefsmSJeO6XQBSh/ZRn332mbsGh1SuXNkdo3QxvET7/fff7c033wx8bBXtV5V4yOjxDRs2WI0aNQL/erx27VqrXr26229rPztz5kx3/NY+vnz58pYIigsmTpzojn/xtmbNmsix+7TTTgu8vL1797rPoFChQu7+6tWr3XHIP3736tUrcmzPrhkzZlj79u2tePHiFgqN443DLV682MufP3+2X79y5UqvZs2aXr58+dxyWrVq5f3888+R5zdu3Bho+fKf//zHK1y4sFe2bFmvaNGi7n6FChW8Nm3aeOeff75XoEABb86cOdlevta9YcOG3rnnnhsz6fEzzzzT3T7vvPO8oOrWrev9+uuv7va6deu8448/3itdurRrQ9tWsWJF78cff8z28hs0aOC999577vY///lPr1ixYt7tt9/ujR8/3uvTp49XokQJ77nnngu0Df7nXLt2bW/EiBHeL7/84sXbAw884JUsWdLr3LmzV7lyZddOuXLlvAcffNB7+OGH3Wc/aNCgQG2cc8453pAhQyL3p0yZ4jVt2tTd/u2339z/g967oPbu3eu9/PLL7v3v2rWrm3R7+vTp7rlE0/dv6NChcVnW+vXrvR07dhz2+L59+7yPPvoo0LL/97//eR988EHk+7Flyxb3uWvdly9f7iVKrVq1vO+//z4hyz506JDbpmeeecZ788033fsUj89A743v448/9rp16+a1aNHCu/rqq7358+cHbuPRRx/11q5d6yWS3o/777/f+/TTT9197b/bt2/vtW3b1vvHP/4Rlzb++OMPt7+79tprvXbt2nkXX3yx17t3b+/9998P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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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o2jRouaiOSIiwgTBepzSWCSpcuTI4by40HPEyy+/HGP866+/biqD7NDfYezYsSY+0NeVKlUyMaBWaHhDmgyqvf3Hpgct3Vlca2deeOEFq1ixYiZo8cQJV//YHMGHBj96MN6xY4dz/O7du60CBQpYdm3ZssUcYAYPHuysVfJWUK3BlgZurn7++WdzAkgqrc3VYMSxXTSgcnX48GFzsvLUOuhvpLWwWrOkJyoNQvVix26gqMvouChTGijs2bPH+V4vHPSq3Q49eThqyByBo66b1kCoY8eOmcDXDg1K9OShJ8DY9DMd16JFC1tl7Nq1K9FBt4/d/a9bt24mGNm6dau5E6KBUM2aNU2NvqdOvPpbaUB19epV66233jInLH3voLWNegGfVLp8Ok+9O+Q66OdFihQxrzWI99S+obVaegHruPOkNcz6u+mx0Q6t3XPMU7eJ1uS7ev/9980J0+56zJ492/x96r6nxxW9iNbjrKfob+O46NfARPe16dOnO8dr+Rp82bnA0eBcz0dKfyf9TGngott79OjRttZB7/y5nodi02OxTpNUjnNzQoMnAkU9T//www/O91o5phduelzSgNcT52+9qPzvf/9rXl+/ft0st14QuJ73dDns0DsRejEQ+86At87flStXthYsWBBjvFZSavxgZ9/+7bffzGuNZ+I7f9v5e4q9Dvr3qcepXLlymVpxvdCMHZPYlSaDag10tEYjIfrHbmen0dqF+G7N9unTx5zE9PakJ4Jq/YNy0D8s11pGDbLsBkAOWgOnQYTedtGTiJ5UPLlTOmqqdLvEPknZXQ+92u/Ro4d5rTuIXtm60tSJ+++/3/LUTulKg2A9STlu89mhwY2m+DhOgDo/TZdwWLFihTkp2qFBgh4YtRw9qeutO03xcVi5cqWpebB7cZBYIKIXo564yEnootlTJ179W9WaZAdH7ZKmyGiNrCdOvFo77TiO6MWazs+1TK2l1uA3qTTA0uWNfazy1km3XLlycW436x0eu4G71ubrxZLjwtnx2kGPk3YvOF3XQ/+fNGmSqWXXbaJ3LDQY1osfT184u+4relFrZz30u64pBVrzqmU4auT0nGj3GKIXG+vWrUtwvAarOo2d857+9lpGfIPWLNvd73Q7xE451G2rNfCaWqnjPFGG67bW87fr+VxTITWos2vKlCmmUsr1To2n92/H+Vvv0rpW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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100))\n", "\n", "(100 * _.div(_.sum(axis='columns'), axis='rows')).plot.bar(stacked=True, figsize=(12 * 72 / 100, 3 * 72 / 100));" ] }, { "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.00085s] ()\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_size3527.065.047211.0
\n", "
" ], "text/plain": [ " count min max\n", "file_size 3527.0 65.0 47211.0" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100), 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.00084s] ()\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": "iVBORw0KGgoAAAANSUhEUgAAAt4AAADpCAYAAAATdDBjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAALNZJREFUeJzt3QeYFMXa9vGHHCSDJFkBDxwBQRFUxIiIrop6OGBWUEF9VUABBcFAMoB4FFEQjIBHFEyoiCRBTIABRQkKBhCUZCJIDv1ed31vzze7bujZne2dnf3/rqt3J/TUVPd0Vz9VXV1dxPM8zwAAAADkqaJ5mzwAAAAAIfAGAAAAQkDgDQAAAISAwBsAAAAIAYE3AAAAEAICbwAAACAEBN4AAABACAi8AQAAgBAUtyR18OBBW79+vZUvX96KFCmS39kBAABAEtK9KLdv3261a9e2okWLFs7AW0F3SkpKfmcDAAAAhcC6deusTp06hTPwVku3vxIqVKiQ39kBAABAEtq2bZtr7PVjz0IZePvdSxR0E3gDAAAgLwXp2szFlQAAAEAICLwBAACAECRtVxMAAIBkduDAAdu3b19+Z6NQKFGihBUrVizX6RB4AwAAFLDh6zZu3GhbtmzJ76wUKpUqVbKaNWvmaphqAu8kUq//9EDzrRnePs/zAgAA8oYfdFevXt3Kli3L/UpCqOjs3LnTNm/e7J7XqlUrx2kReAMAABSg7iV+0F21atX8zk6hUaZMGfdfwbfWfU67nXBxJQAAQAHh9+lWSzfC5a/z3PSrJ/AGAAAoYOheUjDXOYE3AAAAEAICbwAAACAEXFwJAABQiEY3i5cwR0nbuHGjde7c2RYsWODG1NYFpur6MXXqVOvQoYOtWbPG6tevb19++aU1b97cEhWBNwAAABLayJEjbcOGDbZkyRKrWLGie03PK1eubAUJgTcAAAAS2g8//GAtW7a0hg0bRl7TzWwKGvp4AwAAIM+1adPGbrnlFuvXr59VqVLFBc6DBw/O9nP16tWz1157zZ5//nnXveSaa65xr+vxG2+8kennli1bZueee66VK1fOatSo4bqq/Pbbb5H3X331VWvWrJkbo1tjordr18527NhheYnAGwAAAKGYOHGiHXLIIfbJJ5/YiBEjbOjQoTZnzpwsP/PZZ5/ZOeecY5dcconrXjJq1Khsv0d9wNu2bWvHHnusff755zZz5kzbtGmTS0OUzuWXX25du3a1b775xubPn28dO3Z0d6nMS3Q1AQAAQCiOPvpoGzRokHusbiOjR4+2uXPn2llnnZXpZw499FArVaqUa5kO2r1E6SrofuCBByKvPffcc5aSkmKrVq2yv/76y/bv3++C7bp167r31fqd1wi8AQAAEFrgHa1WrVruNuzx9tVXX9l7773nuplk1F/87LPPtjPPPNMF26mpqe75RRddlOcXa9LVBAAAAKEoUaJEmufqp33w4MG4f49atC+44AI3Ckr09N1339lpp51mxYoVc11cZsyYYU2aNLHHH3/cjjzySFu9erXlJQJvAAAAJJUWLVrY8uXL3YWZDRo0SDOpj7kf9J988sk2ZMgQN/53yZIl3bjgeYnAGwAAAEmle/fu9scff7gLKHVxprqXzJo1y6699lo7cOCAu7hT/b914eXatWvt9ddft19//dUaN26cp/mijzcAAEASCPNOkomudu3a9vHHH9sdd9zh+m/v2bPHXUSp0VGKFi1qFSpUsA8++MAeffRR27Ztm3vv4YcfdsMP5qUiXl6Pm5JPtBJ1Z6OtW7e6lVsYBL1VLDsmAAAF0+7du10/ZN0evXTp0vmdnUJldybrPpaYk64mAAAAQAgIvAEAAJBvJk2a5Ib9y2g66qijLJnQxxsAAAD55sILL7RWrVoFGn6woCPwBgAAQL4pX768mwoDupoAAAAUMEk6NkbSr3MCbwAAgALC73qxc+fO/M5KobPz/9Z5brq/0NUEAACggNCtzitVqmSbN292z8uWLevuwIi8belW0K11rnWv3yC0wPuXX35xg5Hr3vbKhG69OX78eDvuuOMimRs0aJA9/fTTtmXLFncrzrFjx1rDhg0jaehOQj179rRp06a5Qcw7depko0aNclev+r7++mt31yHdbejQQw918/fr1y/HCwoAAJAMatas6f77wTfCoaDbX/ehBN5//vmnC6TPOOMMF3grIP7uu++scuXKkXlGjBhhjz32mE2cONENMH7PPfdYamqqrVixIjLY+JVXXmkbNmywOXPm2L59+9ztO2+44QZ78cUXIwOR6y5D7dq1s3HjxtnSpUuta9euboE1HwAAQGGlFu5atWpZ9erVXRyFvKfuJblp6c7RnSv79+/vbr/54YcfZvi+ktItOm+77Ta7/fbb3Wu6i0+NGjVs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VqlSpUDfpxWZ2x843mklYp7imRZ5Cj8t8hR+WuQp/LTIU/hpkafw0yJPibd8FStWLLg30ClZsqS1bNnS5s6dm6YFW89bt26dr3kDAAAAciIhW7xF3UauvvpqO+6449zY3RpOcMeOHZFRTgAAAICCJGED70svvdR+/fVXGzhwoLuBTvPmzW3mzJlWo0aNuH2HuqYMGjTob11U8jOtRMxTPNMiT+GnRZ7CT4s8hZ8WeQo/LfIUflrkqWAvnxTRFZZxSQkAAABAwerjDQAAACQbAm8AAAAgBATeAAAAQAgIvAEAAIAQEHgnIK53BQAASD4JO5xgYaYha7766itr3LhxfmclKW3YsMHGjh1rH330kXtctGhRO+KII6xDhw52zTXXuLumAgAAxFuhCrx37dplixcvtipVqliTJk3SvLd79257+eWXrUuXLoHS+uabb2zRokXuTpqNGjWyb7/91kaNGmV79uyxq666ytq2bRvoJkEZOXDggA0fPtyqVq3qnj/yyCMWK91sSMvz/fffW61atezyyy+PpJedL774wipXrmz169d3z//73//auHHjbO3atVa3bl3r0aOHXXbZZdmm07NnT7vkkkvs1FNPtXgYPXq0ffrpp3beeee571e+hg0b5u5q2rFjRxs6dKgVL571Jv35559bu3btrEGDBlamTBn77rvv7IorrrC9e/fa7bffbs8995wbL758+fJxyTOQLLTvLVy40N1XQWrWrOnKP93gLF7+/PNPmzZtWuByWPu+Ks4Zvf7zzz/b4YcfHvgs45o1aywlJcWVISoPpk6d6spzlTfVqlWznNKxYPz48a7szI3Vq1dHyvOmTZsG/pyWQeuoRIkS7vkPP/zgyjm/PO/WrVukrM/Ka6+9Zueee66VLVvW4kGNSzoet2nTxjV8LF++3MaMGeN+u3//+9+WmpoaOK158+b9rSHlwgsvtIYNG8Ylr0BceYXEypUrvbp163pFihTxihYt6p122mne+vXrI+9v3LjRvR7EjBkzvJIlS3pVqlTxSpcu7Z4feuihXrt27by2bdt6xYoV8+bOnZttOspL8+bNvTZt2qSZ9Prxxx/vHp9xxhmB8tS4cWPv999/d4/Xrl3r1atXz6tYsaJLR/msXr269+OPPwZK6+ijj/bmzJnjHj/99NNemTJlvFtuucUbO3as16tXL69cuXLes88+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K1bYk08+6QL2+++/373/2muv2ciRI93rujucAvdmzZrl+PsAoKD5/7fjAQAknKOPPtoGDRrkHjds2NDdkU+B8llnnZXpZ1JTU12wPnXqVOvcubN77cUXX3S30C5fvrx73qlTpzSfee655+zQQw91AbPu1pYTat3u37+/XX311e65Wrzvvfde12KvZdDtltVq365dOytRooRr+T7hhBNy9F0AUBDR4g0ACR54R6tVq5Zt3rw5y8/oFseXXHKJTZo0KdK6rS4gagn3qcVZt9RWcFyhQgWrV6+ee13BcU599dVXrkW+XLlyken666+3DRs2uNb2iy++2Hbt2uW+U6+rYuB3QwGAwoAWbwBIYGoZjqY+1UG6gyjIPv30012Qrq4pZcqUsXPOOSfy/gUXXGB169a1p59+2vW1Vppq6d67d2+G6akrivpop+83Hk1dW9Tq3bFjx799Xn2+U1JSbOXKlfbuu++6PN1888320EMP2fvvv/+35QSAZETgDQBJ6KSTTnKB7pQpU2zGjBmutdkPbn///XcXACvoPvXUU91rH330UZbpqRvK9u3bXeu5urFI+jG+dVGl0m3QoEGm6agCoKBfU/fu3a1Ro0a2dOlS91kASHYE3gCQpDS6ybhx42zVqlX23nvvRV6vXLmyG8nkqaeecl1X1L1EfbOz0qpVKytbtqzdeeedbiQSXeypCyejDRw40I2Oor7bF110kWslV/eTZcuW2X333efmP3DgQCStF154wQXiankHgMKAPt4AkKTU3UQXSx522GF28sknR15XQDx58mRbvHix617Su3dv1+UjKxrOUIHyO++840Yieemll/42tKEu6nz77bdt9uzZdvzxx9uJJ57oRjHxA2sNR6hWduVFfdfV5USjr6gSAACFQREvfac9AAAAAHFHizcAAAAQAgJvAChgNExg9JB90dNRRx2V39kDAGSCriYAUMBodJFNmzZl+J5GLuFiRQBITATeAAAAQAjoagIAAACEgMAbAAAACAGBNwAAABACAm8AAAAgBATeAAAAQAgIvAEAAIAQEHgDAAAAISDwBgAAACzv/S/N1/NUQTkDLwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100))\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.00109s] ()\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_length817.01.06215.0
\n", "
" ], "text/plain": [ " count min max\n", "value_length 817.0 1.0 6215.0" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAucAAADlCAYAAADwUFnqAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAN4NJREFUeJzt3Qd8VHW2wPGTQugdARvKri7iWhBUxO7KgqvrW9denstie/rEutZnr7i6iiAq9q4gKqggTToSKYHQQkILJIQ0SG+T+j7nn9xxJqRnyr2Z3/fzGafdufc/yTWcOXP+5x9WVVVVJQAAAACCLjzYAwAAAABQjeAcAAAAsAmCcwAAAMAmCM4BAAAAmyA4BwAAAGyC4BwAAACwCYJzAAAAwCYiJYRVVlbKvn37pGvXrhIWFhbs4QAAAKAN0mWF8vPz5bDDDpPw8IZz4yEdnGtgfuSRRwZ7GAAAAAgBycnJcsQRRzS4TUgH55oxt35Q3bp1C/ZwAAAA0Abl5eWZhLAVezYkpINzq5RFA3OCcwAAAPhTU8qomRAKAAAA2ATBOQAAAGATBOcAAACATYR0zTkAAIBdVVRUSFlZWbCHgSZo166dREREiC8QnAM2kpxVJPdNi5VbzhkoF51waLCHAwAIUk/stLQ0ycnJCfZQ0Aw9evSQ/v37t3rtHIJzwEa+j02RtXuyZUdmAcE5AIQoKzDv27evdOrUiYUSHfBhqqioSDIyMsz9Qw9t3b/fBOeAjWxOyTPXOUVl5n92/iADQOiVsliBee/evYM9HDRRx44dzbUG6Pq7a02JCxNCARvZsi/XfTs9rySoYwEABJ5VY64ZcziL9Ttr7TwBgnPAJnKLyyQ5u9h9P2YPtYYAEKr45jR0f2fNDs5TUlLkv//7v81XLZrCP/HEE2Xt2rXu5/Wr+CeffNLU2+jzI0eOlO3bt3vtIysrS2644QazKqcWz998881SUFDgtc3GjRvlnHPOkQ4dOpjlTl9++eWDxjJ9+nQ57rjjzDY6jp9++qm5bwewjbh91SUtlk0pBOcAAISaZtWcZ2dny1lnnSUXXHCBzJkzRw455BATePfs2dO9jQbRkyZNkk8++UQGDhwoTzzxhIwePVri4uJMEK00ME9NTZUFCxaY1P/YsWPltttuky+//NI8n5eXJ6NGjTKB/ZQpU2TTpk1y0003mUBet1MrV66U6667TsaPHy9//etfzWsvu+wyWbdunZxwwgm+/SkBAS5pUdvTvT+wAgBCW0pOsWQXlgbseD07R8nhPaprqRE4YVWa6m6iRx55RH755RdZvnx5nc/rrg477DD517/+JQ888IB5LDc3V/r16ycff/yxXHvttbJ161Y5/vjjZc2aNXLqqaeabebOnSsXX3yx7N2717z+7bfflscee8zMVo6KinIfe+bMmRIfH2/uX3PNNVJYWCizZs1yH/+MM86QIUOGmIC+Li6Xy1ws+iFAs/I6Rs3iA8GkLRRnrE9x3/9D3y4y//7zgjomAEBglZSUSGJioklwWklNKzD/03+WiKu8MmBjaR8ZLoseON8RAfru3bvNz2z9+vUmFrTT786KObt3796kmLNZZS0//PCDCaivuuoqMxP1lFNOkffee8/9vA5IA2rNeFt0IMOHD5fo6GhzX681A24F5kq3Dw8Pl1WrVrm3Offcc92BudLse0JCgsneW9t4HsfaxjpOXTTLruOxLhqYA3bNnGfk//ZBEgAQ2jRjHsjAXOnxApmpRwuC8127dpms9rHHHivz5s2TO+64Q+6++25TwqI0MFeaKfek963n9FoDe0+RkZHSq1cvr23q2ofnMerbxnq+Lo8++qj5xGJdkpOTm/P2Ab8pLq2QHRneZSz5rvKgjQcAADggOK+srJShQ4fKiy++aLLmWv9966231ltGYjft27c3XyV4XgA7iE/Lk8paBWYVlVVSXEqADgBwhvPPP98kbR966CGTdNXVMp9++ulGX3f99debcmVPZWVl0qdPH/n000/dJdBnn322qb7QpiQ633Dnzp317lPLqXVbT1oeXbujyvfff29iWy1D+d3vfifPPPOMlJeXu8u1dfwDBgwwMaSWXuv7s1Vwrh1YtF7c0+DBgyUpKcnc1l+CSk9P99pG71vP6bW1gpJFfwjawcVzm7r24XmM+raxngecZEutTi2WuNS6HwcAwI60mqJz586mVFmbhDz77LOmAUhDtFHIjz/+6NW5b968eWbVzb///e/mvs4zvP/++02HwIULF5pyaH1OE8ctpXMo//GPf8g999xjGpe88847Jqh/4YUXzPPffvutTJgwwTyuDVA0uNfugLYKzrVTi9Z9e9q2bZscddRR5rYWwGtwrD80zwJ4/QWNGDHC3NdrXfkqJibGvc2iRYvMD1dr061t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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100), 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.00067s] ()\n", "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "core name 27,037\n", "core hid 8,937\n", "core level 27,037\n", "core iso639-3 8,181\n", "core latitude 8,918\n", "core longitude 8,918\n", "core macroareas 22,175\n", "core countries 11,900\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 34,593\n", "core timespan 1,068\n", "sources glottolog 221,409\n", "altnames multitree 54,462\n", "altnames hhbib_lgcode 41,413\n", "altnames lexvo 26,035\n", "altnames elcat 23,792\n", "altnames aiatsis 5,123\n", "altnames wals 2,441\n", "altnames glottolog 2,113\n", "altnames wals other 2,097\n", "altnames moseley & asher (1994) 2,088\n", "altnames ruhlen (1987) 2,007\n", "altnames ethnologue 3\n", "triggers lgcode 29,953\n", "triggers inlg 187\n", "identifier multitree 14,818\n", "identifier endangeredlanguages 3,596\n", "identifier wals 2,618\n", "identifier languagelandscape 333\n", "classification sub 12,364\n", "classification subrefs 18,773\n", "classification family 189\n", "classification familyrefs 700\n", "endangerment status 8,567\n", "endangerment source 8,567\n", "endangerment date 8,567\n", "endangerment comment 8,567\n", "hh_ethnologue_comment isohid 639\n", "hh_ethnologue_comment comment_type 639\n", "hh_ethnologue_comment ethnologue_versions 639\n", "hh_ethnologue_comment comment 639\n", "iso_retirement code 371\n", "iso_retirement name 371\n", "iso_retirement change_request 360\n", "iso_retirement effective 371\n", "iso_retirement reason 371\n", "iso_retirement change_to 455\n", "iso_retirement remedy 338\n", "iso_retirement comment 232\n", "CPU times: total: 750 ms\n", "Wall time: 762 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.61s ago] ('table', 'languoid')\n", "SELECT count(*) AS n_rows \n", "FROM languoid\n", "[generated in 0.00045s] ()\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", "27037\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.622s 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.00077s] ()\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.639s ago] ('table', 'pseudofamily')\n", "SELECT count(*) AS n_rows \n", "FROM pseudofamily\n", "[generated in 0.00040s] ()\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.00082s] ()\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.00130s] ('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": [ "27,037 languoids\n", " 247 families\n", " 182 isolates\n", " 429 roots\n", " 8,612 languages\n", " 4,585 subfamilies\n", "13,593 dialects\n", " 7,675 Spoken L1 Languages\n", " 227 Sign Language\n", " 120 Unclassifiable\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "ROLLBACK\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 87 Pidgin\n", " 68 Unattested\n", " 31 Artificial Language\n", " 8 Mixed Language\n", " 15 Speech Register\n", " 8,231 All\n", " 381 Bookkeeping\n", "CPU times: total: 391 ms\n", "Wall time: 377 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.00092s] (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.00096s] (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.00078s] ()\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
dialect0259801099513593
family2470458504832
language1820843008612
all4292598130151099527037
\n", "
" ], "text/plain": [ " n_languoids all\n", "parent_level NaN dialect family language \n", "child_level \n", "dialect 0 2598 0 10995 13593\n", "family 247 0 4585 0 4832\n", "language 182 0 8430 0 8612\n", "all 429 2598 13015 10995 27037" ] }, "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.00085s] ()\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
dialect135932792.052527
family4832450.931291
language8612785791.233163
\n", "
" ], "text/plain": [ " n_languoids n_isos ratio\n", "level \n", "dialect 13593 279 2.052527\n", "family 4832 45 0.931291\n", "language 8612 7857 91.233163" ] }, "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.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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
n_languoidsn_locationsratio
level
dialect135935824.281616
family4832360.745033
language8612830096.377148
\n", "
" ], "text/plain": [ " n_languoids n_locations ratio\n", "level \n", "dialect 13593 582 4.281616\n", "family 4832 36 0.745033\n", "language 8612 8300 96.377148" ] }, "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.00082s] ('language',)\n", "ROLLBACK\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuUAAAF9CAYAAACj5xZNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZu1JREFUeJztnQnUJkV1v3tm2BGGARFkmQHUAy4YUKIOEv+yCBIUXCKKiqAoB8WoEdlEREyQUZRzIsggMYonKuYQo7gBGjDmIKuiIKsY9l1BPghhkaH/57beL/crqqqXt/f3ec7peed7316qu2v51a1bt+alaZomAAAAAADQGfO7uzQAAAAAAAiIcgAAAACAjkGUAwAAAAB0DKIcAAAAAKBjEOUAAAAAAB2DKAcAAAAA6BhEOQAAAABAxyDKAQAAAAA6BlEOAAAAANAxiHIAAAAAgDGL8oceeij50Ic+lCxZsiRZffXVk+233z657LLLZn9P0zT5+Mc/njzzmc/Mft9ll12SG264ockkAQAAAABMlyh/97vfnfz4xz9O/uVf/iX59a9/ney6666Z8L7jjjuy3z/zmc8kn//855NTTz01ueSSS5I111wz2W233ZJHH320yWQBAAAAAPSKeamYqxvgkUceSdZaa63krLPOSvbYY4/Z71/84hcnu+++e/L3f//3yUYbbZQccsghyUc+8pHst5mZmWSDDTZITj/99OQtb3lLE8kCAAAAAOgdKzV14ieeeCJZsWJFstpqq835XtxULrjgguSmm25K7r777sxyrixcuDB56Utfmlx00UVBUf7YY49lm/Lkk08m999/f7Leeusl8+bNa+p2AAAAAGDKSdM0c88Ww/L8+fOHIcrFSr506dLMIv7c5z43s4CfccYZmeB+9rOfnQlyQb63yN/6m4/jjz8+OfbYY5tKNgAAAABAlNtuuy3ZZJNNkkGIckF8yd/1rnclG2+8cbJgwYLkRS96UbLPPvskv/jFLyqf88gjj0w+/OEPz/4tLi+LFy/OHs7aa69dU8oBAAAAAOby4IMPJptuumlmfK6bRkX5s571rOSnP/1p8vDDD2c3IVFW3vzmNydbbLFFsuGGG2b73HPPPdn3ivy9zTbbBM+56qqrZpuLCHJEOQAAAAA0TRMu063EKZeoKiK8//CHPyTnnntustdeeyWbb755JszPO++82f1E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OcAUu6MQOhQAAKAf4L4CMCJwRwEAAGgO3FcAoBC4owAAAAwTLOUAAAAAAAXAUg4AAAAAMGIQ5QAAAAAAHYMoBwAAAADoGEQ5AAAAAEDHIMoBpoSyMcwBAACgPRDlAFPCsmXLshjm8ikg0gEAAPoDohxgSpDY5euuu27y0EMPZULcFekKYh0AAKB9EOUAU8JBBx2UrLXWWsn999+fCXFXpCshsQ4AAADNgSgHmNIVP12R7tsHAAAA2oEVPQGmGHVjUZEOAAAA3ehORDkAAAAAQMe6E/cVAAAAAICOQZQDAAAAAIxZlP/gBz9IXvrSlyarr756smjRouR1r3vdnN9vvfXWZI899kjWWGON5BnPeEZy6KGHJk888USTSQIAAAAA6B0rNXXib33rW8l73vOe5FOf+lSy0047ZWL7qquumv19xYoVmSDfcMMNkwsvvDC56667kne84x3JyiuvnB0DAAAAADAtNDLRUwS4LD5y7LHHJgcccIB3n7PPPjt5zWtek9x5553JBhtsMBsJ4vDDD09+97vfJausskqhazHREwAAAADaYHATPS+//PLkjjvuSObPn59su+22yTOf+cxk9913n2Mpv+iii5Ktt956VpALu+22W3azV199dfDcjz32WLaP3QAAAAAAhkwjovzGG2/MPj/xiU8kH/vYx5Lvf//7mU/5K1/5ymyhEuHuu++eI8gF/Vt+C3H88cdnPRTdNt100yZuAQAAAACgn6JcFhiZN29edLvuuuuSJ598Mtv/qKOOSt74xjcmL37xi5OvfOUr2e9nnnnmRAk+8sgjsyED3W677baJzgcAAAAAMKiJnoccckiy//77R/fZYostskmbwvOe97zZ71ddddXsN4m4IsgEz0svvXTOsffcc8/sbyHkPLIBAAAAAEylKF9//fWzLQ+xjItwvv7665Mddtgh++6Pf/xjcvPNNydLlizJ/l66dGly3HHHJffee28WDlH48Y9/nDnNWzEPAAAAADB2GgmJKML6oIMOSo455pjM51uE+AknnJD99qY3vSn73HXXXTPxve+++yaf+cxnMj9y8T8/+OCDsYQDAAAAwFTRWJxyEeErrbRSJrofeeSRbBGh888/P5vwKSxYsCCbAPre9743s5qvueaayX777Zd88pOfbCpJAAAAAADTE6e8TYhTDgAAAABtMLg45QAAAAAAUBxE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ww9nZUk6vC7/+7//m5W1o48+Ovv893//9+T6669P9txzzzn7iSCX9k/Wdvn+97+fCcUDDzywxbuYXh6OvD9B6sxzzjkn0yjXXnttpj9EpH/3u9+d3efv/u7vku9973vJmWeemfz0pz/NOl1veMMbyiUkHRhf+cpX0oULFz7l+8suu0xCO6a33nrr7HdXXnll9t0NN9yQ/X3KKaekixYtSh977LHZfQ4//PB0yy23bCn1EHp/Pt73vvelO+644+zfhx12WPr85z9/zj5vfvOb09122632dEKYP/7xj+nGG2+cfulLXwru88Mf/jCdP39+evfdd89+t3z58nTttdeeU/6gfV7ykpekBx988OzfK1asSDfaaKP0+OOP7zRd8FSkfdphhx2Cvz/55JPphhtumJ5wwgmz3z3wwAPpqquump5xxhktpRJcRHd8+9vfju5z6aWXZvvdcsst2d/XXHNN9rdoGeXss89O582bl95xxx2Npxni70+0xyc/+ck5373oRS9KjzrqqNlyt/LKK6dnnnnm7O/XXnttdq6LLrooLcpgLOV5bLnlltmQwT//8z9n1rlHHnkk+7+4QcgwrXDRRRclr3jFK5JVVlll9jixKEiPVSwS0C9mZmaSddddd/ZveX8yNGuR9yffQ3uIpUeG1OfPn59su+222bD57rvvnlx11VWz+8g7kaHaDTbYYM67ktEqsQRBN0jdKKNSthzJe5S/KUf9Q6xw2223XTbKKCOJUt7+6Z/+ac7ooayGbd/nwoULM5ck3mf/2zdxk1B3Tnlf8n9534q8VymfMgIC3SLut1Iepe0T3f6Tn/wk+c1vfpN5XwhSr4pXhi2LsnCmeG+UKYujEeXiqiL+xjK0IP4+4s8jQw0y5KcrhErlZUWCoH/Lb9AfxOVBhtnt0F3o/YnQk04YtMONN96YfYrr18c+9rFsmFWG01/5yldmPpECZa2f/P73v89ci3zvhvfSz7K2fPny5DnPeU7mpifufx/4wAcydzBB3xnvc1iIa5H4mMs8KvEfF+R9ScfLItpFDFO8y+456aSTMj9y8SkXw664S4urixh6BXlH8r07Z65sWexUlB9xxBFZTzG2XXfddYXOJaJMJkWI/93FF1+c+bi+4AUvyPxaEWz9f38Wsbjutddemc+r9kKhP+/zySefzPYXv3+ZyPLiF784+cpXvpL9Lr50AFAPUtZkYvunPvWpzEouRor3vOc9T5lgBsNBrKl77713Zm2VDhcMR5RffPHFmbVcrOIyt0Mmdf7Hf/xHrdf5kwm5Iw455JBk//33j+6zxRZbFDrXN77xjeTmm2/OhglkuEe/EwveWWedlbzlLW9JNtxww6fMhNW/5Tfo7v0pMpFJIuhI4yNWWEvo/YmlQUZHoJ33edddd2X/F6uBItFw5DeJuKLvyo3oQVnrnqc//enJggULvOWI99I/xDXMljNBXDJlorWg70zen+yryN/bbLNNy6mFooL8lltuSc4///xZK7m+S3eytUSrktFHyma3iGH3ox/9aPLtb387M/QKL3zhC7OAE5/97GczlxV5R+Ie+MADD8yxlpetWzsV5euvv3621YHMbhYxLtY6Rf9Wy97SpUsz654UDJnNLsgsZ/FHt7PZof33J4iv8U477ZTst99+WQhFF3l/P/zhD+d8J+9Pvof23qdYxkWEy1yMHXbYIftOypR0iiWykSDvRN6hNDI6JCvvShohV2RAe8jwqry/8847bzaEpdSP8rdEEoB+ISO/Us4s4seq5WzzzTfPGnx5fyrCxZ1PfJBDka6gW0Eu4SrFH1nmwFmkzhRBJ1ZYKaOCCHcpnzJHALp9d7KpwVcRA4fqS3lnoiulLMoIsiBlVwxVpTRKOhBkhvIvf/nL9Nhjj02f9rSnZf+X7aGHHpqd5Sozzt/73vdms5ivuuqq9O1vf3sW6ePOO++cnR27wQYbpPvuu2/2+ze/+c10jTXWSL/4xS92fHfjJ+/9/frXv07XX3/97J3ddddds9u99947e44bb7wxe1+HHnpo9r6/8IUvpAsWLEjPOeecDu9sOvngBz+YRWA599xz0+uuuy494IAD0mc84xnp/fffn/3+xBNPpC94wQvSXXfdNf3Vr36VvSN5v0ceeWTXSZ96pN6TuvL000/P6soDDzwwXWeddeZEyoF+IBE6VlpppfS4447Looh9/etfz+rAr33ta7P7LFu2LHt/Z511VhZxbK+99ko333zz9JFHHuk07dOGtGXarom0OvHEE7P/S9v3+OOPp3vuuWe6ySabZPWhbeNsNKpXv/rV6bbbbptecskl6QUXXJA+5znPSffZZ59O72taeCjy/oT/9//+XxaB5Sc/+UmmRSSS3GqrrZZF9VMOOuigdPHixen555+f/vznP0+XLl2abWUYjCjfb7/9sgflbvKAlB/96Efpy1/+8kyIS+jDnXba6SmhaK644oosxJQ0SiIqpEKD7t/fMccc4/19yZIlc84j+2+zzTbpKquskm6xxRZZwYD2kUbmkEMOyYT4Wmutle6yyy5ZR9dy8803p7vvvnu6+uqrp09/+tOz/SWcInTPSSedlDUeUo4kROLFF1/cdZIgwPe+972sgytt1lZbbZWedtppTwmLePTRR2cGJ9ln5513Tq+//vrO0jutSNvka8Ok7bvpppu8v7ka5r777stEuBiuJHzsO9/5zlnDFXT3/gTpQO2///5Z+FgR4xJK+3Of+1xW/hTpCEsoZ9Gf0nl+/etfnx1XhnnyT72GfgAAAAAAKMNoQiICAAAAAAwVRDkAAAAAQMcgygEAAAAAOgZRDgAAAADQMYhyAAAAAICOQZQDAAAAAHQMohwAAAAAoGMQ5QAAAAAAHYMoBwAAAADoGEQ5AAAAAEDHIMoBAAAAAJJu+f9dx3QgpBL1fgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 6 * 72 / 100))\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.00093s] ('family', 'language', 100)\n", "ROLLBACK\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAEJCAYAAAAU4GfGAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAARzxJREFUeJztnQuYTWX7/x9iZkgHopBIeEMOSSWHQipKkYpIIqqX6OCnkkoTHZAiVJRKvUVRoZNDYoiSQ5F0cMghqSinSAjrf33u/7X2tfbYs5sZew575vu5rmXP3mvttZ499uzvvu/nfu5vAc/zPCeEEEKIiBSM/LAQQgghQEIphBBCREFCKYQQQkRBQimEEEJEQUIphBBCREFCKYQQQkRBQimEEEJEQUIphBBCRKFQtJ0iPjh8+LD75Zdf3HHHHecKFCiQ08MRQoi4gH47u3fvdmXLlnUFC6YdN0oo8wCI5GmnnZbTwxBCiLhk06ZNrly5cmnul1DmAYgk/f/s448/PqeHI4QQccGff/5pQYb/GZoWEso8gJ9uRSQllEIIkTH+bcpKxTxCCCFEfo8ou3Tp4nbu3OmmTp3q8jI1kme6golFc3oYQgiRbWwY3DLLr5GnIsoNGzZYCL18+fKjPtfjjz/uGjRo4IoWLepOPPHEI/Z//fXXrkOHDpbfLlKkiKtWrZobMWLEEQLNeFJvZ511VuiYQ4cOuf79+7uKFSvaeSpVquQeffRRq8YSQgiR8+SLiDIzHDhwwLVt29bVr1/fvfzyy0fs//LLL93JJ5/s3njjDRPLzz//3N12223umGOOcb169bJjEM7BgweHnnPw4EFXu3ZtO6/PkCFD3OjRo91rr71mArp06VJ38803uxNOOMHdeeed2fRqhRBC5JmIcsaMGa5Ro0YW5Z100knuyiuvdD/++KPtIyqDOnXqWOTWpEmTDJ/DZ8CAAa53796uZs2aEc/RtWtXE8LGjRu7M844w914440mcJMnTw4dg9iVLl06tCGCO3bssON8ENjWrVu7li1butNPP91dd9117rLLLnOLFy+Oye9LCCFEPhPKv/76y/3f//2fic7s2bNtkWibNm1s0b0vLp988on79ddfw0Qrvec4Gnbt2uVKlCiR5n4i00suucRVqFAh9BjpXcawevXqUEp3wYIF7vLLL0/zPPv377ey5uAmhBAia4i71Ou1114bdv+VV15xpUqVct99953dAlEiEVxmzlGjRo1MjYvIcOLEie6jjz5KsynA9OnT3YQJE8Iev//++03oqlatamlb5iyZH+3YsWOa1xo0aJBFvEIIIbKeuIso16xZY0U0pDtZM0i6En766adsPUeQlStXWvo0OTnZ0qaRYA6SVO/VV18d9vikSZPc+PHjTUC/+uorO+6pp56y27To16+fRa/+RqMBIYQQWUPcRZRXXXWVpS7Hjh1r/flIlxIFUnyTnefwIQpt1qyZFfI89NBDEY+hgpWotVOnTi4hISFs37333mtRZfv27e0+c6IbN260qLFz584Rz5eYmGibEEKIrCeuhHLbtm1u1apVJnAXXnihPcZ8no8vQqQvM3uOjPDtt9+6iy++2ASNdGlazJs3z61du9Z169btiH179+49ohkvKdijnS8VQgiRD4WyePHiNv/44osvujJlyliqlGjMh+UarEWkqpUGt0lJSVZ5mpFz+PD49u3b7Rbh9ddmVq5c2RUrVszSrYhk8+bNrTDot99+C4mcP1caLOKpV69exPlPoltEtnz58rY8ZNmyZW7YsGFWVZtRVg5orhZ2QggRa7w4Y9asWV61atW8xMREr1atWt7cuXNZme9NmTLF9o8dO9Y77bTTvIIFC3qNGze2xzp37uy1bt063efwn8NjqbeUlBTbn5ycHHF/hQoVwsa7c+dOr0iRIt6LL74Y8fX8+eef3l133eWVL1/eS0pK8s444wzvwQcf9Pbv35/u38muXbvs2twKIYSI7WdnAf6JufqKbIWqWSJnCnsUUQohRGw/O+Ou6lUIIYTITiSUQgghRBQklEIIIUQUJJRCCCFEFCSUQgghRBQklEIIIUQUJJRCCCFEXunMkxXMnTvXNW3a1HwiaVru8+mnn7qhQ4eaQTOWXVOmTDmiofkjjzzi3nrrLWtKTvu8unXrWpcduvD40N3njjvucB988IG1qsO5BB9Luvv454jkBFK0aFGzA8sINZJnuoKJRTPxWxBCiKNjw+CWLq+iiDINEKnatWu75557Ls1j/vOf/7hnn33WffPNN9YvFhcS3EN+//330DHYZdETdtasWe7DDz80AaaBus8999xjQhzcqlev7tq2bZvlr1EIIUQeEUp6tzZq1MgiPvq0Xnnlle7HH38MRYQFChRwO3fuDB1PX1Ye27Bhg93HjYOe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", "text/plain": [ "
" ] }, "metadata": {}, "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(figsize=(6 * 72 / 100, 4 * 72 / 100)));" ] }, { "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.00082s] ('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_size57.02.01409.0
\n", "
" ], "text/plain": [ " count min max\n", "family_size 57.0 2.0 1409.0" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100), 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.00098s] ('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
dialect25980017000.1911280.0000000.000000
family0458584300473710.0000000.9488821.744619
language109950032001.2767070.0000000.000000
\n", "
" ], "text/plain": [ " sum max mean \\\n", "child_level dialect family language dialect family language dialect \n", "parent_level \n", "dialect 2598 0 0 17 0 0 0.191128 \n", "family 0 4585 8430 0 47 371 0.000000 \n", "language 10995 0 0 32 0 0 1.276707 \n", "\n", " \n", "child_level family language \n", "parent_level \n", "dialect 0.000000 0.000000 \n", "family 0.948882 1.744619 \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) + 0.0) 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.00097s] ()\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) + 0.0) 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.00077s] ('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
dialect0560.278967
family1486134.414321
language01191.578379
total048616.793468
\n", "
" ], "text/plain": [ " n_descendants \n", " min max mean\n", "parent_level \n", "dialect 0 56 0.278967\n", "family 1 4861 34.414321\n", "language 0 119 1.578379\n", "total 0 4861 6.793468" ] }, "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.53s ago] ('table', 'macroarea')\n", "SELECT count(*) AS n_rows \n", "FROM macroarea\n", "[generated in 0.00032s] ()\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.534s ago] ('table', 'languoid_macroarea')\n", "SELECT count(*) AS n_rows \n", "FROM languoid_macroarea\n", "[generated in 0.00030s] ()\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", "22175\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.00063s] ()\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.00097s] ('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
Africa2375
Papunesia2216
Eurasia2029
North America793
South America718
Australia389
\n", "
" ], "text/plain": [ " n_languages\n", "macroarea \n", "Africa 2375\n", "Papunesia 2216\n", "Eurasia 2029\n", "North America 793\n", "South America 718\n", "Australia 389" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "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', figsize=(6 * 72 / 100, 4 * 72 / 100))\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.00095s] (', ', '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.678s ago] ('table', 'country')\n", "SELECT count(*) AS n_rows \n", "FROM country\n", "[generated in 0.00027s] ()\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.682s ago] ('table', 'languoid_country')\n", "SELECT count(*) AS n_rows \n", "FROM languoid_country\n", "[generated in 0.00041s] ()\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", "11900\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.00074s] ('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 Guinea899
Indonesia753
Nigeria589
India518
China452
Australia401
Mexico339
Brazil338
United States321
Cameroon317
\n", "
" ], "text/plain": [ " n_languages\n", "country \n", "Papua New Guinea 899\n", "Indonesia 753\n", "Nigeria 589\n", "India 518\n", "China 452\n", "Australia 401\n", "Mexico 339\n", "Brazil 338\n", "United States 321\n", "Cameroon 317" ] }, "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.00083s] (', ', '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...
vlax1238Vlax Romani32AL, AT, BA, BG, BY, CH, CZ, DE, ES, FI, FR, GR...
balk1252Balkan Romani30AL, AT, BA, BG, BY, CH, CZ, DE, FI, FR, GB, GR...
stan1288Spanish30AD, AR, BO, BR, BZ, CL, CO, CR, CU, DO, EC, ES...
sint1235Sinte-Manus Romani29AL, AT, BA, BG, BY, CH, CZ, DE, FI, FR, GB, GR...
carp1235Central Romani28AL, AT, BA, BG, BY, CH, CZ, DE, FI, FR, GB, GR...
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...
\n", "
" ], "text/plain": [ " name n_countries \\\n", "id \n", "stan1293 English 34 \n", "vlax1238 Vlax Romani 32 \n", "balk1252 Balkan Romani 30 \n", "stan1288 Spanish 30 \n", "sint1235 Sinte-Manus Romani 29 \n", "carp1235 Central Romani 28 \n", "stan1318 Standard Arabic 25 \n", "amer1248 American Sign Language 22 \n", "east2295 Eastern Yiddish 22 \n", "russ1263 Russian 20 \n", "\n", " countries \n", "id \n", "stan1293 AU, BM, BR, BZ, CA, CC, CK, CU, CX, DO, FK, GB... \n", "vlax1238 AL, AT, BA, BG, BY, CH, CZ, DE, ES, FI, FR, GR... \n", "balk1252 AL, AT, BA, BG, BY, CH, CZ, DE, FI, FR, GB, GR... \n", "stan1288 AD, AR, BO, BR, BZ, CL, CO, CR, CU, DO, EC, ES... \n", "sint1235 AL, AT, BA, BG, BY, CH, CZ, DE, FI, FR, GB, GR... \n", "carp1235 AL, AT, BA, BG, BY, CH, CZ, DE, FI, FR, GB, GR... \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... " ] }, "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.00101s] ('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.00103s] ('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_countries8612113251341.315026
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_countries 8612 11325 1 34 1.315026" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAt4AAADpCAYAAAATdDBjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAKu1JREFUeJzt3QmYjfX///H32NexlS1rKUtElkpUtqi0CEWKShuhtBAlWwstRClKhUqhRQtfW6R+FREpS2ghSpay79v9v16f/3Wf68w0gxn3uWfGPB/Xda4559z3nM99Zs65z+v+nPfnc8d5nucZAAAAgJjKEtuHBwAAACAEbwAAACAEBG8AAAAgBARvAAAAIAQEbwAAACAEBG8AAAAgBARvAAAAIAQEbwAAACAE2ewUdfToUduwYYPlz5/f4uLi0npzAAAAcArSuSh37dplJUuWtCxZsmTO4K3QXbp06bTeDAAAAGQC69evt1KlSmXO4K2ebv+PEB8fn9abAwAAgFPQzp07XWevnz0zZfD2y0sUugneAAAAiKUTKW1mcCUAAAAQAoI3AAAAEIJTttQEAAAgpY4cOWKHDh1K681AOpM9e3bLmjXrST8OwRsAAGR6mhJu48aNtn379rTeFKRTBQsWtOLFi5/UNNWZNniX6zU11b+7dnDzQLcFAACkLT90Fy1a1PLkycM5QJDgoGzv3r22efNmd7tEiRKWWpk2eAMAAPjlJX7oLlKkSFpvDtKh3Llzu58K33qdpLbshMGVAAAgU/NrutXTDSTHf32czBgAgjcAAMAJzsOMzCsugNcHwRsAAAAIAcEbAAAACAGDKwEAAAKeAS29z5qmsonJkydbixYtQmsT9HgDAAAAoSB4AwAAACEgeAMAAGRADRo0sPvuu8969uxphQsXdmdV7N+/f6oe65FHHrFzzjnHTZl35pln2uOPP55g2jw9bo0aNeztt9+2cuXKWYECBaxt27a2a9euyDq6fvPNN1vevHndSWZeeOEFt43du3dPUOLy8ccf/+eMkGPHjj3hbZEnn3zSzaedP39+u/POO61Xr15u+6K9/vrrVrlyZcuVK5dVqlTJXnnllciygwcPWteuXd12annZsmVt0KBBFmsEbwAAgAxq3LhxLuh+99139uyzz9rAgQNt1qxZKX4cBViF3xUrVtjw4cNt9OjRLjhH++2331xonjJlirt8+eWXNnjw4MjyBx980L755hv79NNP3Tb83//9ny1evDjwbRk/frw99dRT9swzz9iiRYusTJkyNnLkyASPoXX69u3r1vv555/t6aefdgFefy958cUX3XZOmjTJVq1a5dbXAUWsMbgSAAAggzrvvPOsX79+7vrZZ59tI0aMsNmzZ9vll1+eosfp06dP5LoC6MMPP2wTJkxwvem+o0ePukCsYCzt27d3bSncqrdbofbdd9+1xo0bu+VjxoyxkiVLpvg59TnOtrz00kt2xx132O233+5uK2DPnDnTdu/eHfk9/U2GDBliLVu2dLfLly/vgvyrr75qt956q61bt879verXr+964dXjHQaCNwAAQAYO3tFUOqHTmqfUxIkTXS+werUVYA8fPmzx8fEJ1lEI9kN34rZ+//13Vw5ywQUXRJarHKVixYqBb8uqVavs3nvvTfA7anfOnDnu+p49e9zvKpzfddddkXX0ONomue2229zBibbviiuusKuvvtqaNm1qsUapCQAAQAaVPXv2BLfVe6ue6ZSYN2+eq82+6qqrXAnJDz/8YI899pirgw66rbi4OPM8L8F90fXbJ7otx+L3fKtEZcmSJZHLsmXLbP78+W5ZzZo1bc2aNfbEE0/Yvn377MYbb7TWrVtbrNHjDQAAkIl9++23rtRCAdf3xx9/pOgxNAhSwXzhwoWu5lp27Nhhq1evtksvvTSy3umnn25///135PYvv/xie/fuTdG2qJda7XTo0CFyn277ihUr5kpc1AuvEJ8c9aK3adPGXRS61fO9detWN1A1VgjeAAAAmZhqnVXzrDrqOnXq2NSpU93JdVJCJSiqne7Ro4cLrppxRHXWWbJkcb3cvkaNGrk69Lp169qRI0fcDCbRPeknsi3dunVzJSS1a9e2iy++2JWm/PTTTy78+wYMGOBmfFFpiQL1gQMH7Pvvv7dt27a5QaBDhw51pTLnn3++28b333/fzQqjGVZiieANAACQxmeSTEvXXnutPfDAA256PQXU5s2buxlAUjo1ocJsp06dXL20epM1GHL9+vVuuj7fkCFD3KDISy65xPVKa9YSzUySkm1RL7Z6szXocv/+/a5MRDXbCxYsiKyjKQY1HeFzzz3nDgY080u1atUiUxvqQEGzwKjHPWvWrC7k/+9//3MhPJbivMSFNqeInTt3uqMcfc2ReHDAyZ4GNrO8EQEAyAwU3lTvq5kvokMiTo4GOZ5xxhkubGugYyxpoKR6rDXPeNivk+Nlzmj0eAMAAOCkaSDkypUr3QwjCqGaU1yuu+66QNvZu3evjRo1ypo1a+Z6q9977z37/PPPUzV/ediY1QQAAOAUopPB5MuXL8nLueeeG9O2n3/+eatevbo1adLE9XjrJDqnnXZaoG3ExcW5shAN2qxVq5Z99tln9uGHH7o2T7ng/ddff9ktt9xiRYoUsdy5c7t6GRWr+1S5oonMVbCu5fojqH4mmkaMqj5H3fEqYtfXD9GTnouK5FX/o6780qVLuzocAAAAHJvqpKOn0Yu+KLDGigYqql5bmU5ZTz3QyolBy507t+vh/vfff12419kx/RPlpHcpKjXRSNB69epZw4YNbdq0aW5KGIXqQoUKRdZRQNak5zp7kWpgVBCvrwJ0tiC/HkahW1PJ6B+iuRtVZH/33Xe7sx35tTKaxFyhXV8lLF261Dp27OhCutYDAABA0jRwMPpEN8igwfuZZ55xvc86BahP4Tq6t3vYsGHuVJ9+Pc9bb73l5lP8+OOPrW3btvbzzz/b9OnT3XyLmgbGP/WnJkrX1xMa4aqvSDRR+ptvvmk5cuRwX4voKE2jZQneAAAgFk7R+SaQjl4fKSo1+fTTT11YvuGGG9z8jPpKQWcF8mmk58aNGxPU2GiU54UXXujORCT6qZ5rP3SL1tf0Ld99911kHdXtKHT71GuuU4Sq1z0pmnJGPeXRFwAAgOPx55GOPpELkJj/+kh8Bs+Y9XhrzsSRI0e6iccfffRR12utyckVkDVpukK3qIc7mm77y/RToT3BRmTL5iZbj14nuic9+jG1LLq0xTdo0CA3WToAAEBKaGYMdQpu3rzZ3db8z9EnfUHm5nmeC916feh1otdLKMH76NGjrqf66aefdrfV463z3qsOW8E7LfXu3dsdEPjU462yGAAAgOPRHNDih28gMYVu/3USSvDWTCVVqlRJcF/lypXdFC7ib8ymTZvcuj7drlGjRmSdxC/qw4cPu9Gv/u/rp34nmn87uSecM2dOdwEAAEgp9XAru+hbeU38AERTecnJ9HSnKnhrRhPVWUdbvXq1lS1b1l1XeYiC8ezZsyNBWz3Pqt3u3Lmzu123bl3bvn27m25Gcy/KnDlzXG+6asH9dR577DH3wvfraDQDSsWKFZMsMwEAAAiCwlUQAQs46cGVDzzwgM2fP9+Vmvz6669u+r/XXnvNunTpEjla7N69uz355JNuIKamAezQoYObqaRFixaRHvIrrrjC7rrrLluwYIF988031rVrVzfjidaTdu3aubpxze+9fPlymzhxog0fPjxBKQkAAACQkaSox7tOnTo2efJkV0+t04Cqh1vTB2pebl/Pnj3dZOaa9k892/Xr13fTB0af017TBSpsN27c2M1m0qpVKzf3d/RMKDNnznSBXr3iOuORTsrDVIIAAADIqOK8U3TSSpW4KMDv2LHDnSEzsXK9pqb6sdcObn6SWwcAAIDMkDlP6pTxAAAAAFKO4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAISA4A0AAACEgOANAAAAhIDgDQAAAKT34D148GCLi4uz7t27R+7bv3+/denSxYoUKWL58uWzVq1a2aZNmxL83rp166x58+aWJ08eK1q0qPXo0cMOHz6cYJ25c+dazZo1LWfOnFahQgUbO3bsyWwqAAAAkDGD98KFC+3VV1+18847L8H9DzzwgH322Wf2/vvv25dffmkbNmywli1bRpYfOXLEhe6DBw/at99+a+PGjXOhum/fvpF11qxZ49Zp2LChLVmyxAX7O++802bMmJHazQUAAAAyXvDevXu33XzzzTZ69GgrVKhQ5P4dO3bYG2+8YUOHDrVGjRpZrVq1bMyYMS5gz58/360zc+ZMW7Fihb3zzjtWo0YNu/LKK+2JJ56wl19+2YVxGTVqlJUvX96GDBlilStXtq5du1rr1q3thRdeCOp5AwAAAOk/eKuURD3STZo0SXD/okWL7NChQwnur1SpkpUpU8bmzZvnbutntWrVrFixYpF1mjVrZjt37rTly5dH1kn82FrHf4ykHDhwwD1G9AUAAABIL7Kl9BcmTJhgixcvdqUmiW3cuNFy5MhhBQsWTHC/QraW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4Ycfdu9Lze+fP3/+wNoEMjq9R+fNm+fOgSHFixd3+32djC5WtA/QQXFS9//5559WpkwZi6U1a9ZE9vNVq1aNSRvqNNLndoMGDdzB//Lly+3ll192z/H666+3Zs2aWazMmTPnP50P1157rZ199tkxaxMxonm8kbwlS5Z4WbJkCfQxV61a5ZUtW9aLi4tzj33ppZd6GzZsiCzfuHFj4G1OmzbNy5Ejh1e4cGEvV65c7vbpp5/uNWnSxGvUqJGXNWtWb/bs2YG1p+dWo0YNr0GDBgkuur9OnTruesOGDb2gVa5c2fv333/d9XXr1nnlypXzChQo4NrUcy9atKj3+++/B9rmeeed582aNctdHz16tJc7d27vvvvu80aOHOl1797dy5cvn/fGG28E2qb/2jn77LO9wYMHe3///bcXa0888YSXP39+r1WrVl7x4sVdu0WKFPGefPJJ7+mnn3avp759+wbaZr169bz+/ftHbr/99tvehRde6K5v3brVvcb0t46FAwcOeBMnTnT/w7Zt27qLrk+aNMktC5v2CwMGDIjJY69fv97btWvXf+4/ePCg9+WXX3phKF++vLd69epQ2jp69Kg3Z84c77XXXvM+++wz9zxj9XfdsmVL5PZXX33ltWvXzqtfv7538803e99++22g7W3atMk9tvYP+oy54IIL3MX/vNEyrROkHTt2eDfccIP7XNH+9fHHH/cOHz4c08+zzp07R16ve/fudfskteHvF/XZktTr+WR8+OGH7nNS+zzt07XPL1iwoPsMbdasmVs2fvx4L2j6f+l/qOeVLVs297NWrVpuH6w2e/To4cXKd9995w0bNszr1auXu+i67oulI0eOJHv/H3/84YVBr5+1a9fG7PEzffD+5JNPjnl54YUXAt9ptGjRwmvevLnbIf/yyy/uuj50/BdVLHZUdevW9R577DF3/b333vMKFSrkPfroo5HlelNdfvnlgbU3aNAg95wSh3ntOJYvX+7Fina8/geLPtguvvhib/v27e62dsTaSd50002Btqmg7b9Jzz//fPdhHk074ypVqgT+PD///HPv/vvv90477TQve/bs3rXXXutCRHI7rpN11llnuQ8f/4BUO/133nknsvyjjz7yKlSoEPjf9rfffovc1nPTc9V7RGbOnOmVLFnSC5rel2eeeaYLE5dddpl34403uouu6z49T62T0TsBdMCvg1I9rv6f7du3TxBYYrEvGj58eJIXtd+7d+/I7SBdeeWVkf2ADsx18Kb3kA4W9fwqVarkbd682QuaApPek/Lxxx+7tvQ+feSRR7zrr7/evZb95UFQANW+fuXKlf9Zpvu0P2zdurUXJB34nnPOOd7777/vOh4U8vWZ5h+c6jWkv3WQ9Hf09/N6zZQqVcodSO3Zs8f7+uuv3b5Kn2lBqlmzputk8D9DFboHDhwYWf7888+7joCgtWnTxmUGHeDs37/f69q1q9ehQwe3TJ+vOhBQIA5SZjmA+ySZ3Kd90YgRIyK3g5bpg7d/hKyfyV2C/mfrRfXTTz8l6H3p1KmTV6ZMGRcyYvECi4+PjwQFhRcF4MWLF0eWL1261CtWrFigbS5YsMDtkB966KFIj1KYwVvBScEs2jfffOOVLl060Da14/v+++8j/1sFpGi//vqrC5Cxep7626pn1u91URDVQVXQwVDPIbrHQaFh2bJlkds6+MiTJ0+gbWpHrw/S6KCo565eLlmzZo3bUQdNB2jXXXed+zBITPdpWdOmTQNt88cffzzmRf/joPcL+gBXCF24cKHrwVNPWu3atd23CbEKTXo8BSV9GxV90f1nnHGGu66D9li9X9RbqgNh/5sv9UrreWsfHLS8efNG2tHfWd8SRXvppZfcwXpQ1BMbvV9PTPsprRMkfW598cUXkdvqUFJI0/tDQTEWn2fR/8+qVat67777boLlCkv67An6f6n9jf+Zrf1f9Oe4PruD/tv6n93R+9ndu3e7tv19k74FrFixYqBtZpYDuLg0yH+S6YO3Qop6IpLzww8/BP6H19f1K1as+M/9Xbp0cR9I+joyFsFbAdCnHUR0T6JCUywCjHrP9OGucgyFe+0wYh28/Z4r/W/VZrRYPM9bbrnFu+OOO9x1HbH36dMnwXKVYVSrVi1mHzzRFIz79evndlpBv4YUhlSiJCoJ0OOr7MI3depUF5qCpB59fbCqXfVo6StAlSn5pk+f7nq3gqaDjMSvnWj6wI3FwVRyHwLRX6MHSe+R6K+OFZSuueYa13OnnuFYhKZ77rnHPX7ifWAsD8qj3y8KKYl7sfTtUdBhX1TmpoMm/6Dcv+7TPjnIg1V1AsydOzfZ5QrIWidIeh8kLt/buXOnC24qY9SyWARvfz+vb/yig6m/nw/6/anSDr+DRQem2oboAw51NGmdoOlbmej3hTod9Pf0Syr1OZ4zZ85A28wsB3BXXHGFC/eJP0tj3UGY6acTrFWrlhsskZy4uLjAp8DTwEYNGktq4Np1113nBkwErVy5cm5gmk8Db6IHu2ggoAalBC1fvnw2btw46927txskp8GVsda4cWOrWbOm7dy501atWpVg2R9//BH44MpnnnnGZs+ebZdddpmVLl3ahgwZ4gY93n333e6+/v37uwGlYdD/VO1poJEGHQbp5ptvdgN+77rrLjeIqGfPnm6AowaSvvrqq9apUyc3wChITz75pBt8fM0117j/qwYCRw901vtTgzuDVrBgQVu7dm2yy7VM6wRJA61Hjx7t/neJL7///rtNmTLFgrZjxw43MDh61qGPPvrI7S8aNmxomzdvDrxNvV769u3rXkPa54VFrxXZtm2bnXXWWQmWafDuhg0bAm9T7//33nvPXT///PNt7ty5CZZ/8cUXdsYZZwTWXps2bezWW2+1yZMnu/2fT9d13+233+4GmAe9z9HA/Wga7Dxz5kw3iUDQ+wTf448/7gbxa6Bh4v/dv//+a3nz5g20PX1+denSxcaPH+/+xk2bNnWfa5qkQJ8zPXr0sPr161vQ9Jh6v2iigEOHDtmjjz7qBlZqfyFbtmxJ8B4OgvYD0a+fxHbt2uXWCdKWLVvcZAS+0047zT7//HPXlgbz792714I2bdo097lSu3btmOxfk+Vlcupd9nvxkqKvdY7Vg5Aa6gFVzWFy9FVo0F+paKDflClTkl2uOjm/1zZW9JWuvl3Q3zRWNBAv+qIe0WgPP/ywGyQXtG3btrm6TX2FrR51DWRVr7MGUulr/KCpZ/mff/7xwqQSpaeeesq7+uqr3WtYX7eq1lGlO+pFu+2222L2v923b1/gg6WORfWFGgcxdOhQ10up3hZddF33aaCuvlkIknp2NIA1OSphCnq/oG9iPvjgg//cf+jQIVdXql6oWHzVKn/++afrEVWvkwYHx7rH+6qrrnJ11fq/Jq6rnj9/fuCldqJefb039K2f/rfqJdQ3ZHof6T71VI4ZMyaw9tQzqJIZ7X/0f9O+SBdd1336bNE6QerWrVuyZQfq+VaJTdCvIY21iB60r9KEaPpba50g6f2vcVD6H6qsT2MGVG8dPdA9+lvloKhHW9/q6f2hb4xVW+4P5he9foKuZ7/33nvd55fG7USX2+m67tPnj557kCpWrOi+NU1M+319e1K9evWY7YtU2aDP7rvvvtuNE4h1j3emD94AkBTV45YoUSLyweqXe+i+Z555JvD29IGmes3k6OvtsWPHBtpmz549k61VV/jWQMCgw340HbzpIM6foSFWH3Y6KIy+qF4+mmaGUJiKBYUxHeyrxNAvHVKAUp3s5MmTY9KmApJKs1T7rIuuJzVeIQh6XSYu9UgcvoPuvDqRsKqOnrDaUlma3i+xojA4Y8YMd8AYPUtOrGSWA7hoKuFRGZwOoGK5LxK3Rw2vfx0AMhaVekTPh+zP134qOHz4sPsKNz4+Ptnlf/31V4KvgGNB5X6ao1ilTEF/bX4i9DW+TsSUK1eumLWhj1qV7mjOZ32Nnj179pi1BQRB5SZ6b0bv/1Sem9z+4mRs27bNlQyde+65SS5XyYnOmaHyrVj69NNPXQmYyoiKFi0akzYyfY03AByLgrZOPqKLH7p1Yq2OHTuGuh2xaFMnOzrWh6hO1jFgwACLNX2Y33///S50p8XfduvWrXbvvffGvMa8WLFibiyNH7pj8VxVV62DmBUrVvxnmU7O9tZbbwXaHm3Gts20ald1+x9++GHkxHMao6CT0XXv3t2dzCdohQoVcvX6Y8aMcXXzop+dO3d275GFCxfGJHTreUa3ec4557i/d69evWLyPJ2Y9aUDwCkqFnNq02bmajMW7SZ1cra//vorsjwWM0OkxQnhMkubmeWEe5mpTeGU8QCQxNeNx6JZRmiTNtNbu4888og7Xbpmzdq+fbvrndSsGJpNJVanbE+qzXr16tFmBm534MCBbpYWzSo1YcIEa9eunet5fuqpp9xylWFopq5GjRrRZmoEHuUBIINLixMr0Oap1WZatJsWJ2ejzdi1mZlOuBefSdoUarwBIBHVNWo+aw2ES+qiQT60SZvprV3VpqpuP7qufOTIkW4efNXHrl69OtD2aDO2baZlu/6896q71qDjAgUKJJinXecAoM3UIXgDQDo4sRZtnlptpkW7aXFyNtqMXZuZ6YR75TJJm0LwBoBEVPd38cUXJ7tcZzrUlFO0SZvpqV2dJdI/U2ZSQU2zUwR9gEGbsWszrdpVnXP0WaZVYx7d664zPgZd99w5k7QpzOMNAAAAhIAebwAAACAEBG8AAAAgBARvAAAAIAQEbwBATK1du9bN4LFkyZK03hQASFMEbwBAio0dO9YKFix4QuuWLl3a/v77bzdrAABkZpwyHgAQMwcPHrQcOXJY8eLF03pTACDN0eMNAGmgQYMGdt9991nPnj2tcOHCLpj279//hH53+/btds8991ixYsXc2dbUkzxlypTI8g8//NDOPfdcy5kzpztJxJAhQxL8vso+Pv744wT3qfdavdjRpSE662LDhg0tT548Vr16dXeCCZk7d67dfvvt7qxuWk8Xf9vV3hNPPGEdOnSw+Ph4u/vuu5MsNVm2bJldeeWVli9fPvc82rdvb//8809k+QcffGDVqlWz3LlzW5EiRaxJkya2Z8+eVP2tASC9IHgDQBoZN26c5c2b17777jt79tlnbeDAgTZr1qxj/o5ONa7A+s0339g777xjK1assMGDB1vWrFndcp0p8cYbb7S2bdva0qVLXSB+/PHHI6E6JR577DF7+OGHXWA+55xz3Mk6Dh8+7E4KM2zYMBesVUKii9bzPf/88y6o//DDD67tpA4cdGKK888/352Vb/r06bZp0ya33aLHU1sdO3a0n3/+2QX9li1bxuQEJQAQJkpNACCNnHfeedavXz93/eyzz3Znops9e7Zdfvnlyf7O559/bgsWLHCBVGFYzjzzzMjyoUOHWuPGjSOBV+sonD/33HN22223pWj7FKabN2/urg8YMMD1ov/666/uNNYFChRwvdhJlZAoVD/00EOR2+rxjqbnqdD99NNPR+578803XS346tWrbffu3S7gK2yXLVvWLVfvNwBkdPR4A0AaBu9oJUqUsM2bNx/zd9T7XKpUqUjoTkyBvF69egnu0+1ffvklwemRU7p92jY53vZJ7dq1j7n8xx9/dKdKV5mJf1GYl99++831luvgQWH7hhtusNGjR9u2bdtStO0AkB4RvAEgjWTPnj3BbfUgq5TkWFTzfLLUTuKyjUOHDh1z+/Q7crztE5XPHIt6tK+55hp3EBF90cHBpZde6spmVHIzbdo0q1Klir300ktWsWJFW7NmTQqeJQCkPwRvAMhA1Av9559/upKMpFSuXNnVf0fTbfWQ+3Xgp59+uquj9inw7t27N0XboZlKUtqD7qtZs6YtX77cDcSsUKFCgosf2hX01VOvEhfViqu9yZMnp6o9AEgvCN4AkIFcdtllrle4VatWrldYvcDqGdYARVFtterENbOIwrkGcKqmOnrwo2qwdZ8CrQY3durU6T+978ej0Kyea7Wl2UhSEty7dOliW7dudQMoFy5c6MpLZsyY4WZKUZjXYFPVf2vb1q1b52ZX2bJlizuoAICMjOANABmMpgusU6eOC64qxdCUhH7vs3qTJ02aZBMmTHDTDPbt29fNlhI9sFLTC2og4yWXXGLt2rVzoVxTBqaEZjZRYG/Tpo3rQdesLCeqZMmSrhde29y0aVNXy929e3c3pWGWLFncbClfffWVXXXVVa6nvk+fPm6bNZsLAGRkcR7zMwEAAAAxR483AAAAEAKCNwCkI+PHj08wzV70RfNoAwAyLkpNACAd2bVrlzuLY1I0ANI/oQwAIOMheAMAAAAhoNQEAAAACAHBGwAAAAgBwRsAAAAIAcEbAAAACAHBGwAAAAgBwRsAAAAIAcEbAAAACAHBGwAAALDY+39ZNZnXY0nhIgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100))\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.00097s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "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(figsize=(6 * 72 / 100, 4 * 72 / 100)));" ] }, { "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.00103s] ()\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.00095s] ('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_altnames2703717187412736.356992
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_altnames 27037 171874 1 273 6.356992" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100))\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.00102s] ()\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
glottologlanguage216129
dialect2654
family2626
\n", "
" ], "text/plain": [ " n_sources\n", "provider level \n", "glottolog language 216129\n", " dialect 2654\n", " family 2626" ] }, "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.00106s] ()\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.00107s] ('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_sources27037221409015668.189111
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_sources 27037 221409 0 1566 8.189111" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100)))\n", "(_.drop(0).plot.area(figsize=(8 * 72 / 100, 3 * 72 / 100), 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.00101s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100)))\n", "(_.drop(0)[list(treedb.LEVEL)].plot.area(figsize=(8 * 72 / 100, 3 * 72 / 100), 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.00107s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAucAAAGICAYAAADiTU7aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAipdJREFUeJztnQncVGP//69USChalIo81tBiSfadkH0rS3ayRx5LpJItSYoQT5YiJB5rsmWXtZBC1h55omxJkqL5v97X77nmf+5zzz1zzsyZOWfu+bxfr3ndc5+Z+9xnzlzL9/pe3+/nWyeVSqWMEEIIIYQQInZWiPsChBBCCCGEEP+HjHMhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIRKCjHMhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIRJCPVOhLF++3MydO9esttpqpk6dOnFfjhBCCCGEqKVQVui3334za6+9tllhhey+8Yo1zjHM27RpE/dlCCGEEEKICmHOnDmmdevWWd9TscY5HnN3k1ZfffW4L0cIIYQQQtRSFi5caJ3Czv7MRsUa5y6UBcNcxrkQQgghhCg2QUKplRAqhBBCCCFEQpBxLoQQQgghREKQcS6EEEIIIURCqNiYcyGEEEKI2sTff/9tli1bFvdlVCT169c3devWjeRcMs6FEEIIIcpcQ/v77783CxYsiPtSKprGjRubFi1aFFw/R8a5j7aXTMz5ntmDu5XkWoQQQgghcuEM8+bNm5tVVllFxRVjWBwtXrzYzJ8/3/7esmXLgs4n41wIIYQQooxDWZxh3qRJk7gvp2Jp0KCB/YmBzndRSIiLEkKFEEIIIcoUF2OOx1zEi/sOCo37l3EuhBBCCFHmKJSl9nwHMs6FEEIIIYRICDLOhRBCCCGESAhKCBVCCCGEqFAFuqioBCW7E044wSbfPvbYY0X9P/KcCyGEEEIIkRBknAshhBBCCJEQZJwLIYQQQoiSs+uuu5pzzz3XXHTRRWbNNde01TUHDhyY8+9mz55tlVE++OCD9DHCTTj28ssv299/+eUXc8wxx5hmzZpZDfINN9zQ3H333en3z5kzxxx55JG2qif/+6CDDrLn9erH9+nTx76OfjzXSLGhUiDjXAghhBBCxMKYMWNMw4YNzdtvv22GDBliBg0aZJ5//vmCz3v55Zebjz/+2EyaNMl88skn5rbbbjNNmzZN65B37drVrLbaaua1114zb7zxhll11VXNPvvsY5YuXWrfc8MNN5h77rnH3HXXXeb11183P//8s3n00UdNKVBCqBBCCCGEiIUOHTqYAQMG2Od4t0eOHGkmT55s9tprr4LO+80335gtttjCbL311vb3tm3bpl8bP368Wb58uRk9enRamxyvOl5yPO977723GT58uOnbt6859NBD7eujRo0yzz77rCkFMs6FEEIIIURsxrmXli1bmvnz5xd83jPOOMMcdthhZtq0adbYPvjgg832229vX/vwww/NF198YT3nXpYsWWK+/PJL8+uvv5rvvvvOdOnSJf1avXr1rKFfitAWGedCCCGEECIW6tevX+X3OnXqWK92NlZY4f+isr2GMqEqXvbdd1/zn//8xzz99NM2TGaPPfYwZ511lhk6dKhZtGiR2Wqrrcy4ceOqnZsY9bhRzLkQQgghhCgbmv3PgMa77fAmh3rfd/zxx5v77rvPhqnccccd9viWW25pPv/8c9O8eXOzwQYbVHk0atTIPvDgEwfv+Ouvv8zUqVNL8vlknAshhBBCiLKhQYMGZttttzWDBw+2yZ6vvPKK6devX5X39O/f3zz++OM2fGXmzJnmqaeeMu3atbOvoeJCcigKLSSEfv311zbWHOWYb7/91r6nd+/e9vwUHPr000/NmWeeaRVhSoHCWoQQQgghaiG1uWrnXXfdZU4++WQbnrLxxhtbpRdiyx0rrriiTehEHhFjfqeddjIPPvigfW2VVVYxr776qrn44ottwudvv/1mWrVqZUNfVl99dfueCy64wHrm8bwTRnPSSSeZQw45xMajF5s6qVKJNiaMhQsX2m0LbrL7IoKWuq3NjV0IIYQQ5QNJjHh+11tvPbPyyivHfTkVzZIs30VNdmcmFNYihBBCCCFEQpBxLoQQQgghEsO4ceNsUaBMj80228zUdhRzLoQQQgghEsOBBx5YRWM8m/RibUTGuRBCCCGESAyrrbZatQJBlYTCWoQQQgghypwK1feold+BjHMhhBBCiDLFhXksXrw47kupeBb/7zsoNPRGYS1CCCGEEGVK3bp1TePGjc38+fPTGt516tSJ+7IqzmO+ePFi+x3wXfCdFIKMcyGEEEKIMqZFixb2pzPQRTxgmLvvohBknAshhBBClDF4ylu2bGmaN29uli1bFvflVCT169cv2GPukHEuhBBCCFELwDiMykAU8aGEUCGEEEIIIRKCjHMhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIRKCjHMhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIRKCjHMhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIRKCjHMhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIWqDcT548GBTp04dc95556WPLVmyxJx11lmmSZMmZtVVVzWHHXaYmTdvXpW/++abb0y3bt3MKqusYpo3b24uvPBC89dff1V5z8svv2y23HJLs9JKK5kNNtjA3HPPPdX+/y233GLatm1rVl55ZdOlSxfzzjvvFPJxhBBCCCGEKE/j/N133zW333676dChQ5Xj559/vnnyySfNhAkTzCuvvGLmzp1rDj300PTrf//9tzXMly5daqZMmWLGjBljDe/+/fun3/P111/b9+y2227mgw8+sMb/KaecYp599tn0e8aPH2/69OljBgwYYKZNm2Y6duxounbtaubPn5/vRxJCCCGEECJW6qRSqVTYP1q0aJH1at96663mqquuMp06dTLDhw83v/76q2nWrJm5//77zeGHH27f++mnn5p27dqZN99802y77bZm0qRJZv/997dG+1prrWXfM2rUKHPxxRebH374way44or2+cSJE82MGTPS/7NHjx5mwYIF5plnnrG/4ynv3LmzGTlypP19+fLlpk2bNuacc84xl1xySbVr/vPPP+3DsXDhQvt+rnn11VdPH297ycScn3/24G5hb5kQQgghhKhQFi5caBo1alTN7ozMc07YCp7tPffcs8rxqVOnmmXLllU5vskmm5h11lnHGufAz/bt26cNc8DjzUXPnDkz/R7/uXmPOwded/6X9z0rrLCC/d29x8+1115rb4p7YJgLIYQQQgiRJEIb5w8++KANI8HY9fP9999bz3fjxo2rHMcQ5zX3Hq9h7l53r2V7Dwb8H3/8YX788UcbHpPpPe4cfvr27WtXK+4xZ86csB9dCCGEEEKIolIvzJsxaHv37m2ef/55m4RZTpBYykMIIYQQQoha4TknlISES+LN69WrZx8kfd500032OZ5rQk6IDfeCWkuLFi3sc3761Vvc77neQ4xOgwYNTNOmTU3dunUzvsedQwghhBBCiFptnO+xxx7mo48+sgoq7rH11lubY445Jv28fv36ZvLkyem/mTVrlpVO3G677ezv/OQcXlUVPPEY3ptuumn6Pd5zuPe4cxA6s9VWW1V5Dwmh/O7eI4QQQgghRK0Oa1lttdXM5ptvXuVYw4YNraa5O37yySdbicM111zTGtyop2Awo9QCe++9tzXCe/bsaYYMGWJjxPv162eTTF3Yyemnn25VWC666CJz0kknmRdffNE89NBDVsHFwf84/vjj7YJgm222sWoxv//+uznxxBOjuC9CCCGEEEIk2zgPwo033miVUyg+hHQhKitILjoIR3nqqafMGWecYY12jHuM7EGDBqXfs95661lDHM30ESNGmNatW5vRo0fbczm6d+9upRfRR8fAR84RmUV/kqgQQgghhBC1Wue8NutNSudcCCGEEEKUlc65EEIIIYQQInpknAshhBBCCJEQZJwLIYQQQgiREGScCyGEEEIIkRBknAshhBBCCJEQZJwLIYQQQgiREGScCyGEEEIIkRBknAshhBBCCJEQZJwLIYQQQgiREGScCyGEEEIIkRBknAshhBBCCJEQZJwLIYQQQgiREGScCyGEEEIIkRBknAshhBBCCJEQZJwLIYQQQgiREGScCyGEEEIIkRBknAshhBBCCJEQZJwLIYQQQgiREOrFfQG1lbaXTMz5ntmDu5XkWoQQQgghRHkgz7kQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEAlBxrkQQgghhBAJQca5EEIIIYQQCUHGuRBCCCGEEOVonF977bWmc+fOZrXVVjPNmzc3Bx98sJk1a1aV9yxZssScddZZpkmTJmbVVVc1hx12mJk3b16V93zzzTemW7duZpVVVrHnufDCC81ff/1V5T0vv/yy2XLLLc1KK61kNthgA3PPPfdUu55bbrnFtG3b1qy88sqmS5cu5p133gn36YUQQgghhChX4/yVV16xhvdbb71lnn/+ebNs2TKz9957m99//z39nvPPP988+eSTZsKECfb9c+fONYceemj69b///tsa5kuXLjVTpkwxY8aMsYZ3//790+/5+uuv7Xt2220388EHH5jzzjvPnHLKKebZZ59Nv2f8+PGmT58+ZsCAAWbatGmmY8eOpmvXrmb+/PmF3xUhhBBCCCFioE4qlUrl+8c//PCD9XxjhO+8887m119/Nc2aNTP333+/Ofzww+17Pv30U9OuXTvz5ptvmm233dZMmjTJ7L///tZoX2uttex7Ro0aZS6++GJ7vhVXXNE+nzhxopkxY0b6f/Xo0cMsWLDAPPPMM/Z3POV48UeOHGl/X758uWnTpo0555xzzCWXXJLz2hcuXGgaNWpkr3n11VdPH297ycScfzt7cLec74nqPEIIIYQQorypye6MPOacfwBrrrmm/Tl16lTrTd9zzz3T79lkk03MOuusY41z4Gf79u3Thjng8eaiZ86cmX6P9xzuPe4ceN35X973rLDCCvZ39x4/f/75p/0f3ocQQgghhBBJIm/jHE814SY77LCD2Xzzze2x77//3nq+GzduXOW9GOK85t7jNczd6+61bO/BoP7jjz/Mjz/+aMNjMr3HnSNTvDwrFvfAyy6EEEIIIUStMM6JPSfs5MEHHzTlQN++fa2n3z3mzJkT9yUJIYQQQghRhXomD84++2zz1FNPmVdffdW0bt06fbxFixY25ITYcK/3HLUWXnPv8auqODUX73v8Ci/8ToxOgwYNTN26de0j03vcOfyg+sJDCCGEEEKIWuE5J3cUw/zRRx81L774ollvvfWqvL7VVluZ+vXrm8mTJ6ePIbWIdOJ2221nf+fnRx99VEVVBeUXDO9NN900/R7vOdx73DkIneF/ed9DmA2/u/cIIYQQQghRqz3nhLKgxPL4449brXMX300MNx5tfp588slW4pAkUQxu1FMwmFFqAaQXMcJ79uxphgwZYs/Rr18/e27n2T799NOtCstFF11kTjrpJLsQeOihh6yCi4P/cfzxx5utt97abLPNNmb48OFW0vHEE0+M9g4JIYQQQgiRROP8tttusz933XXXKsfvvvtuc8IJJ9jnN954o1VOofgQCimorNx6663p9xKOQkjMGWecYY32hg0bWiN70KBB6ffgkccQRzN9xIgRNnRm9OjR9lyO7t27W+lF9NEx8Dt16mRlFv1JokIIIYQQQlSEznk5I51zIYQQQghRq3TOhRBCCCGEENEh41wIIYQQQoiEIONcCCGEEEKIhCDjXAghhBBCiHIuQiRKhxJLhRBCCCEqBxnnFYKMfCGEEEKI5KOwFiGEEEIIIRKCjHMhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIRKCjHMhhBBCCCESgtRaRCik+iKEEEIIUTzkORdCCCGEECIhyDgXQgghhBAiIcg4F0IIIYQQIiHIOBdCCCGEECIhyDgXQgghhBAiIcg4F0IIIYQQIiHIOBdCCCGEECIhyDgXQgghhBAiIcg4F0IIIYQQIiHIOBdCCCGEECIhyDgXQgghhBAiIcg4F0IIIYQQIiHIOBdCCCGEECIhyDgXQgghhBAiIcg4F0IIIYQQIiHIOBdCCCGEECIhyDgXQgghhBAiIcg4F0IIIYQQIiHIOBdCCCGEECIhyDgXQgghhBAiIdSL+wJEZdL2komB3jd7cLeiX4sQQgghRFKQ51wIIYQQQoiEIONcCCGEEEKIhKCwFlERITIKjxFCCCFEOSDjXIj/ISNfCCGEEHGjsBYhhBBCCCESgoxzIYQQQgghEoKMcyGEEEIIIRKCjHMhhBBCCCESghJChYgYJZYKIYQQIl/kORdCCCGEECIhyDgXQgghhBAiIcg4F0IIIYQQIiEo5lyIhKLYdSGEEKLyKHvj/JZbbjHXX3+9+f77703Hjh3NzTffbLbZZpu4L0uIxCAjXwghhCgfyto4Hz9+vOnTp48ZNWqU6dKlixk+fLjp2rWrmTVrlmnevHnclydErUJGvhBCCFF8yto4HzZsmDn11FPNiSeeaH/HSJ84caK56667zCWXXBL35QkhMiAjXwghhKiFxvnSpUvN1KlTTd++fdPHVlhhBbPnnnuaN998s9r7//zzT/tw/Prrr/bnwoULq7xv+Z+Lc/5v/99kQucp/DxJvCadJznn2XzAsznfM+OKrok6TxKvqZTnEUKISmXh/+a1VCqV8711UkHelUDmzp1rWrVqZaZMmWK222679PGLLrrIvPLKK+btt9+u8v6BAweaK664IoYrFUIIIYQQwpg5c+aY1q1b107PeVjwsBOf7li+fLn5+eefTZMmTUydOnWyrnTatGljb+bqq6+e9//XeXSe2nSeJF6TzqPzqE3rPDpPsq+pks+TSqXMb7/9ZtZee+2c5ytb47xp06ambt26Zt68eVWO83uLFi2qvX+llVayDy+NGzcO/P+42YV2Ep1H56lt50niNek8Ok9SzqXz6DxJOE8Sr6lSz9OoUaPaXYRoxRVXNFtttZWZPHlyFW84v3vDXIQQQgghhCgXytZzDoSpHH/88Wbrrbe22uZIKf7+++9p9RYhhBBCCCHKibI2zrt3725++OEH079/f1uEqFOnTuaZZ54xa621VmT/g1CYAQMGVAuJ0Xl0nko+TxKvSefReQoladek8+g8hZK0a9J5glG2ai1CCCGEEELUNso25lwIIYQQQojahoxzIYQQQgghEoKMcyGEEEIIIRKCjHMhhBBCCCESgozzWg5yk8hLwquvvmr++uuvuC9JCCGEEELUgIzzIoFBjDE8fvx4M2HCBDN16lRburXU3HzzzWbRokX2+W677WZ+/vnnkl9DuUD53UwPyu0uXbo07ssTQhQBHBYvvPCCuf32221fh7lz56bHzXKFCtrz58+vdvynn36yr+UDc5gE3qrz5Zdfmn79+pmjjjoqfc8nTZpkZs6cGUt7Hjt2bLXq6WFYtmyZ2WOPPcznn38e6bWJCtE5TyJUKb3kkkvMLbfcYpYsWWKPucFsnXXWscbyAQcckPM8f/75p1lhhRVM/fr1053/rrvuMt98841Zd911zcknn2zWW2+9nOdp27atuemmm8zee+9tr+PNN980a6yxRsb37rzzzjnPR4f/5z//aSuxMgj5B+q///7bhOHbb781TzzxhP1cfgN42LBhppQ0btzY1KlTp8bXW7dubU444QSrZcp3k41ffvnF3HnnneaTTz6xv7dr186cdNJJZs011wx0LT/++KP9vvm+0PCHFi1amO23395eQ7NmzUzSWLx4sVlllVVK9v9oa/fcc0+6LdL3vLz44oum1BTSP7bYYous7c/LtGnTAr2P/3fjjTeahx56KGMfK6fFOruAV155pWnYsKF9no1VV13VbLbZZubwww/Paoj+5z//Mfvss4+9N4y5e+21l1lttdXMddddZ38fNWpU2bbFmoxoPhcVtsPAWEY7csbahhtuaM477zxzyimnhDrPggULzDvvvJPxHh133HGmlDAvZoI+uPLKK5sNNtjAzom5FjKvvPKK2Xfffc0OO+xgHXJXX321ad68ufnwww/tfXv44YcDX9Ovv/5q25J/nqCf1qtXL1B5ed53+umnp+eefMDumD59uomCqG2GBQsW2HuKTXThhRfae8V4SH2bVq1amVJTLBtGxnnEg8ill15qnnrqKesxp4MzmXTr1s0ceOCB5v777zdHHHGE/SIxlrPRtWtXc/bZZ9vJ5Y033rCr2I033tgaeU8//bQdKPH2bLfddlnPc/3119uOeu2119pB55BDDsn4Pl4L0kkwDGmEl19+uWnZsmVgYyITdFbuyz/+8Q/z6aefms0339zMnj3bdt4tt9wy9Pk+/vjjjB2E/xEEJtfLLrvMfkYqzgJtYMyYMdYrQsGroUOH2iIDfM81wQDN/2QgpXotsCijLTz55JM5F0Hvvvuu/f4xdPfcc0+z0UYbpQc5JpTBgwebZ599Nn3uXDBIv/XWW7atbLLJJvZejxgxwk7Sxx57rNl9991NUGiHeGX8gyD3iXN99tlnJZuoe/fubb8z+hdtp5C2GNUEUkj/OPjgg03UXHHFFWb06NHmggsusG2Y9k0fe+yxx2zxtjAMHDjQ/o1/YYpBwRjzwAMPBN5VpA3XZMh+9dVXGf/u/ffftx499zwbtG3aOGMl/TdbG6IfYUg1adIkfZxx8tRTTw30eaJui4WOZ87o5Br47lmoeNsx4xPjQFD4zjEyzjnnnPR8g9Pg/PPPt9c3aNCgQOdh7DvmmGPsjgRjo/ce8Txbn+cznXbaaXZOrcmodpx77rmBroc5lDEdp4JzWOFUYdzlntE2mZteeukl06ZNmxrPgzPuqquusgtGFnYOxtWRI0eaMPTo0cM6784888wqx1lcYzfQnoPA/PXBBx9YR16+MJ6zuKCvFkKUNsP06dPtnNioUSM7jtFHMc7//e9/2//B3FTKhWLUNkwVKEIkqvLEE0+kVltttVSdOnVSjRo1SjVu3Dj9WGONNbL+bcuWLVOvvvpq+vdvv/02teqqq6aWLFlifx80aFBqu+22y3kNq6++euqzzz6zz3fZZZfU+eefX+X1fv36pXbYYYfAn+m3336zn4dzLliwIOMjCHyW999/PxUFnTt3TvXv3z993i+//NJe54EHHpi69dZbA5+Hv+vQoYP9fCussIL96Z7zCMruu++eGj9+fLXjHOM1GDt2bGrjjTfOep7NN988deqpp6b++uuv9DGen3baafa1XHTp0sW+d/ny5dVe4xivbbvttoE+06RJk1Irrrhias0110ytvPLK9vdmzZql9txzT/uZ6tatm5o8eXIqKPvtt58914MPPmh///vvv1MDBgxI1a9fP9W7d++S9DFHkyZNUhMnTkxFwT777JPadNNNbbt79NFHU4899liVR1Ci7B9R8I9//CP11FNPpa/tiy++sM9HjBiROuqoo0Kdq3Xr1nbsor85XnrppVSbNm1sXw5Kjx497Dh50UUXpW688cbU8OHDqzyi4t1337XjaDZoy59++mmVMQi+/vrrVIMGDQL/ryjbYqHjWdu2be2Dv+G7cb/z2GijjVJ777136q233gp8PU2bNk3df//91Y5zjM8dlA033NCOEb///nsqLFz7jz/+mH5e02O99dYLfE6uf9ddd033Cfj888/tuMj4NmfOHDvHHnbYYVnP07Bhw9RXX32VsQ2ttNJKoT4nY9/HH39c7fgnn3xi22pQmLPo+zfffHNqypQpqQ8//LDKIwhnn3227T9bbbWVnXOwQbyPOMbEPfbYI3XhhRdWu9dvvPFGat111y3p/BOlDZMJGecRDyJ84d7JC+OlXr16qe+++87+PnPmzNQqq6yS8zx0eDokrLXWWqkPPvigyusMKDSGMLz88supZcuWpQqhXbt2qWnTpqWiwGss0ClmzJhhn/NZw3S0/fffP3XQQQelfvjhB3tOBrfXXnsttc0221RZKOUC49UtiLxwzE3UDMK5Jm3O4yZ8LxzjtSDX4b77TPBakPMAxtRll11mnz/wwAN24Ln00kvTr19yySWpvfbaKxWGkSNH2jaMccf511577dSzzz5bsj7mwMCbNWtWKgqimkCi7B9RwPf0n//8xz5v0aJFaurUqfY5Y1Quw9XPzz//nDriiCPsGHfHHXek/vnPf9pFGe0pzLjCZPj666+nCsFvKLhHnz597PXcfffdqfnz5+dcWDHuMCb7J3vGj+bNm8fSFqMazzA8f/nll4Kvh+8r07jI5+W1MG3ROzfGDcZrpj5P/3VGPkYf/SYbrVq1su/zt6F///vf9n+EgXs0ffr0asc5Fmax6BZ03odb6AV1WNF+anrstttusYyJq6++etpm8N7r2bNnh1oIRTH/RGnDZELGecSDyPbbb5+66qqr0r9jEPGlOT766KNAKzNW70OGDEmfc8yYMVVef/jhh1PrrLNOzvP8+uuv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U6fGfXmJ4LfffkudcsopqRVXXDG1wgor2AfPTz311NSiRYvse95//337KCW33HJLaqWVVrLf1+eff56Kk6FDh6bOPPPM1PLly2O9DhE/ijmPOCnIu1p1t9Yd8/6uBCEhkkOTJk2s144QC1FcCIkbP368zVHxJpVTIIUCbUkt454Np4tPpUgXooOSDcmOVI1EiUb8HyQS11RJM64cCuRBaXve/h80hyJKDjnkEOu5J0SFnRe/6k/Q4oUoTh177LF2N1tKQeWJwloiJK44tVJDxj2VE5FQJKSFreh7773XqjG42D0hygmMqPvvv79auWsRPcQY+wsQwe+//162W/GE9XkNc+D5RRddZEOlxP8HYzyuJOuacihYWLEodK/H1Q6JucdALxQM+759+5ozzzzThu9gqBPH7jf2RXKRcV7EpKBsRmy58sgjj9jy5mgbM5BROMQl+1xzzTXm6aefjvsShQjtRSMBFN1+ZBQxHPyTWBxetNoKxurEiRNtjLnXEKJACipX5QjeSYqyITXrl510ccAifpLuQENmMgpGjBhh484Zz3A6UCQM6dLDDz/czt1KYE4+CmspgRGLQf7xxx/bLTx0wDFgy9WIJRGUJFA6u3dLGkMdSSp03YUoB5D0CwLGo/SFo4MiM4wVePOQjevVq5cdH5GXRZJwq622MuUG+vgUnKNw1fbbb2+PUT0VvezDDjvManyLZIPnnH7OAsu/yColhEO9/PLL1qmH7jvz7Ny5c+0CMN8QoCVLltj6KqjFUaNAYbVlQNxB77UVEpvGjBljn6+66qrppKdp06al1lprrVS50qBBg9TXX39d7XPxk6QaIYTIxRdffGGTAzt37pxq165d6phjjklNnz49Va6QDE+iqzfZkfHwvPPOSy1ZsiTuyxMZOOKII1I333yzfb548eLUhhtumKpfv36qXr16qYcffjiWa5o9e3Zqk002Sa2yyiqpunXrpudX2lavXr3yOud3332XuvHGG20Sdp06dVJdunSJ+KpFMVBYS5GgZO7OO+9c7TiyWkhulbPOOYlbVPPze8PwoAshRC5IvCNGu7aABB6hBNdee631eLrPSNE2kUxI0r3sssvsc3Y9CCJgbkbi86qrrrI7HqWGSsSEfbEjTZK6gzh0KqiG2QVg956QFrzwzM3s4pOIraT38kDGeZGorUYsAwQDCEVZ2O5nu+3NN9+0WrVKphNCBIFtdQwipwlOYRp0sMu1GBH63RjnhCC0b9++SpIrsfWVWsQqyZAnhSoKPPPMM9YYZzFFAiXhSHFAnhrhXSz2vGBHUEE1KGuttZYtRNS9e3e7YFRScvlRniNhGVBbjVgKhJA8t8cee5jFixfb3YGVVlrJfi6X4CWEEDVBuXYKv5CfsvHGG9tj1113nWnWrJmNi918881NuYG3dfDgwdWSPym4NHbsWBnnCaRNmzZ2TsZAxzinOif88ssvZuWVV47lmphbM8WDf/vtt6ESiykUyByNvLMoT5QQWiS4raiXsGrFiAVnxF555ZWmHGHQIMkJNQs8DOwMoFmL16uUWrVCiPIFRRYMcQxavHvOIDrhhBOszCKew3KB8AHGej7H559/bj+Xd7xksYFDA+eMSBZUB8WBxtyF9v60adOsMXvzzTdbPfE4lF3wdBP6inIUxvj06dNtm2JXaZ111olMzUUkHxnnRWbp0qW1yojFo8BWdDnLQQoh4qNBgwZWFxwtZi8zZsywZd3xNpdr4Tk/vHbFFVekY5tFsqAdIne51157pedmZD7RG99hhx1Kfj14yLt27WoXfCz2CEfhZ9OmTW2MfKb6AF4ltaD67CxERLJRWEuRIXYMo7y2wJYz1d1knAsh8mGjjTYy8+bNq2acz58/3xaDKSfwrmJI7b777jYBz8Uwu7Efj+zaa68d6zWKzDCPYfz647GJOY+L1q1b22RQQmzwmuPUO/nkk20yJ4vabBx88MFVpBPZGcD2cLUD3nrrLRtSRmEikXzkORehIDaPymOE5qBH3LBhwyqvq1SwECJT+Ic3KZ7KmQMHDjTbbrtt2nAYNGiQjdumkmG58Z///MeOfcSWuyRXFh8kihKmIJK564ExTEGeXXfd1f4st8VhtorHLVu2rBZCO2DAALtToByI5CPjXITCm2Di3UKjGfG7ihsIIXKFf7hpxx3z/l6OYwjhEfvss48N+9tmm23ssXfffdeG6Dz33HNmyy23jPsShQ/UT5AZpPAVD8JH2OXASKdAGQZuHHAd7Miwk0SCqJf+/fsHOgcLQtrkhhtuWO3c7BSgVCOSjYxzEQoGsWyoLLAQIuy4Ue5jyE477WS9rmi3OzlIKj1i4BE+QbywSDYYrlTQHDduXI2qKcWG9nPGGWfYGHPkmL0LWp4HjRXnb9mFIsnaCxV5L774YhtWJpKNjHMhhBCiAIgHfv/996uVff/444+tp9IpdonkwHdCiBXecx7u+yPEhQcKKaWGHAViwjGgCwHDnERkJJ3dTs7bb79tw1mQckZBSCQbJYSK0CB7duedd1YpIHLiiSdWSYYSQggHyW0kkxPewvNsINVabhBv/s0331QzzonvDaNPLUoHiixIYJJsibHK7oeT9oxzbj3iiCMKPg+fh2KHFMa677777LF27dpZKcYjjzwygisVxUaecxEKtmcPOOAAG9PmstynTp1qyx6j6UtRIiGE8IJRTtEhpOBc/HmmqadcY87PPfdcW/F06NChZvvtt7fHqAlBpUkqTw4fPjzuSxQZ1E3wnKOq47zlPFATiguUWZATPf3002O7BpEMZJyLUFCaGmmm2267zdStW9ceYzJlK47iIR999FHclyiESKCaCUVUML55nmtrvxzrWWCIjxo1ysaaQ/369W38MCEGFKATyYSdHJcU+tprr9mcAYx0Ys9LwU033ZR+/vvvv5thw4ZZOUfmWtqQfxEYFBxmDz/8sM15oPghO9vErK+11lqmVatWkX4GET0yzkXo2MoPPvggXXbbMWvWLNOpU6eyKiAihIhn9w3vskucdGDUssAv59034pi//PJL+3z99de3lZRFssEEIt4chRQezz77rD3mFlnFJmjNEBa2GNpBFxx77rmn3eGePXu2nZ8Jc+nXr58Nvxo7dmyBVy2KjWLORSiQBCPW3G+cc6xjx46xXZcQojxApu67776rVu0QeTdeK8ewFgfGOB5PkXzwUJMISmjLb7/9ZucvFoannXaajT8vFV9//XXk5+zTp49VahkyZEiVnAdqCBx99NGR/z8RPTLORU68CVxsq/Xu3dt88cUXVQqI3HLLLXb7VgghsuFqIvj56aefqhU1E6JYPPDAA1a20xnjtalYFBr7t99+e7XjhLOQ+yGSj4xzkRPCVfwJXFT488OKvHv37iW+OiFEOXDooYfan4wlePW8cdh4y3ECuGRKIUphwCYNkoeRPvRLKeIB53onTJgQ6Dz0LW9VXsdnn31mmjVrFtn1iuIh41zEsu0mhKgsnGeSRT5b7eSvOFDMYCcOXWYhSgVJk35ZYBRT4vKik48xcODAasf33Xdfc8MNNwQ+z4EHHmgGDRpkHnroofSCmFhzjH4WACL5KCFUCCFEyaA4CuoRCmERcUJ5+65du9pFoivUg3caUYPnnnvO5lclRXDh008/NVtssUVgwQXyNw4//HD7GYmnX3vttW04CwvgSZMmqe+VATLORV5Q+Y6VOBJi/hW7EEIEgTwVNJ0pCCNEKSHOfIMNNjD/+te/0spBKLSccsopVhUFL3apYZGw//77m/79+1c5jjedOiLUFAkDWvsffvihWbRokV1soOAiygMZ5yIUDFqHHHKI1TP3xqG7BK9yVloQQpS+siaeQmTehCi1lxoJRX9VVxxPFNhDFrPUYICTm0H+1u67726PTZ482SavEm9O4aSg8Hc85s+fb5YvX17ltbvuuivyaxfRskLE5xO1HJRa0GWlwyMbNnPmTOthYDBDlkoIIYIi35CIc2HI7q+fOXPmVJEfLCVU337sscesGhqF/S644ALz7bffmhdeeCGUYU7o2N57722N8x9//NH88ssvVR4i+chzLkLRtGlT8+KLL5oOHTrYpJl33nnHxsdxjIEET4QQQgQBI4htd3nORalBFvjRRx81Q4cOTasEEQZCpVeSJocPH27KlZYtW1qFl549e8Z9KSJPpNYiQkHYivMqYKjPnTvXGueU3KYKmRBCBIUQApLVhCg1GOWEYx533HHpaqD169c3Z5xxRmw1O/Dac02tW7e2v+P8uv/++62KDHrsQSEXTLKk5Y3CWkQoNt98c+vpgi5dutjVOd4GZJvk/RJChKFNmzambt26cV+GqEAwgkeMGGHDPMh74PHzzz+bG2+80SqcxAGx5i+99JJ9jroKCZwY6JdddpmdY4NCUitGvShfFNYickJxEIzyFVZYwTz77LM2UYakUOLiyCynsEGTJk3M+PHj00ksQghR0+4bBhAazJkUnzCQhCg2hK48/PDD1arVzps3z+yxxx5mxowZJb+mNdZYw1bcZjf6pptusnMqzi+kHVE1QpChJvr06ZN+TgLomDFjbPgpD3YEvAwbNqyon0MUjsJaRE7QV/3uu+9M8+bN7Zafq6yGDBX6q0ymDCqZSnILIYQ/WW306NE2R6Vfv37WKzh79mybCOeXkBOiWLAwxMNMESIH8xwOps022yyWa1q2bFm6ci5JoE6aGEUZri0b/nwvKnuDf5Ghebo8kOdc5ASv+NNPP23DWPCe41lQCWAhRD6sv/761ivYrVs3m79COIE7htdQ2/GiFPzwww9m5513ttU38SSTP7XbbruZjh07mgcffNDOdaWGOZZroG+gtkJ/4Hr4SVEhlFtEZSDPuQi0/bfLLrvYDHBW3cgm1hQnmm3bTQghiKVt3769fb7qqqvaaoZAiNzll18e89WJSgEHE+EiO+64o/39qaeesoV6xo0bF4thDtddd50NGb3++uvN8ccfbw1zeOKJJ9JVTEVlIONc5OSOO+6whRGIMUd+6tRTT41NB1YIUd6gRMEW/TrrrGM95q5UOuFybktfiFIlJD///PO2Wuhee+1l7r333ljDPnbddVerS75w4UIbKupAqYW6IqJyUFiLCMWJJ55ot59lnAsh8uGSSy6xBWAuvfRSm/B27LHHmrZt29oY4PPPPz82GTtR+6kpNwqRAxaG3h1hJSaLOJFxLoQQIjbefPNN+9hwww1thUQhigUKJkEhrCQOUJCpSclo2rRpsVyTKD0yzoUQQgghYoZdadSLTjjhBBtOyk71l19+aUO+zjrrLHP11VfHfYmiRMg4F0IIUVRIaAuKk48TImqI5Sakyj3PhntfKUEyccCAAeaoo46yoaMU/KO4HxKjhNmMHDmy5Nck4kHGuRBCiKISVP2CeGCKFAlRDIgpdzU7aJOZ4s8xieJqhyR9fvLJJ2bddde110iyKootn3/+udl2223NTz/9VPJrEvEgtRYhhBBFhYqFQsTNiy++aNZcc037/KWXXjJJo0WLFtZDjnGOmpHTOf/666/tokFUDjLOhRBCCFHroV5HpudJgeqkhIBRlZt4c9SLSBB97733rJyxqBwU1iKEEKLoiW5BoZaCEKVgwYIF5p133jHz58+vtrtz3HHHlfx6uAYe9er9n9+USqVTpkyxSka9evUyK664YsmvScSDjHMhhBBFZb311gv0PmJ9VWVYlIInn3zSHHPMMWbRokU2+dMbf85z6ZyLOJFxLoQQQoiKYqONNjL77befueaaaxJVffOXX34xd955p00MhU033dSGuLhYeVEZyDgXQggRC276ibNkuqhMGjZsaD766CMrVZgUXn31VSsliid/6623tsemTp1qw2/w9O+8885xX6IoEcH0rYQQQoiIGDt2rGnfvr1p0KCBfXTo0MHce++9cV+WqCC6du1qEy2TBIWGjjzySKvO8u9//9s+CPPq0aOHfU1UDvKcCyGEKBnDhg0zl19+uTn77LPNDjvsYI+9/vrr5pZbbjFXXXWVVagQotjFsH744QczaNAgGzLCQrF+/fqxF8NiofrBBx+YjTfeuMrxWbNmmU6dOpk//vij5Nck4kHGuRBCiJImh15xxRXV1DDGjBljBg4caL2GQlRiMSwWqxdeeKE5+OCDqxx/7LHHzODBg63uuagMpHMuhBCiZFChcfvtt692nGO8JkSlFsNCRrR3797miy++sBVBAYOcXSWM8+nTp6ffSyiYqL3Icy6EEKJkbL755uboo482l156aZXjhLSMHz/eJukJUYnk8uzj0cdki8uzL0qHPOdCCCFKBiEt3bt3t8oULub8jTfeMJMnTzYPPfRQ3JcnKgS81BtssEG1olcjR460nuvhw4eX/JoU0iUc8pwLIYQoKcjD3XjjjWkt53bt2pkLLrjAli0XohS0atXKJohutdVWVY5PmzbNJoN+++23sV2bEDLOhRBCCFFRrLzyymbGjBnWe+4FrzmhV0uWLDFxgtY5yi1J0mEXpUNhLUIIIUoK8bKPPvpolSqIBx10kKlXT1OSKA0Y5c8884yV9PQyadKkRBjE8ptWNhoJhRBClIyZM2fasIHvv/8+red83XXXmWbNmtkqiHgthSg2ffr0sYY5eue77767PUbew9ChQ82IESPivjxR4SisRQghRMnYbrvtrCGOrvkaa6xhj/3yyy/mhBNOsIbSlClT4r5EUSHcdttt5uqrrzZz585Na/APGDCgmgZ/KVi2bJnp1auXLdDFdZxxxhnmyiuvNE2bNi35tYj4kXEuhBCipFUQKZu+2WabVTlO/G/nzp1VBVGUBNoZ5s8qq6xiF4Xz5s0zzz//vA2x6tq1ayzX1KhRIxtnjnEuKptg5bKEEEKICNhoo42sIeRn/vz51ZLzhCgW5DiMHTvWPq9fv77Zc889zbBhw2x1TjzqccD/phqoEIo5F0IIUTKuvfZaqy09cODAKlUQBw0aZGPPFy5cWEWxQohigGQicp7w8MMPm7XWWsu8//775pFHHjH9+/e3YSWlZsMNN7T9AN1/JB4bNmxY5XW/JruovSisRQghRCxVEKl0CG4a8v6uKoiimBDO8umnn5p11lnHHHnkkTbMinjzOXPm2ETlxYsXl/yasoWz0B+++uqrkl6PiA95zoUQQpSMl156Ke5LEMKGUBFCcsghh5hnn33WnH/++enwqrh2bFQhVDjkORdCCCFERUEoy9FHH213Z/bYYw/z3HPPpcOuXn31Vat3HhdLly61hvr6668v7f8KRca5EEKIkkPYwDfffGMNES8dOnSI7ZpEZYHW/nfffWc6duyYDrd65513rOd8k002iaVPnHPOOVZmFD777DNbEIljrVq1MpdccknJr0nEg4xzIYQQJQPZuhNPPLFGz6TizEWl0rt3b5sMOnz4cLPPPvuY6dOnW+P88ccftwnUJKyKykBSikIIIUrGeeedZxYsWGDefvttq3lOCXU8hShVPPHEE3FfnhCxQQz8yJEjzY477phOjgaSVb/88stYr02UFgUzCSGEKBkvvvii9QRuvfXWNpRg3XXXNXvttZcNJSDet1u3bnFfohCx7So1b9682vHff/+9irEuaj/ynAshhCgZGBrOAFljjTWsQQLt27e32tNCVCosWCdOnJj+3Rnko0ePNtttt12MVyZKjTznQgghSgYa0rNmzTJt27a1iXi33367fT5q1CjTsmXLuC9PiNi45pprzL777ms+/vhj89dff5kRI0bY51OmTDGvvPJK3JcnSogSQoUQQpSM++67zxoeJ5xwgpk6dapNfPvpp5/MiiuuaGPPu3fvHvclChEbxJYPHjzYfPjhh2bRokVmyy23NBdffLHdWRKVg4xzIYQQsYF8nKvU2LRp07gvRwghYkdhLUIIIYpKnz59Ar932LBhRb0WIZLKwoULMx4n9nyllVayu0uiMpBxLoQQoqgE1WeWIoWoZBo3bpy1D7Ru3dqGgw0YMCBdNEnUTmScCyGEKCovvfRS3JcgROK55557zGWXXWYN8G222SZdsZRcjH79+lllo6FDh1ov+qWXXhr35YoiophzIYQQQoiY2WOPPUyvXr3MkUceWeX4Qw89ZFWNJk+ebO69915z9dVX2zwNUXuRcS6EEEIIETNUzJ0+fbqtluvl888/t7KjJE9//fXXtmIoz0XtRUFLQgghhBAx06ZNG3PnnXdWO84xXgNkRyneJWo3ijkXQgghhIgZ4smPOOIIM2nSJNO5c2d77L333rMhLA8//LD9/d1331UtgApAYS1CCCGEEAmAsJU77rjDVtF1FXWJQ6eKrqgcZJwLIYQQQgiREBTWIoQQQggRAySABqVDhw5FvRaRHOQ5F0IIIYSIAYoJUXgIU8xbgMiZZt5jf//9dyzXKEqP1FqEEEIIIWKKMf/qq6/sz0ceecSst9565tZbbzUffPCBffB8/fXXt6+JykGecyGEEEKImKEq6MCBA81+++1X5fjTTz9tLr/8cjN16tTYrk2UFnnOhRBCCCFi5qOPPrKecz8c+/jjj2O5JhEPMs6FEEIIIWKmXbt25tprrzVLly5NH+M5x3hNVA4KaxFCCCGEiJl33nnHHHDAATYZ1CmzoOZCUuiTTz5pw15EZSDjXAghhBAiAfz+++9m3Lhxtioo4DE/+uijTcOGDeO+NFFCZJwLIYQQQgiREFSESAghhBAiZsaOHZv19eOOO65k1yLiRZ5zIYQQQoiYWWONNar8vmzZMrN48WKz4oormlVWWcX8/PPPsV2bKC1SaxFCCCGEiJlffvmlymPRokVm1qxZZscddzQPPPBA3JcnSog850IIIYQQCeW9994zxx57bDpJVNR+5DkXQgghhEgo9erVM3Pnzo37MkQJUUKoEEIIIUTMPPHEE1V+J7Dhu+++MyNHjjQ77LBDbNclSo/CWoQQQgghYmaFFaoGM1B8qFmzZmb33Xc3N9xwg2nZsmVs1yZKi4xzIYQQQgghEoLCWoQQQgghYqBPnz6B3zts2LCiXotIDjLOhRBCCCFi4P333w/0PkJcROWgsBYhhBBCCCESgqQUhRBCCCGESAgyzoUQQgghhEgIMs6FEEIIIYRICDLOhRBCCCGESAgyzoUQopaz6667mvPOO6/G19u2bWuGDx9eRRnisccey3rOTz/91Gy77bZm5ZVXNp06dTKzZ8+2f/fBBx/Y119++WX7+4IFCyL8JEIIUfuRlKIQQlQ47777rmnYsGGovxkwYID9m1mzZplVV13VNG7c2JYab9q0adGuUwghKgEZ50IIUeFQIjwsX375penWrZtZd91108datGgR8ZUJIUTlobAWIYSoAP766y9z9tlnm0aNGlnv9uWXX25cmQt/WAvgBd93331NgwYNzD/+8Q/z8MMPp18jXGXq1Klm0KBB9vnAgQOrhbVk4vXXXzc77bSTPWebNm3Mueeea37//fcifmohhCg/ZJwLIUQFMGbMGFOvXj3zzjvvmBEjRthS4KNHj67x/Rjvhx12mPnwww/NMcccY3r06GE++eSTtOG+2WabmQsuuMA+/+c//xnI077PPvvYc06fPt2MHz/eGussGIQQQvx/ZJwLIUQFgKf6xhtvNBtvvLE1ts855xz7e00cccQR5pRTTjEbbbSRufLKK83WW29tbr755nT4CoY+seY852curr32Wvt/SUzdcMMNzfbbb29uuukmM3bsWLNkyZJIP6sQQpQzMs6FEKICQFmFsBPHdtttZz7//HPz999/Z3w/r/t/d57zfMADf88991hD3j26du1qli9fbr7++uu8zyuEELUNJYQKIYQoOosWLTK9evWyceZ+1llnnViuSQghkoiMcyGEqADefvvtKr+/9dZbNrykbt26Gd/P68cdd1yV37fYYou8//+WW25pPv74Y7PBBhvkfQ4hhKgEFNYihBAVwDfffGP69OljdckfeOABGz/eu3fvGt8/YcIEc9ddd5nPPvvMapqTSFpI8ubFF19spkyZYs+BogshNY8//rgSQoUQwoc850IIUQHgBf/jjz/MNttsY73lGOannXZaje+/4oorzIMPPmjOPPNM07JlS2vQb7rppnn//w4dOphXXnnFXHbZZVZOERnH9ddf33Tv3j3vcwohRG2kTsoJ3QohhBBCCCFiRWEtQgghhBBCJAQZ50IIIYQQQiQEGedCCCGEEEIkBBnnQgghhBBCJAQZ50IIIYQQQiQEGedCCCGEEEIkBBnnQgghhBBCJAQZ50IIIYQQQiQEGedCCCGEEEIkBBnnQgghhBBCJAQZ50IIIYQQQphk8P8AuGb2eJvzHVYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100)));" ] }, { "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.00101s] ()\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
family8448244
sub130711211531
\n", "
" ], "text/plain": [ " n_classificationrefs \n", "level dialect family language\n", "kind \n", "family 8 448 244\n", "sub 130 7112 11531" ] }, "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.00105s] ()\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.00079s] ('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_crefs27037338831161.253209
\n", "
" ], "text/plain": [ " count sum min max mean\n", "n_crefs 27037 33883 1 16 1.253209" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "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 * 72 / 100, 3 * 72 / 100))\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.592s ago] ('table', 'link')\n", "SELECT count(*) AS n_rows \n", "FROM link\n", "[generated in 0.00042s] ()\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", "34593\n" ] } ], "source": [ "from treedb.models import Link\n", "\n", "print_sql(Link)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "tags": [] }, "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.00067s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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", "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', figsize=(6 * 72 / 100, 4 * 72 / 100)));" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "BEGIN (implicit)\n", "SELECT link.url \n", "FROM link\n", "[generated in 0.00090s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "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C0wIIUTmRFPdRarIkyePK1++vLmlXnvtNTtGYPIdd9xhwsEXRLi+WExw9uzZds3LL7/s/vrrr2RFBQHKv/32m92L8pMmTTKrTalSpew8zxo3blwohud4QIzRAw884Dp37myuuaJFi5rwwt3WunXrVN1rSc/asgIJIUScIPEjUg0CBzeWb+VBOCBqEDe+WOnevbuJGVxdTHVnttctt9xicTJJwbT1Tz75xKasM1MM8YQL7OKLL7bzW7dutRid4w2zwRBZxBlh0brsssssNgkBJoQQInNykkfkqhDiqGCqO7O+EHWy/AghRHx8dyrmRwghhBAJhcSPEEIIIRIKiR8hhBBCJBQSP0IIIYRIKCR+hBBCCJFQSPwIIYQQIqGQ+IljSN9AFvO0hvV82rdvf9zud9ddd9maP6m5P3m7BgwYcNzqIIQQInHRIodCHAfK9pjqsuTIld7VyDCs7Vs3vasghBDJIstPGpJcEk+RMSAdhxBCiMRD4icVkP6gWbNmlhOKzOMk9wy6bHDN9OrVy9155522YiUpHYDM5iVLlrQ0DyT4fPLJJ8MGXlI6XHLJJe7tt9+2/FK5c+d2Dz74oDt8+LDlmipQoIDLly+fe+65546o08aNG12dOnVczpw57d7k0woS67Pfe+89qz8rbjZu3NjamhwTJ060cuT3So5ffvnF3XTTTdYPZGwnIWqs6Sk2b97s6tWrZ20qXrx41Of4kKLimWeecYULF7bM67RpypQpofMkScVNOHr0aEvPccopp9h9Dx065B555BFLr3H22Wdbf7Vs2TLMLSeEECJzIfGTCh599FHLAP7ZZ5+5adOmuW+//dYtXLgwrMyLL75oWcwXLVpkQgMY/N955x23dOlSN3DgQDds2DATTkEQBpMnT7YBm5xWb731lqtbt677888/3cyZM93zzz9v+bLmzZsXdh3PaNCggfvpp59MmCFcli1bFjof67OJHSK5KBvPI+dVUowcOdI1adLEhAPPS4r169dbglJECFnZf/jhB9eqVSsTGrHGBK1bt85Nnz7dxNzrr79ugigatO2ll16y/icjPDnFbr75Zrdq1aqwcl27dnXt2rWzPqIM/Upbhg8fbu+WJdejxVH9+++/Via4CSGEiC8U8xMjWEJGjBhhg3+NGjXsGANmoUKFwspdf/31rmPHjmHHEC0+WFc6derkRo0a5R577LEwywWWH8QKSUKvu+46t2LFCstuniVLFksYykCNIKhSpUrouoYNG7p77rnH/sbqhCh79dVXTTCk5tkIJJ4NJPkke3qkpWnQoEHuiSeecJ9//nkoe3tSUA7LEM/Jnj27HcP6FAsrV640ETh//nxXuXJlO4YQvOiii6Jeh+jBaoP4A7+vCJKmPj5Y6W677bbQPn3VrVs3d+utt4ayx9PnydGnTx/Xs2fPmNoihBAiYyLxEyNkKMdddPnll4eOMcD7Wcx9yAoeCa6WV155xSwse/fuNQtIZCI3hIkvPiB//vwua9asJnyCxyItIFWrVj1in4zrx/JsXHqRz8ECwzGsI74oSQ6ej5vLFz6pAYtMtmzZXKVKlULHSpcubW6p5MD6smHDBnfllVeGHWcfi1hy74eEemSiD75T+pxnIwiTAqGEBTD47CJFiqSylUIIIdITub2OM8QDBZkzZ465h2688UZzKeEOw3oSGQwdKRSIT0nqWHKDclIcy7Mjn1OxYkV3zjnnmHXK87yozyVWJ17eT2rBlYd4DG5CCCHiC4mfGCFYGJGwYMGCMMsBbppozJ492xUrVsxEB1aHCy+80P3+++/HrV5z5849Yt93ER3PZ19wwQXmRvr0009d27Zto5YtX768xUMdzWwqrDxYp4gT8sH9t3PnzmSvQYDgfsQqFYR9XIjJgeUOa1rwnRJkHhnHJYQQInMh8RMjuIWYBdS5c2cTAcxmat26tbmlsJQkB4Ljjz/+sPgXXE+4oMaNG3fc6jV27FizxiDCevToYbEyDz/8cJo8m7gd2v7xxx+HLUrIPREtPjwfdxDxN99//70FHTObDBGTErgRb7jhBnffffdZcDciiJimSGsSM+pwQfnwXojzwc3Hcwhsxv1GcHM0EHLE8SDquI7yO3bsiPpOhRBCxDeK+UkFL7/8srv//vtDU7gJGmZWEtOmk4MZRx06dDBBwEwhZnAxQ4sp5scDgm8RN0yNJ1aHmWK+tSMtno04YQYXU/yJj2GGFRawoLBhyjhlECQERlOOqeeRMTnJQSA5godrscw8++yzoZlzPoi6YDwU09WpB8HmxCbRB8zKQwBGgyDpTZs2mZiinixPwCww/k4NS3rWlgtMCCHihJO8lAI4RLL8/fff7txzzzUBgBVIxD/EOuE2vOOOO2z2XEpg4cJ9hvCS+BFCiNhI7+9OWX5SAQHDy5cvt9lBvDAW1YP69eund9XEUUIM1BdffGFWJqxjTHVfs2aNa9q0aXpXTQghRBoh8ZNKWE8GF8/JJ59sU6IJ7M2bN296V0scJbjOWOOI9Y8wgpYtW9Z9+eWXKa4rJIQQIn6R20uIODbdCiFEPLI7nb87NdtLCCGEEAmFxI8QQgghEgqJHyGEEEIkFBI/QgghhEgoNNtLhJKbsmpzcOXm1HLXXXdZGorx48fbPgshsrghmdXT8rkZgbI9prosOXK5RGFt37rpXQUhhDhqJH7EcWPgwIEpJj0VQggh0huJH3HcYNpiPEBWe9ZpEkIIkZgo5idBwAVFji82RAoLM5IvK2ip+eeff1yrVq0siWvRokXd0KFDw+6xePFid/3111uSUfJ3kQdr7969YW6vW265JewaMrRHe2YkuM3I63XOOefY2g8876efforatljr9dxzz1n2d/KT+VnvccuRm42s97jrSGhKQlQhhBCZF4mfBGLEiBEuW7ZslvkdFxWJWt98883QeXKUIQJI40Gi1AceeCCUsJQ8ZiT8zJMnj1uwYIFlk2clZD+D/NE+M5KGDRtaYtLJkydbRvdLL73U1ahRw23fvj3J8rHW66uvvrK2TJs2zU2YMMEW2KpXr54rV66cW7hwoeXxIslpSpACg2uDmxBCiPhCbq8EokiRIq5///5m3cD6gcWE/TZt2tj5G2+80UQPIAQ4N336dCs7cuRIt3//fvfuu++6U0891cqQBwsB8fzzz1v29aN5ZpBZs2aZSEL85MiRI5ROBIvMRx99ZBadSGKtF+cQXb6764033rA6DRs2zCw/ZIFfv359kvUK0qdPH9ezZ89U9bsQQoiMhSw/CcQVV1xhA75P1apV3apVq9zhw4dtv3z58qFzlCtQoIAJEVi2bJmrUKFCSGDAlVdeaVnQfevQ0TwzCO4t3FW4rnLnzh3aSDT666+/Jnn/WOuFhScY58M52ovw8SFhbUp069bNlmP3t3Xr1qV4jRBCiIyFLD8iRPbs2cP2ES2IiBMFwqdgwYJuxowZR5w788wzj+neQXF0LGCR8q1SQggh4hNZfhKIefPmhe3PnTvXXXjhhS5r1qwpXkuWcywzxNj4fPfdd5YV3Q8gPtZnEt+zadMmixEqUaJE2Eaw9PGsl++CI4bHh5ghIYQQmR9ZfhKIP/74wz366KPuvvvusyDfV1991YKcY6FZs2auR48ermXLlu7pp592W7ZscW3btnUtWrRINt4ntc+sWbOmucWYmfXCCy+4kiVLug0bNriJEye6W2+91YKxiQm68847LYD53HPPPep6NW3a1D3xxBMWR9S1a1erJ/FFEHTTxcqSnrWV1V0IIeIEiZ8EAtGwb98+i23B8tKuXbskg4iTIleuXG7q1Kl2TeXKlW2/QYMGNnvreD0T0TFp0iQTJXfffbcJGeKOrrnmmpCQYTo+8ToHDx48pnohVD7//HOb0cZ0d2KCnnrqKRNFwTggIYQQmY+TPC3JmxDEkmoi0fnggw9MdBHIzJpBscBUd9Yw4hpZfoQQwsXFd6csPyJhYXr8+eefb+4z4oaY3n/HHXfELHyEEELEJxI/ImEhuBpXF/8yy4wFFlkFWgghROZGbi8h4th0K4QQ8cjudP7u1FR3IYQQQiQUEj9CCCGESCgkfoQQQgiRUGQa8XPXXXfZ4njBqd3t27dP02eShoG1aXbu3OnSk7Vr11o9fvzxxzR9Ds8gyag4krI9prrzuk4M24QQQmRMNNvrGNbJqVatmtu4caMFbaUnZE6nHsmlgEhOLCLaUiNmeEaePHmOspZCCCFExkDi5xggSzgrEKc3rJx8IuqREdoqhBBCZCq3FxnEyelEIksyZxctWjS07gpJKK+//npbgO7ss8+2FAlkAY8VElh26tTJFrQjw3eVKlWOyB5OQkwsPKRIwMJRu3Ztt2PHDrOSzJw50w0cONBcP2y4mpJye3388cfu4osvtvqfd955R+Sx4ljv3r1dq1at3GmnnWZtHDp0aNS6T5kyxV111VWW2Zy233TTTe7XX39N1u11+PBh17p1a1e8eHHrL5J4UncfcmCNGDHCffrpp6H20JYDBw64hx9+2Na8IcVDsWLFXJ8+fZJ0e6VUNpJDhw65Rx55JNQGFhQkH1fQVck7oky+fPnsnrTZTzbKZ6Nw4cJu8ODBYfddtGiRJTH9/fffU91vSb0/+tB/v0IIITInGUr8dOvWzfXt29c9+eSTbunSpW7kyJGW04mM3QgRBAmD4dixY92XX35pg2+sUHbOnDlu1KhR7ueff7YF7W644Qa3atWq0KBXo0YNV6ZMGSs3a9YsV69ePRMSCAcSbrZp08ZcP2y4miL54YcfbIXgxo0bm1hDZNCWd955J6wcgogknQzcDz74oOWXIl9VctB+koN+//33ltCTwZ5EnwiCpPCFAv1EP7KQ3+OPP+7GjBlj5xGB1JP2++3BhffKK6+4zz77zMpRH9I9INaSIjVl4fnnn7cyw4cPN5HJGg+RLrfHHnvMxCPCjCSoiGDe+/bt263NTZo0sc9EEO555ZVXmvg61n6LBQQadQ9uQggh4gwvg7B7924vR44c3rBhw444N3ToUC9Pnjze3r17Q8cmTpzoZcmSxdu0aZPtt2zZ0qtfv37ofPXq1b127drZ37///ruXNWtWb/369WH3rVGjhtetWzf7u0mTJt6VV16ZbP2C9/OZPn06C0R6O3bssP2mTZt6tWrVCivTuXNnr0yZMqH9YsWKec2bNw/t//fff16+fPm8wYMHe7GyZcsWe+7ixYttf82aNba/aNGiZK956KGHvAYNGoT2I/sL2rZt611//fVWp6TgGePGjYupbCT58+f3+vXrF9o/dOiQV7Ro0VAdeLfZs2f3Pvjgg1CZAwcOeIUKFfJeeOEF26d9J510kr1POHz4sHfuuefG3HeR/Rb5/vxncIw+TYoePXrY+citSPsxXrEuE8I2IYQQSbNr1y777uTf9CDDWH6WLVtmv6qxviR1rkKFCuau8uHXPr/go1lMfLDCYMEpWbKky507d2jDleW7QXzLz7G2gXoFYR/rEs/3KV++fOhvXCzE0mzevDnZ+3I9Vg/yULESpm9h+eOPP5K9ZtCgQa5SpUrunHPOsbbiWotWHnDv0Q+4yXA/ffHFF8elLCt4/vXXX5bZPRinRP18eA9kag/2X/bs2e0a+hUIOL/oootC1h/eH/2GFe949Vss1kna42/r1q076nsJIYRI8IDntEwmSWwQgy1uKf4NgjBI6+dHwqAeBAEUzRWD+w23zrBhw1yhQoWsbNmyZS3uJilw7eHawr2Gu47Yon79+rl58+ZFrdell17q1qxZ4yZPnmxuRVxjNWvWdB999NExlT2eNGvWzMRP165d7V9cd8TzHE2/4QaDYIYXBFg0iOViE0IIEb9kGMvPhRdeaAKE2IxI+LVP1m1iOHyIG2HwwvKQEhUrVjTLC1YC4kiCmz+DCWtMUs8OzuwKWm+SgnpSryDsY3GKFF2xsm3bNrNude/e3SxTPIMg7GjwTGJ4iCei7bQzGOgbrT1YSBo1amSCYfTo0RaDQ8xNUsRalqUAiN3yg5eBZxPX43PBBRdYnYL9hxDhGuKwfJo2beqWLFliQhahhRg62n7DKgbEPPmk9VpJQggh0p8MI36Y3cMMIIJe3333XRus586d69566y0b4DjP7CAGvunTp7u2bdu6Fi1a2KCaEogP7nHnnXe6Tz75xCwW8+fPt9lJEydODLkzGGgRDAREL1++3GYWbd261c7jMsFywiwgjiVlqenYsaMJqF69ermVK1da4O5rr71mVpjUwGDNdUCQN5YN3FarV692X3/9tQXxpiQkCfKdOnWq1YOg66Dw8NtDOxEItAeh8fLLL7sPP/zQ2s51BEwjDpktFUlKZelr+tSH90V/M8OMZ7Zr187ECFYvwKVJ4Hfnzp1tlhaB2gSY//PPPzZzLVhvhB3HEFA333zzUfcbopDAdQLTcZHxWYicnSeEECIT4mUgCGB99tlnLSiY4FcCYnv37m3nfv75Z++6667zTjnlFO+ss87y2rRp4+3Zsyd0bbSAZz949qmnnvLOO+88u3fBggW9W2+91e7rM2PGDK9atWoWeH3mmWd6tWvXDgXDrlixwrviiiu8nDlzhgJikwqY/eijjyzA2a9/MMgXaFv//v3DjlWoUMECaYNlgvvTpk3zLrroIqtX+fLlrZ7B4OPIgOf9+/d7d911l3fGGWdYOx544AGva9eu9hyfzZs3W3B27ty57VraQmD5JZdc4p166qne6aefbgHhCxcuDF0TfGZKZel/3onPwYMHvYcfftjKErzepUsXr2HDhl7jxo1DZfbt22eB1Hnz5rW2EoA+f/78Iz4nr7/+utXlzjvvPKJvU9NvMGvWLK9cuXL2ubr66qu9sWPHRg14zmhBe0IIEY/sSufvzpP4T3oLMJF4YDnDFUWsEJayeIWp7rj1CH7GDSiEECLjf3dmmIBnkblhEUJmhFWvXt1m9eGewv1IDI8QQgiRkDE/InNDcDqLPVauXNmms7P8ALPEsP4IIYQQJxJZfsQJgcDiyJlwQgghRHogy48QQgghEgqJHyGEEEIkFBI/QgghhEgoJH6EEEIIkVBI/GRwZsyYYasg79y508VLHZnVldSq0McbVnseMGBAqq4h6LpcuXKWX+2WW245bnUp22PqcbuXEEKItEWzvTI4pHIg9xSLQcUL5Pu68cYb0/w5pOwgLUZqIMUF2eFJyOontRVCCJFYSPxkcEj26SdfjRdIUMuW1viJSVMDOePuv/9+V7hw4TSpkxBCiIyP3F5pDEk6r7rqKnMDkWjzpptuCmVYJ0kq7qJRo0aZhYfkrWXLlnUzZ86M6vbCdXPttde6XLlyWQLP2rVrhzKWk+kctw7ig+fVrFnT/f3331HrSAJXP6t6qVKl3HvvvRd2nue/+eab7tZbb7Vnkjj1s88+S/Z+kW4vEodibeG+uKqwYjVu3Njt2bMnLN0FiU+LFy9uda9QoYK1JTVur2j19PuabO+tWrWyv6kn0N+XX365y5EjhytYsKDr2rWrO3ToUNRnCyGEiF8kftIYhAeuFrKsk/GdlY4ZnINZ4clkTkb4RYsWuapVq7p69erZIJ0UP/74o2UvL1OmjJszZ46bNWuWlSfDOe6xJk2a2OC+bNkyE0633XYbyWuTrd+4ceMswzrPX7Jkibvvvvvc3Xff7aZPnx5WrmfPnpaHi0zwuLSaNWvmtm/fHnM/IPjGjx/vJkyYYBuCo2/fvqHzCJ93333XvfHGG+6XX35xHTp0cM2bNw8TgrGQXD1ZZJH+IYcMgom/cc+tX7/eyrHy9E8//WRC8K233nLPPvtskvcnNQc5aYKbEEKIOCNd0qkmMFu2bLFMtosXLw5lY+/bt29Y9vPChQt7zz//vO1HZo5v0qSJZTtPih9++MHKrl27Nub6kMW+TZs2YcfItn7jjTeG9rln9+7dQ/t79+61Y5MnT06yjsOHD7eM8j5kWs+VK5e3e/fu0LHOnTt7VapUCWWh5/zs2bPD6tG6dWtrb3KQxb1///4x1xOoF/Xzefzxx71SpUp5//33X+jYoEGDLNv94cOHj3gmbeGekVuR9mOSracQQoiMldVdlp80ZtWqVWaNOf/8883qgKsG/vjjj1AZrD0+2bJlc5dddplZbqJZfpICVxHncHs1bNjQDRs2LOQO+/bbby3A198++OADO85zyLUVhP3I55cvXz70N0HGtGXz5s0x9wPtPu2000L7uJf861evXu3++ecfV6tWrbA6YgnyXYSxktp60k76HzdYsP179+51f/755xHlu3XrZlmI/W3dunWpqp8QQoj0RwHPaQwuqWLFipkQKVSokLm7iOs5cODAUd0vWiBx1qxZ3bRp09zs2bMtg/qrr77qnnjiCTdv3jwTVAgnn/z586fquUwND4JYCLrujuV6hAZMnDjRnXvuuWHliMM5kfVMCeqT2joJIYTIWMjyk4YQt7NixQrXvXt3s8iQwdy3xASZO3du6G8CbX/44Ydks51j2SB2KDkY7LFcEPtCDBFBzMT1IJpKlCgR2nwrDM+JTDjKPjFFJwqehaDAGhasIxuxOmkJ7Sd2KhgXRfvpH80IE0KIzIksP2kIM7GYcTV06FBz8zC4M5MokkGDBtnMJAbi/v37m0AiaDkpcLvg1nrwwQdtyjbihuBk3Fy4iBBG//vf/1y+fPnM4rNly5ZkhZQfbE2AcMWKFW1m2Oeff+4++eQT9+WXX7oTBUKjU6dOFuSMlYbZcbiUECG4rVq2bGnlSpcubYHRBIwfL+hHAqDbtm3rHn74YROrPXr0sCB1gtNjZUnP2setTkIIIdIWiZ80hMGTaeyPPPKIubqYRv7KK6/YNPUgzHpiwy2FtYPp2Xnz5k3yniVLljSX1uOPP27Ts7HoVKlSxeKKEArffPONDebMQsLd9tJLL7k6deokW0dWOR44cKB78cUXbdYXU82HDx9+RB3Tml69etm6PYib3377zabKX3rppdZOH4QJouh4gptt0qRJJgKJmTrrrLNc69atzVonhBAic3ISUc/pXYlEhbVnEBu4p1gHR8QfiEzWLUKUIT6FEEJk/O9OxfwIIYQQIqGQ+BFCCCFEQqGYn3SEtW/kdRRCCCFOLLL8CCGEECKhkPgRQgghREIh8SOEEEKIhELiJw1hrZz27dsf83R4Vm32U1OQqZ39nTt3HqdaJk58FesfCSGEENniXVywPk5GHdRYKTky19SxUq1aNbdx40ZbH0EIIYQQqSfhLT9JJRhlBhY5to4VVgsOZjI/HpDOokCBAmFZyBOFo00Ge7QcPHjwhD5PCCHEiSFuxc9dd93lZs6caakZEAJsuIiWLFli6Rxy585tmctbtGjhtm7dGmYtIocT7ihSSNSuXTvkSpo8ebKrVKmSJdmcNWuW5cqqX7++3Yf7Va5c+YicV6+//rrl5TrllFOs3O23356s2wvXS+/evS1vF6KoaNGilvcryPz58y3PFvcjEzurPwdJyu1FxngSgObKlcvyXr388suWHiLIp59+aukiuO/5559viU+DAo97vvnmm3Y996FNpNnwOXz4sKV9YEVqUmqQqoO+j6wbKTdOPfVUez4JVn///fdk3+HixYvd9ddfb/cjB9q9994byvDuv2PSbzz33HOuUKFC9kwgaz0WP7+Pxo8fH+YaTI49e/ZYGhDqR1oLcqoF4R6DBw92N998s5XhuUIIITIhXpyyc+dOr2rVql6bNm28jRs32rZ161bvnHPO8bp16+YtW7bMW7hwoVerVi3vuuuuC11XvXp1L3fu3F7nzp295cuX2zZ9+nQW2/HKly/vffHFF97q1au9bdu2eT/++KP3xhtveIsXL/ZWrlzpde/e3TvllFO833//3e61YMECL2vWrN7IkSO9tWvX2vMGDhwY9qx27dqF9osVK+adddZZ3qBBg7xVq1Z5ffr08bJkyWJ1gD179lj9mzZt6i1ZssT7/PPPvfPPP9/qtmjRIivj13XHjh22P2vWLLtHv379vBUrVti9ecYZZ5wReu4333zjnX766d4777zj/frrr9bG8847z3v66adDZbhn4cKFrS3U7ZFHHrF+oh/gwIED3lNPPWVt/u2337z333/fy5Urlzd69Gg7f/DgQXtmp06drP+WLl1qz/P7KpK9e/d6BQsW9G677Tbr36+++sorXry417Jly1AZ/qYOLVq0sP5g27Vrl7WvefPm3i+//OJNmjTJK1myZFgfJQV9f9ppp1mf00+vvPKKvTv6ItgH+fLl895++23rp6Tqvn//fquDv61bt86u428hhBCxwXdmen53xq34SUpc9OrVy/vf//4XVsYfnBjw/GsqVqwYVsYXFOPHj0/xmRdffLH36quv2t8ff/yxiYrdu3fHVD8GYAZtn//++88G28GDB9v+kCFDvLPPPtvbt29fqAznoomfRo0aeXXr1g17brNmzcLET40aNbzevXuHlXnvvfdMfPhwT8RdUJxwbPLkycn2xUMPPeQ1aNDA/kYkUX7GjBleLAwdOtTLkyePPcdn4sSJJuQ2bdoUEj/58+f3/v3337D+iOyjYcOGxSR+brjhhrBj9F2dOnXC+qB9+/ZR692jRw8rF7lJ/AghRPyIn7h1eyXFTz/95KZPn24uKn8rXbq0ncOF5YNrKylwoQTBBdOpUyd30UUXmRuH+y1btsz98ccfdr5WrVqWOR03Eu61Dz74wP3zzz9R61i+fPkwNwvxO5s3b7Z97s153Dk+VatWjXo/Mp3jagoSuU+/PPPMM2H90qZNGwucDtY3WDfcPiSb8+sGuInoO7Kvcw9cdn5fEN+Emwo3Yr169cwlxv2Tg7aSRZ3n+OAm+++//6xNPuXKlbM4p2B7I/sosr3JEdmX7FOPaJ+BSLp162aJ+Pxt3bp1MT1bCCFExiFTiR/ECgMvsR/BbdWqVe6aa64JlQsOuEEijyN8xo0bZ3E63377rd2LwdgPvCVuZ+HChe7DDz90BQsWdE899ZQN6NGmoUfO/kIAMeCndb8Q4xPsE+Jt6JegiIhWt1GjRll/EPfzxRdf2D3uvvvusCDk4cOHuzlz5tiMtNGjR7uSJUu6uXPnHlPdk3tXaUVKzyMeDFEY3IQQQsQXcT3VHYsAgbg+BPR+/PHHFlicLduxN+27774zawZBwL6IIKg6CM+pWbOmbT169DAL0ddff+1uu+22VD8PC9N7773n9u/fHxIlKYkHgoAXLFgQdixyn37BYlKiRAl3LH2BqHnwwQdDx4LWNB+CtdmwkGBZGTlypLviiiuSbOs777zj/v7775Dg4BlZsmQJBTYnBefef/999++//5oQSaq9yRHZl+xTDyGEEIlFXFt+EDnz5s0zQcKMroceesht377dZvQwIDI4T5061SwUQZEUK8x4Yq0erBy4jpo2bRpmpZkwYYJ75ZVX7Dyzmt599107H23wjgb3x9qCS2rp0qVu0qRJ7sUXX4x6Tdu2ba0cM7yw5AwZMsRmrQWnwmORom5Yf3755Rdz9WDJ6d69e6r64vvvv7f+XLlypXvyySfDRMeaNWtM8GD5oS+wDlEfX1wwiw0X5Pr1622/WbNmJvBatmxpM/RwV9IW3IfMmovWR/QxM8NoB/Xx+yjYZp6F1S4I4uqFF16w+uPCGzt2rGvXrl3MfSCEECJzENfiBzdM1qxZXZkyZSwOBRcMAxxC53//+5+5qJhqjjUGi0JqQVDkyZPHLB6404hnwYriw30RR0zXZpB/4403zAV28cUXH1V7iKP5/PPPzSWF9eSJJ55wzz//fNRriJPhudQVl9uUKVNchw4dwtxZ1BuhhiBhuj6WmP79+1u8Uqzcd999Zs1q1KiRq1Klitu2bVuYFYjp8cuXL3cNGjQwdxfiBDHKdUBsEdYnf+0cyiNcEKvUiSUCatSo4V577bWo9cDNRB8hOJnuTh8h7iDYZp5FTE6Qjh07moCjb5999lnrM/pGCCFEYnESUc/pXQlxfMFyhBAhTikRINAc6x5ihzWDTiS7d++21bZ5tuJ/hBAiPr474zrmR/x/cPsw84zYGVxeI0aMsMUXMyu48Jhhx0KFuCO7dOni7rjjjhMufIQQQsQnEj+ZAOJpiGVhBWNEAXFI99xzj8usbNq0yVxd/Mssu4YNG2o1ZiGEEDEjt5cQcWy6FUKIeGR3On93xnXAsxBCCCFEapH4EUIIIURCIfEjhBBCiIRCAc9CnABYe8pf40icOEjZwlpgQggRROInHWBF6uLFi7tFixbZQn0ZgWuvvdbqMmDAgHR5/owZM9x1113nduzYYYtHZhaYT8CstGj53kTawueJBMLBFcCFEImNxE86UKRIEct4njdvXpeRU4ewOjabOHp84ZMvXz5b1VoD8IkVnqwsvnnzZttnWQQhhACJn3QAMzy/RBMBUo6QgDZRXV2+8Dn77LPTuzoJib/wJQKI9yAXmBAiQwY843555JFH3GOPPebOOussEwlPP/106DyDCQv4kcuLtQHIq8Uqv8B6AXy5kb8JSIDJPYJZxckIjuXFdz/xS3zMmDHu6quvti9K8kyR+JKknZdddpnl26pTp47bsmVLWD3ffPNNy+dFPimSaAZXVG7VqpUrX768ZR73BQD5pO68886w55KfyoeEozfddJO16bTTTrP6+FnTacczzzzjChcubJnMcU+RwyvIn3/+aQldaS8rPVN3kr4CmelvueWWsPJYdOjr5N4ByUnJEUY9fWsF7yHSTYebDCuRj/8sFh0sVKhQKMkr2eqpE23jnZKg1P9FHiu8e3KFkfiUfi9btqzlLPP5+OOPLa8afUSdXnrppbDrOUZOL94D75XcZp999pm92/r169sx3pv/+TlWgnnMRPrh979iroQQGVb8AOkZGMAZvFm5mIF/2rRpdo7VfBk0SePwww8/WKJREmKSIJMFkxiciR8BEoQycBNbs3fvXjs2c+ZMV7169bDn9ejRwzKcL1y40GXLls0GZsTXwIEDLT/W6tWrQ8kz/VxS7DPAk1m8d+/eluWcegMrLP/999+ua9eutk/yTQbu5JJ2kun8mmuusUH766+/tnYhoA4dOmTnqQcDOWksfv75Z0vGefPNN1vWdKBttIn7MJgjBql/MAN9aiBZK0KLfsc9x5YavvrqK0ssyjvzxQkDT69evaxu48ePNwGIUIoV2oIIJXEtApas93379g39kqfPSHHRuHFje+8INd7JO++8E3YfErqSDJbPRN26dS2LPGKoefPm9v4vuOAC209u7U8ELYtzBbeUkKsrfVH/CyGOwMtgVK9e3bvqqqvCjlWuXNnr0qWL9+2333qnn366t3///rDzF1xwgTdkyBD7+9FHH/Xq1q1rfw8YMMBr1KiRV6FCBW/y5Ml2rESJEt7QoUPt7zVr1jDCeW+++WboXh9++KEd++qrr0LH+vTp45UqVSrseSNHjgyrQ69evbyqVauG9mfPnu1lz57de/LJJ71s2bJZ3X385y5atMj2u3Xr5hUvXtw7cOBAkn1SqFAh77nnnjuiTx588EH7m7afdtpp3rZt25K8vmXLll79+vXDjrVr18762oe/OeZTrFgxr3///mHX9OjRw/oyCGUoG3xW/vz5vX///deLxoIFC6wP9uzZY/vTp0+3/R07diRZfurUqV6WLFm8FStWJHm+adOmXq1atcKOde7c2StTpkxYm5o3bx7a37hxoz2Td+QzZ84cO8a5pKAPOB+57dq164iy+/bt85YuXWr/ivRD70GIjMeuXbuS/e48EWRIyw+uhyAEKmLtwWqAlYP4CVwU/rZmzZqQiwgLyKxZsyzeAisPLhw2rEEbNmwwK06kuyf4PFwqUK5cubBjvosGiw7Pat26dVgdcKf4dYCqVau6Tp06mbWjY8eO7qqrrkq2vbi/cHMxLTcSLAvUG2tFEPaxOvnX41bD5ZURoO8i43ywzNSrV88VLVrUXF++9e2PP/6I6Z60EWtUyZIlkzxPXyTVR1jH+Cyk5l1Dci65bt26mXvV39atWxdT/RPN0oJ1LzkXb0ok5V4VQohMH/AcKQL48sTtgfBBCPlurSD+9GjcRyT4xIXxzTffmEuKGBNcJBUqVLA4lAsvvDDZ5/km8shjvgvJd58NGzbMValSJew+wWBKyuOi4RiCKxrHmo08peuzZMlyhBvnaOIfYr0PLssgCEZcdWy4DInXQvSwTzxULByvjO2xvGtIzmWIa5LtWDmv60R3Ilnbt65LD+JhZqMQIvHIkJaf5CC+h6nDxOWUKFEibPO/XBFB/LonvoZBjWBkBBExHsSfRMb7pBYsAwio33777Yg6sHaPT79+/dzy5cvN+kRw8vDhw5O9J/UltigpIUEANM9DSAVhv0yZMqHr+WVN3FNSIDYi43ZS+iWO5SZoMfHvQ/8HBVAsv+jph23btpkAxcLFO0ltsDNtJKibYPSkIPg8qT7CUqQZPuk/s5H/Z4UQIqMQV+KnZs2a5k5iNtEXX3xhJvXZs2dbQHFwhg5uLSwMvtDBHcTgOHr06GMWP9CzZ0/Xp08fC2xmMCbAFnHz8ssv23mEFgHRzAjD9cLxdu3amWBKiocfftjcWwTr0g5cNcyOImgYOnfu7J5//nmrP8cIpEZ0cE9glhcDDP3CgM9zmPk0Z84cO8+MOO777rvv2r0J8F6yZEnUNjIzCssZQdRbt24N9SszowhCx8U3aNAgCzxPCVxdiKlXX33V6kZQNu7AaPBcRNL8+fNtn/eGiG3QoIEFUuPq5Nn+rDdciwRac1/eCcHnCGBcj+L4z7qMlUi3F1Zb9nlXzP5jJla1atVCn/Wk4LN2/vnn2/8nCG9mIuJCzZMnj1kZmeE3adKkY2qvECKxiCvxw5cmX3IMgnfffbf9qkcw8GXox2r4AyVWi2BsD39HHjtamGqPsEHwEC/C85hVhOVn//79NnOImUx8QcO9995rqxczsyjSmgLEMDHLy5+1ValSJXOr+e4YBqFHH33UBniex4CPgPDddwgLxCDrmNx4441WJjgTCvcSM58YyJjKj1vQn3afHMz0YuBi9hMWH0BAMqUf0YMLEWESi7jgevpn7NixZq2ibsxciwZWMAZEFqnzQdBRf8Qe96E9fn9iFWTJglGjRtkUeMQnbUjNjDIR+6zLY4UfLMxgRJRjFWJ2Y1Iwu5F4OWZgImb5DnjooYds1h3inB8e/DAg7k4IIWLlJKKeYy4thAgDix1LLBD8jIsyCEIYCxWimHWJ4inmx/+xgDvW5/LLLzcrIuI1GgiUcePGmSUyMpWLn8bkyy+/tCUqgB80LDuwb98+6ycsTARMI7RZ+wqhhPAPukCxAGLBjIVo70EIkfG+O08EcWX5EUKk/6zL431vP+1E8N4ExNeqVcsseEHh41tCmV2JSxkBhHVICCFSg8SPECJVsy6P972TmmGHqxRL04cffnjEQpK4nYkdw42M24vYIeLJhBAiViR+hBAZDpY2YHYmbipi1ohTi5xCf//999tq5FiGiJETQohYkfgRQmRICLaeOHGiBUST2sRfY4u8dFOnTrU4Htbzmj59ugXjCyFErEj8CCEyLMziYkkD5mUQFM2CmQRiM+MLwXPDDTfYrM9gYmEhhEgJzfYSIh1me4kTh96DEBmP3Yk+24sptZixMxr+YmxkYz9eHGvOoqPJkySEEEKIDCZ+CFhMabXfzDL4syAgK9sKEa+wcnowoW9wY6VlIYSIB9I94U56ZSJnBeGksqinJf4gIdIXYkYQ0SRqFanj5ptvPiKhr8+J/v9JCCGOlgzl9iKfFFnYWer+tNNOs5xQQ4cODZX1E4dWrFjRBq9gqgrSTRAAiU+fnFDBAEjfYuTn9qIMv2BTkyOIxJykVTj33HMtHxEpJFiDxId6koA0ch2U+vXrh5buT8rt9fbbb9tzyRTOYm/kL0rNIN66dWvrF6YGlypVyg0cODCsDOkdWGmXdBLcn1QaBIsGk6iS9JRgUu7BvUaOHGnvYsCAAcla3HAHcgz3YKx1OXTokC1QR/JZ6tGlSxfXsmVLq58P/UfeNP8+pNH46KOPovbDjh07LF0H75F3w8wgcpj5kFqDZ5IShLQY9DWL6KXUbnEk/H8ZmdDX34oVK5be1RNCiPiw/ERCvh/cYI8//rgNeg888IAJFgZTckmx8BlL4yMYyGkFCBlWgiX3D8KIpfTbtGljgobB1YeEoNyfMgggyhw4cMByBFF26dKlyVpmCJok5xYDNsFZTMFlkTVyX1Gnhg0burZt29q0W3/ZfrKsk4crOUE1ePBgy9lFugAGbAK/IjOTRwOhULhwYcuZhZggySt5xBA5d9xxR6gcdeIY/65evdo1atTIRBjtB4QDyUsRMvx6p06pXck3lrqQg4l3RU40hCriiDQGpDvwQfi8//777o033rDcZbwbcqWx6F1ySWkReIgdxA3vhndEjjPep2+NIEcYz0ckUz/yoCFMU9tuckqx+UQuwCeEECIO8NKZ6tWre+3atbO/ixUr5jVv3jx07r///vPy5cvnDR482PbXrFnDzDRv0aJFYfe44IILvJEjR4Yd69Wrl1e1atWw6wYMGBBWply5ct7TTz+dZL2mT59u1+zYsSPZutetW9fr2LFjaL9+/fpeq1atQvtDhgzxChUq5B0+fNj2e/To4VWoUCF0nnNPPPGEFyvJtT/IQw895DVo0CC037JlS+vXQ4cOhY41bNjQa9Sokf29bNkyu+eCBQtC51etWmXH+vfvn+xz6ReO0U+x1iV//vxev379QvvUqWjRotZvsH//fi9Xrlze7Nmzw+7TunVrr0mTJkk+Y+XKlVaP7777LnRs69atXs6cOb0xY8bY/vDhw63Mjz/+GCoTS7uTgndImcht165dR5Tdt2+ft3TpUu/vv/9O9n4i7aH/eQ+8DyFExoDvzOS+O08EGc7yE8z5g1ulQIECUX+Ns+7Hr7/+ai4X35Lhu1iYRheEZfCD4ILBskRG9Jo1a1qyxMh8Rj64dXDJkTl8/fr1ZjHCAoCbxadZs2ZWB1xuuFawcpB1PqnYEtq0YcOGkJUoElavxQLi4y/wFgkZ1nGd4cYhMST1inStYSXzM7wD1hjSAgCZ01lEjqzoPrgwcCGllmh1war1119/mZXMhzphTfNdhVilsNCQ0ykI98FalxTLli2z+gfjULDsYCnknA9WwuC7Pdp2d+vWzSxEQcsPqw0nBc/k3fOesVyx76dyEGkPq3jw2dmyZYu9B99SLIQQ2eI9n5AvCljePjIQMzjgA66tyBxBLJ2PCwsBhMsFtxjuq0j69etnbhriQYj34V7EKvHl6kP8EF+43K9y5cqWEbt///5J1ps4k2g888wzNjssGqNGjbIy1Llq1aoWj0E9582bd1xzNPniLbgkVDBmKDV1iYb/Luk/YquCICaPBfr7eAgP6hFrXeg3YomILUIAifSBHyjEDyrAXQiRYcVPNPxfblhhfPLnz2+BxiQ6xPKSWvwcQWz8qkdEJSV+iMUhRoT4E0A8rFy50gJofYgjuu2228zigxUD60PQshAEcUBwLVPfgzEvPsSksEWDOlWrVs09+OCDoWNYwVIDdcRKRpwUVhig7gQR+2C1AAZx3wITudxASnXBCse7WrBggbvmmmtC75H0BL51KBiMnFx8TyTEDlF/RBbP94PTsewE383RtPt4fWYZeHlW8HMrTgz8AMLCJ4ubECJuxQ9igF/wBBETXIvYYFDt2bOnubD4m+XucUd9//33NpAFXRSRYLkh0Jjl8SkbLUcQwbcEYBPIi2vk5ZdfNjdO5ACLALvpppvcL7/8EhJKycHsL0QX7aIeJG9ERCQlvpKr07vvvmt5jrAwvPfeeyYu/FlxscDMOFx+BCcTgI2ViESRQUsJf19xxRUWmM29cdl179491XWhXVjXcC/xXDJx0+/+cxCEWI86dOhg4vKqq64KBYETyOwHr3Mt97n11lvtuYhS3I1DhgyxexDYjuWI48fS7uMF9+P+mgouhBAZg7iyA/ML7pVXXrFBDmuPP7jhvmIWD7OIcElhNWB6c0oiIDU5ghjsseLgJmOKPbFIwSnaPtdff72tXYTloWnTplGfz2COG41nEpeDaApO0U6J++67zyxNzN7C5YfFI2h5iRVEC1YZLDIICoQEIiKYCoBYHqwXWEkQjc8++2yq68IsLJYLYHYZrjFm1tGfwecw0+/JJ580ceO/F9xgwXdJ3yKKfHjv1Iv+476455hhl5LYiKXdQgghMh/K7SWO4M8//zR3IEsKJBeQfTzAuoPAYSp8rKt8Z7R2p3d+GiGEiEd2p/N3Z1y5vUTa8PXXX1uwMVYz4noee+wxi0fyY3OOFywqSWA5ljlck6zLRMLJlCxk8d5uIYQQGQuJH2Ezt1hUkqBx3D4EDhO0fbxjVJhtgzuSuB4MjmXLljUrS3JxVvHQbt9wqsUOhRAidvzvzPRyPsntJcQxgHBilW8hhBCpZ926dTaB6UQjy48QxyExL9PzIxfVzAz4izjyBZUZY5oyc/syc9tA7Yv/ti1dutQmL6UHEj9CHAP+wnkIn8z2BRWEtql98UlmbhuoffHLueeem26Lj8bVVHchhBBCiGNF4kcIIYQQCYXEjxDHAOk4evToccy5xzIqal/8kpnbBmpf/JIjA7RNs72EEEIIkVDI8iOEEEKIhELiRwghhBAJhcSPEEIIIRIKiR8hhBBCJBQSP0IcA4MGDbJkqKeccoqrUqWKmz9/vsto9OnTx1WuXNnyl+XLl8/dcsstbsWKFWFl9u/f7x566CF39tlnu9y5c7sGDRq4v/76K6wMq1jXrVvX5cqVy+7TuXNnd+jQobAyM2bMcJdeeqnN4ihRooTlcjuR9O3b15100kmuffv2maZt69evd82bN7f658yZ0xLxfv/996HzzFl56qmnXMGCBe18zZo13apVq8LusX37dtesWTNbLO/MM890rVu3tqS+QX7++Wd39dVX22eZ1XdfeOGFNG/b4cOH3ZNPPumKFy9udSdVTK9evcLyPcVL+7755htXr149W7GYz+D48ePDzp/IdowdO9aVLl3ayvB5mTRpUpq27+DBg65Lly72rFNPPdXK3HnnnW7Dhg0Zt33M9hJCpJ5Ro0Z5J598svf22297v/zyi9emTRvvzDPP9P766y8vI1G7dm1v+PDh3pIlS7wff/zRu/HGG72iRYt6e/fuDZW5//77vSJFinhfffWV9/3333tXXHGFV61atdD5Q4cOeWXLlvVq1qzpLVq0yJs0aZKXN29er1u3bqEyv/32m5crVy7v0Ucf9ZYuXeq9+uqrXtasWb0pU6ackHbOnz/fO++887zy5ct77dq1yxRt2759u1esWDHvrrvu8ubNm2f1mDp1qrd69epQmb59+3pnnHGGN378eO+nn37ybr75Zq948eLevn37QmVuuOEGr0KFCt7cuXO9b7/91itRooTXpEmT0Pldu3Z5+fPn95o1a2afkw8//NDLmTOnN2TIkDRt33PPPeedffbZ3oQJE7w1a9Z4Y8eO9XLnzu0NHDgw7trH5+aJJ57wPvnkE5SbN27cuLDzJ6od3333nX02X3jhBfusdu/e3cuePbu3ePHiNGvfzp077f+f0aNHe8uXL/fmzJnjXX755V6lSpXC7pGR2ifxI8RRwv/cDz30UGj/8OHDXqFChbw+ffp4GZnNmzfbl9fMmTNDX1x8eTDw+CxbtszK8CXmf/FlyZLF27RpU6jM4MGDvdNPP937999/bf+xxx7zLr744rBnNWrUyMRXWrNnzx7vwgsv9KZNm+ZVr149JH7ivW1dunTxrrrqqmTP//fff16BAgW8fv36hY7R5hw5ctjAAQwQtHfBggWhMpMnT/ZOOukkb/369bb/+uuve3ny5Am11392qVKlvLSkbt26XqtWrcKO3XbbbTb4xXP7IsXBiWzHHXfcYf0apEqVKt59992XZu1L7scI5X7//fcM2T65vYQ4Cg4cOOB++OEHM137kKOG/Tlz5riMzK5du8KSstIOzNbBtmBSLlq0aKgt/It5OX/+/KEytWvXtgSFv/zyS6hM8B5+mRPRH7i1cFtFPj/e2/bZZ5+5yy67zDVs2NDccRUrVnTDhg0LnV+zZo3btGlTWN3IM4cLNtg+XAzcx4fyfF7nzZsXKnPNNde4k08+Oax9uEd37NiRZu2rVq2a++qrr9zKlStt/6effnKzZs1yderUyRTt8zmR7UjP/w8jv2dwj9GmjNg+iR8hjoKtW7davEJwwAT2+ZLLqPz3338WD3PllVe6smXL2jHqy5eN/yWVVFv4N6m2+ueilUFE7Nu3L83aNGrUKLdw4UKLbYok3tv222+/ucGDB7sLL7zQTZ061T3wwAPukUcecSNGjAirX7TPIf8inIJky5bNxG9q+iAt6Nq1q2vcuLEJ0uzZs5u44/NJXEhmaJ/PiWxHcmVO5PfS/v37LQaoSZMmoaSsGa19yuouRAKBhWTJkiX26zozsG7dOteuXTs3bdo0C37MbCBW+aXcu3dv20cc8P7eeOMN17JlSxfvjBkzxn3wwQdu5MiR7uKLL3Y//vijiR8CZjND+xKRgwcPujvuuMMCvBHuGRVZfoQ4CvLmzeuyZs16xKwh9gsUKOAyIg8//LCbMGGCmz59uitcuHDoOPXFjbdz585k28K/SbXVPxetDL/8mN2SFuDW2rx5s83C4lck28yZM90rr7xif/OLMF7bBswMKlOmTNixiy66yGanBesX7XPIv/RREGayMfMmNX2QFjCrzrf+4Hps0aKF69ChQ8iKF+/t8zmR7UiuzIlo58H/Ez6///67/SDxrT4ZsX0SP0IcBbhSKlWqZPEKwV/p7FetWtVlJPgFhvAZN26c+/rrr21acRDagcsh2BZ87Aywflv4d/HixWFfXv6Xmz84UyZ4D79MWvZHjRo1rF5YDPwNSwluE//veG0b4J6MXJaA+JhixYrZ37xLvvSDdcMVRwxFsH2IP4SiD58DPq/EnPhlmMrM4BVsX6lSpVyePHnSrH3//POPxXwE4UcFdcsM7fM5ke1Ir8/qwf8TPkzf//LLL21phiAZrn2pCo8WQoRNdWe2xjvvvGMzGe69916b6h6cNZQReOCBB2yK7YwZM7yNGzeGtn/++SdsOjjT37/++mubDl61alXbIqeD/+9//7Pp8kzxPuecc5KcDt65c2ebUTVo0KATOtXdJzjbK97bxoyZbNmy2ZTwVatWeR988IHV4/333w+bQs3n7tNPP/V+/vlnr379+klOoa5YsaJNl581a5bNjAtOMWbmEVOMW7RoYVOM+WzznLSe6t6yZUvv3HPPDU11Zxo1ywwwuy7e2seMQ5ZKYGNoffnll+1vf7bTiWoHU8H5zLz44ov2We3Ro8dxmeq+J0r7Dhw4YFP3CxcubP8PBb9ngjO3MlL7JH6EOAZY74WBlfV+mPrO+hUZDb6oktpY+8eHL+AHH3zQppnyZXPrrbfaF1eQtWvXenXq1LF1NxigOnbs6B08eDCszPTp071LLrnE+uP8888Pe0Z6iZ94b9vnn39u4gyhXbp0aW/o0KFh55lG/eSTT9qgQZkaNWp4K1asCCuzbds2G2RYQ4cp/HfffbcNZkFYe4Zp9dwDQcJgndbs3r3b3hX/D51yyinWr6wlExww46V9fD6S+v8MgXei2zFmzBivZMmS9llliYaJEyemafvWrFmT7PcM12XE9p3Ef47GxCWEEEIIEY8o5kcIIYQQCYXEjxBCCCESCokfIYQQQiQUEj9CCCGESCgkfoQQQgiRUEj8CCGEECKhkPgRQgghREIh8SOEEEKIhELiRwghhBAJhcSPEEIIIRIKiR8hhBBCJBQSP0IIIYRwicT/A2W9xK9qTq8HAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "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(figsize=(6 * 72 / 100, 4 * 72 / 100)));" ] }, { "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 7.983s ago] ('table', 'endangerment')\n", "SELECT count(*) AS n_rows \n", "FROM endangerment\n", "[generated in 0.00050s] ()\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", "8567\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 7.989s ago] ('table', 'endangermentstatus')\n", "SELECT count(*) AS n_rows \n", "FROM endangermentstatus\n", "[generated in 0.00044s] ()\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 7.993s ago] ('table', 'endangermentsource')\n", "SELECT count(*) AS n_rows \n", "FROM endangermentsource\n", "[generated in 0.00037s] ()\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", "66\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.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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \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 risk/safeca2f49b1
vulnerablethreatened26bvulnerablevulnerablecd5ce041
definiteshifting37definitely endangeredthreatened/endangeredsf199031
severemoribund48aseverely endangeredseverely endangereddf949021
criticalnearly extinct58bcritically endangeredcritically endangeredta800031
extinctextinct6>=9extinctdormant/awakeningf8888881
\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/safe ca2f49b 1 \n", "vulnerable vulnerable cd5ce04 1 \n", "definite threatened/endangered sf19903 1 \n", "severe severely endangered df94902 1 \n", "critical critically endangered ta80003 1 \n", "extinct dormant/awakening f888888 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.00078s] ()\n", "ROLLBACK\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqsAAAENCAYAAAAotiyfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAApSlJREFUeJzt3QecXHX1//+hNxUIJTQJoPQm0iH0Ir0YmrTQexOkht6kV+lNQXrvSIeAAYKAdFDpiHQVEFDg/h/P8/1/5nd3srvZhGSzIef1eNzszsyd22Yy+55z3uecsaqqqhpJkiRJkiRJ0gMZe1QfQJIkSZIkSZJ0RIrVJEmSJEmSpMeSYjVJkiRJkiTpsaRYTZIkSZIkSXosKVaTJEmSJEmSHkuK1SRJkiRJkqTHkmI1SZIkSZIk6bGkWE2SJEmSJEl6LClWkyRJkiRJkh5LitUkSZIkSZKkx5JiNUmS0ZYtttiiMdZYYw2xrLLKKo2PPvqoseuuuzZmn332xkQTTdSYccYZG7vttlvjX//6V5ttDB48uLHCCis0Jptsssbkk0/e+NnPftb485//PMrOKUmSJGlLitUkSUZrCNN33nmnzXL55Zc3/v73v8dywgknNJ599tnGb3/728Ydd9zR2HrrrZvP/fTTT+P5hOyjjz7aeOihhxrf//73Q7D+73//G6XnlSRJkvwfY1VVVf3/vydJkowWiJ5ef/31jRtuuKHxz3/+M352hauvvrqx6aabNj777LPGuOOO23j88ccbCy+8cOONN95o/PCHP4x1nnnmmcZ8883X+Mtf/tL48Y9/3KXtfvPNNyGMCV3HliRJkgwdEvSTTz5pTDfddI2xx+44fjpuF7aVJEnS7en93/3ud0PcL+IpOtoe9913X+P444+PCOnnn3/emGmmmRqrrrpqY88992xMP/30sQ4LwA9+8IMQqmARmGKKKRoXXHBB44ADDgg7gGjrnHPOGc/viC+//DKWwttvv92Ya665RsCZJ0mSjHm8+eabjRlmmKHDx1OsJknSI5Gev+iii9rcN8EEEwyx3i233NKYcMIJQzwSoZZddtmlseaaazYuvvjixoknntg46aSTGh988EHjiCOOaGy33XbN54qE3n///Y111lknHhMh5Vt98sknm4K2PX796183DjvssCHun37H3zbGnmDib33uSZIkowvPHvaz4X7uv//978hq+SzujLQBJEnSIyOrnaX36zaAV155pfHII480Ntlkk8aAAQPi8V69esUC25FeWm655cLPWu770Y9+1PjVr37VOPPMMxtzzDFH48MPP2zceuutbfbz6quvththbY2slg/cErlNkiRJho7PzkknnXSon50ZWU2SZIRShKRoZXfw8ccfRzHU0UcfHQJy5plnjshoEavjjDNO2Acmnnji6A7AGuBDkTDdcsstowvAoEGDwjflMRYABVqiscXH2ooIb3tR3iRJkmTEk2I1SZIu849//CNS4ITeW2+9Fd+IFSEpWurfv38IwhERReUbvfHGG2N7ddM9X6mljnWJz2mnnbbx2muvDfGtnVAlLG+77bY2x0e4nn322Y3XX389BLZzGX/88RuTTDJJ7NM2Cd32aC+yinkO+UPaAJJkDOa1Y1Yf1YfwnSTFapIkXUK6fckll4xIpCjmvPPOGyJQ9fy5554bRUxrrbXWCN3nFVdc0aZwqURL63z99ddRUUpIv//++81oKwG58sorN/7zn/80fv/738d9hx56aOOmm25qvPvuuxGN/eKLL+K5O++8c4hXXQLuuuuu8KuyDQyrZ5V3K20AycjE+z3bqvVcfKYk/4/xxhuvwy/9w0J6VpMk6XLB03PPPdd48cUXI/rYio+S0pS/bgMgZnffffdItYts9uvXL1Ls3/ve90I8too+Vf2tQnGZZZaJQigFUEceeWTjkEMOCUHJlE+EtsJnqjirI8FJsEr377HHHiFweVOL0BVhnWWWWRpLL71045RTTmn3+elZTbqb8oVMFiJJRicEOKaZZpp22/qlZzVJkhGG4qM777wzIqp1obrssss2fvKTn4Soq38Q3XvvvZHe19JpiSWWiFT9+uuv39hhhx0a22yzTVTrE4qE6uqrrx7RosMPP7yxyCKLtCsw999///h58sknxzEURE3hm7vIKFHMs3reeec1rr322hCQWqI4Zh0DNP93+09/+lPs9+mnnw6RSniKAJRuAn/9619DrA4r3wUbQKYxeyZFqE499dTxpS/7+Sajwxcsn9Hvvfde3GbVGl5SrCZJMlSINx88+pLWefjhhxt//OMfG+eff36k0o899tg2j1922WWNr776KuwCoq1HHXVU4ze/+U20ldpss81iHSLSOlNNNVXcvvvuu0OU8sVeeeWVUamvnZQ/1iWiSlza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aU6s2mCDDSK6uvjii4fQ/vTTTxsbbrhhiFsiGn//+99HyuuSJEmSDCOGAiRJMvrTv3//apxxxqkmmWSSaoIJJjDsoxp77LGra665pvr000+r8cYbr7r00kub6//3v/+tpptuuuq4446L2/vuu281zzzztNnmgAEDYjsff/xx3N56662r7bbbrs06AwcOjP18/vnncbtPnz7VOuusM8Tx2c6EE07Y5vhWWmml6o033qjeeeed6pxzzon7PP++++6L32eeeebqsssua7OdI444olp88cXj9379+sV6J554YmzDcv/998d9gwcPrhZddNFq0kknrX760582H7d89dVX8Xw/Hc9kk01WPfXUU9Udd9xRTTXVVNW0004b16MjDjnkkNhH6/Kvf/1rmF+3JEmSMZV//etfXfrszMhqkoymKDYqhUIF6W3RQxFCflWeUFFQEVE+0RdffLG5riKsRRZZJCKWEJVceOGF22zP43UUN0nLl3GnFtHZb775JiKzhRLxbOXkk0+O4xO5FQl9/fXXG3vvvXek5H/1q1+FvaB+Tra5ySabRGSUx5S/9cgjj4zzsYgcY6+99mpMO+20sZhKhYcffjiug+iqSHJ53FLS9rbJtiC6qguBqCobwTvvvNPmWrWSNoAkSZLuI8VqkvTgyn69QVvFovshba0wqL3pTlLwqt+JtdKDdETAI8rTSXCWhfDUo1TxUv042oMP1PHNPvvsjdVXXz0sCKwE+qB+8sknjYEDB8b2LrvssuZzVO+zChiP6nnS+I888kik7rWZKtflwAMPDF8rewJcA8dKkK666qpxjAqjjFItHQgUYRHpjp1vlWe3iHcCPEmSJBn1pFhNkh4K4aWKX9SxPRQ4KZbqCKKM0CPiipCsRz9FWhVYEYogBB9//PE222gtwDLhiags407rS/HGDg+KnohJEdK55567se666zYr/RWNEZv8rDyw2lMphiJGRV1BlCrqcp633357m217jCh1jPvuu290ClBohSKKV1hhhbgO9iPSOzRyglWSJEn3kWI1SXooKtpFIgmjrtoA9AaVyid0ibIrrrgiIotaN2mKf+ONN0Y7J5FPzyWEt95663iugipRReKOQJTil7ZHiebOM8888RwFVaKqorYq9a1PWEqjl+lQUGlvXal32BcBrXjpgQceiMiqbd9xxx0hJu1TD1ZCvAhqIvS0005rTpSSgvec559/PgqvIOrqPtHRSy65pM01IcJZAgwEUO3//vvvR5GWCK2oqn26biwPrssvf/nLeJ6WVx2RNoAkSZLuI8VqkvRQiEzV76effnqMDB0a1pH2X2211SICec8998QYUWLxuOOOC3FK8A0aNCgE5VRTTdX4/PPPG++99148X5SWoNUKCsQj0QtitERWl1xyybAf8Jfatm34aX+iubb3f/VUjRCZUuuq+kGcEt+io7oOSLVvtNFGIXjbQ/srUVT9WVXwgwBX/W/bf/jDH+I+4lO0VGS1VTiW2ywGRLJjc46lT6rb+rQus8wyYSEoYrcI9PbICVZJkiTdR4rVJOnBSIcr/DnkkEOGuq5IoLQ4EUb8SZOLABo9SkASkuuvv36k8Xk2WQII1taU+LvvvhuPi5wSvhA9LBhJeuedd8Z2CFUTok488cQ4Tj5Z0dCVVlop1n3jjTeib6s2UkRhWRQ8Ec4EtHZapVhLyyutq4rvVHqeMC7ttUBo2hfxue2228b2nLOirg8++CDEtChvKbQqGJLgvBy/8/Z8UVeRXMciKkzsFrF+/PHHd3itc4JVkiRJ95FiNUl6OHyr+oqWwp+OIC6Ju86Yb775mr+LHLIZlMiq7bMOSK+/8sorEWFkG4B0eXvwmf7iF7+I9Lroosr6IlJLoZjjIgoNDyByCUpRVWKSQN1xxx1jcEFZRGitX6wJvLAEqIgqRGNtw/6MTz377LMjhe/YiWrRVoKznsYn1OsFYASq8954441D7HqMwF500UXDplCuT0ekZzVJkqT7SLGaJD2cpZdeOtpDiZJ2RvF5doZ2VXUIsnrVu0ipqVKKjXhFW5v9t8IHKup53nnnhQXBguIv5SUVwbUt25bKV8SkZZUKf9aFU089tc30KV0Oiu2AqHTe/KUEMYhcolYk2DkTuyK1mvwTpaKq9WOoc+ihhzajoEQqwWvwgVZVpeCsRFazdVWSJEnPIMVqkowGaGHFV8lv2lnUVFRyeGEd0G9UtPSLL76I9LuIJgFYIp11iDoRV90GRHQ9v73OBQQhAUrQalOl44Dnlh6pnle3CLAVlKlTu+66a0RniVVilG1A6h+8rIqhrMebq52VbRK4BduqR1TL8fDMFhSUiSI7b6JXpLRM2kqSJElGPSlWk2Q0gHjjR1VU1BF8rZdffnn8lNJ/5plnwkLQVWxfQZVhAsQhLyuxuNlmmzV69+49xPq8n6KY5557bvhM77333saee+7ZZp2TTjopjkmUkvi9+uqrw3pAdOokoKBLc39WARX5ZdFrlXAlkolJY1F1EhDF3GqrrcI+oA0V0Ws9nRMcj30QtSA8uwJBy05gn4899lj0bwVbQUekDSBJkqT7SLGaJKMJhx9+eKeN6qXHiUHV9wqQll9++RBfXWXiiScOv6e0vvZX6623XkRMf/Ob37S7vogrH6nCJS2tNOhv7ctKjOpEoPjJNglD6X9+UlFWj0vXL7DAAm0mTBXvralWLAE8qcSkaCqfqciv4+KpJVIJZsdAAE833XTxXMVhbAfW7QjC9uKLL25ceumlcb48ssU+wL/aEWkDSJIk6Ua6bQBskiTfaV599dWY8fzkk08Odd0LLrigWmihheL3m2++ufrRj35UffPNN3H7vvvui+1Yttpqq2q66aZr3rZ873vfq6accspqueWWi9u9e/eO53399dfVT37yk6pv377V97///erggw+uFlxwwapPnz7V/PPPH+sccsgh1eSTT16tvfbacfvYY4+txh577HjcMfXr16+aeOKJY7vXX399h8f/xRdfxCzrsrz55ptdmm+dJEmS/D98ZnblszMjq0mSdDsioJtuumn8vsoqq0R00pCAOqLDIr36zYoqswKIsIocS9Uripptttmiql9kk1+X9UERlbZair9ETRVztdfgXwSVTUG0Wi9b9gKR4o5GxdZJG0CSJEn3kWI1Sb5jSIlLhbdaBlT5E2Q8on7nQ+X9lJ6/++6726yrBZWBBNaXqjcO1XbrsBhI3/O5SvMbRNAK76vqf/uxP/5XhVCeq+UV6wKfK7Gn4wE/q8lckOY3vIAo5YlVra9Y6u233262nuJpZQPgtzU4gDVBCyrtrgjVMo1LX1TnRBArIrv11lujcEtPWR0FCGbn4XiKZ7Uz0gaQJEnSjXQad02SZLTjo48+qsYff/zq7rvvbt734YcfNu976qmnqrPPPrt65plnqpdffrk68MADqwknnLB6/fXXm+tLnffq1as644wzqr/85S/Vr3/960iXv/jii/H4J598Uk011VTVxhtvXD377LORyp9lllna2AA+/vjjWGf//fevXnjhheqJJ56oVlpppeqHP/xhrDfOOOM0U/tjjTVWHMNZZ53VvM/z//73v0dK37FYZ7zxxotU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3XffHb8//vjjzecriKsf35VXXhm3i5XjT3/6U2xDQRcbQHtI89dfKwVzzmObbbYJ2wNLgAKyVutH62uZNoAkSZLusQGMO6rFcpJ0B6KKCm5E5ETPpPFLZE8xj+IihUEiqCKUpk395je/6XB7+oFKVy+wwAKRYlcAJNVfooGKrUTzFD6Jpramnwsin9LTep0qKNJjdNttt43+n2wLLAKiqVNPPXVj7bXXjpGh+qYq2hJVnWWWWWI7oq+ipaKm1hMdVGgkaiwdXiKstKdIarE5iOR6XETWNvbee+9mSl6xmUIySO+jdVSp82SD0MvUc+1Xet7xgVXB6FT3wfVlnYAIqYg3i4Hop9u236dPn7AP6Ikqusx+4LUpkdlyLvWJV5dffnnsh+XA80XHf//738djCrMUxrmmCrZEbtkNymuFueeeO8ayirD2798/eq+yZHSE95GiuIL3VI5cTZIkGUl8S1GcJKMNf/zjH+Mb3Gqrrdbmfu2bVlpppYgyKgBS5FMirx1FVkUtTWSyvuIhkc0nnnii+fhNN91U/fjHP46IaL11VWtk9bDDDotWS6KfWlfZt9ZPJZr573//O37XW9S2RA0tpizpLer57UX47B+imKKXpcWTiKpIpmNVbOWn6GfZrvVEGW1btFOLqDLV6ec//3ms43w9x3UsfWFFOMsEKUspmLK8/vrrzcioQq1evXrF810LhWruVwj25z//Ofreiny7FqV91Morr9ycYqXHrMcci1ZUtlX249qVbflpvSmnnDLOo7TscozORYsuxXUed11Fl7XwKu8N+/XadpWcYJUkSTLsZJ/VJOmBXHTRRW3E6plnnhmV8/VKf31YicICkSU9ravByy+/HGn1p556Kh5T9e8/+iqrrBIV8gSaSnYdBWDbhNqhhx4az/3d734X277zzjub1f+2TzBLtz/yyCOR6tctoHQMILKJPKJbn9kHH3wwhKLetEWsSqF7XOqdFUEa3XOIY8cLjxOSqu+l3n/961/H43q+sgXobUswEqIPPPBAnBcxat0yRraIbtvQm1ZXBfc5JzYF19b1s87FF19cbbjhhrFPor184fDFwrGxAwwePDiO1fnbxm9/+9suidXss5okSfLtyW4ASTIasOyyyzbef//96O2p8EhKvDX9zCagl2vpOKDw68EHH4zfPQ/S/b/85S8j9X3FFVdE9Tukpn0ptQ+pdcVKnq/vKlgVpOo322yzxoILLhipdOnwksq3LcVfZbwoy8NSSy0V65dOAYqvFGLpRKDQSopdkROrgfQ6e4DqepX87BiKvaTgWTB0R5CeZ2FQ4OSn9dkPFHpJyTue0u+VpcL10Olg9dVXj04PCtN69eoVnQX0mtVXFewTukCwPSiC0y1B1b/H7Yd1Q7FY6YJgKYVnQ0OXBt0PypIWgCRJkpFHitUkGYXMOeecjTPPPDNEqkb+WkkRXHWIOl5KPknra2ivEwB0L6ijIwHhSEzytBKHhglofUVk8tgSbQV+1daWTirpiUndCnh5tajiE1XZX+DXJX5B2BK8OggUCDje1L59+8Z+CUqtuuabb74QxeA75fP1XMMPiFRV/wYXfPDBB43bbrstnl+6DkCHgqWXXjq26Xrw5xKYH374YYhhXQT4Zgv8v0RzaWllPQLWfcQwD61hAdqZEbX8t4RnvW1Ze2TrqiRJku4jxWqSdCMKu0QS6+ywww6NN954I9poEZprrLFGm0KmQw89NESlCVJaPnm+wiMUEVkKjaCNlkiiwiIoyBKVFQG1D88VdSwQZ6VdVh0FaUQjYTbzzDPHOuXYCU2CtFUsW6c+nUsUVVEUYWs/WmeJ+hKOZTuipwSpyLBIc+mL6jgJ+IKoruN59tlnGw8//HDz/lJspbBKwVgd12ennXYKAXv00UfHFwN9W4l4olkUm/A/4IAD4jgVmXkNfDkgZpMkSZJRT4rVJBkNkF4n5ohOIlSaHSKVZTTq8CBSKypYjwzqhkCU1nuVdoaOBFLpZcwsRBvLaNNhORZV/CViC5FTsAGIqoqeEtzErjGyKAMHRGRFc8ughIIorPv0toVeq7Yh4qyXquWoo45qbLrppmEL8IWgfCnoiLQBJEmSdB8pVpOkByNCKhUv0shDKqJIFBJ2EPV0W/SQeHvxxRfD+ykC2RVMuhJl1ebqiSeeCBuCaVEGJrRO7eoIIlJ0VBpf66jnnnsuWlKVqVldxTEUn6roqUlStsWOcPzxx0c7KVFREVQtvspwAtPIYIACu0G5Nrbx+OOPR+QaItPE7E033RTHxY9L/LMxsFaIvrqfLcIACdHVjjysaQNIkiTpPlKsJkkPhnDisyQgRVel+Amrww47LB53H8ElIskzqoDKCNK6b7MziDPr86zyghKvIqV6rA4L+s7aNwuDbegvSzQOSypdn9U//OEPYQPQX5ZlwnkoCFPgZVsmThGcpmKVXrllupgJVaKrxYZAMPPwOi52ANOuWCZ4cNkL2Ay23HLLsA7ccccdMb1Lb92tttqqOVFLJLc9FHqxatSXJEmSZCQxAjoPJEmStEEbKm2kzj///Lj93nvvVTvssEP0VtV2qnfv3tE/9aGHHup0O6aAlT6xSyyxRLX//vtHP1aceOKJzd6tpS+t/Za+q9p6obSVKtOwtPdaZJFFmvuwfe29tPEq6MVq/Y8//rjd48rWVUmSJN+enGCVJEm3YUIUC4LorrS4SVt1z2m/fv0iSql4SeRWZwBeW1HjzvA8E8a0qdKB4NZbb20ce+yxkdqXqi++3YIoqwisKVWsAtL4OiMo9JLWd3w6Afi9+F2Ll9UULjYCVgvn0FlklWe1RLeTJEmSkcy3UcR/+ctfYia6OeSoNzZPkmTMwSSsn/70p9FIX6RyxRVXrJ5++ul4THTSR83999/f4fOtUyZKGTyw3HLLxXQu0VlRzP322y+GFIiAlijp0ksv3Yyo+nn66afHoIDyeJl6pdn/4YcfHlFZt8uwAse56qqrxn0777xzDCSwfYMUPOZ+keD2yMhqkiRJDx8KIBrCl8YvxyP2zjvvND1i5psnSTJmoX/rn/70p6iy5zm96667oofqjjvu2GyT5bNC66p626nC+uuvH/1fb7/99tiO4ilFVaKg/KGl9+oFF1wQbaZ4RLX7Kqj25zfle9WWSgGUY8I888wTwwBEQvloFYTxqToOXl2+WH7Vv//979ERQDSWl1fXBceTJEmSjFqGS6xqoeMD3h8LfxzqfRkVKiRJkkjhsweYQKVDgc8MXQ222WabEJyl9dRDDz0UXQhMlNKBgJA0DUs6XxsrU7m0rtpuu+3i84ZgVTh1xBFHNPdFHBscYF+K0nyR1o4K7le4pd0V+4Ft2jbhqgUYYXrMMcdEUZn0P4GsJ637TOBqj2xdlSRJ0n3EAPJhfZKIiQ9/FbWiFCqR+dC0gOEfE11JkqTncsMNN4QANKlp1113bTbpH1HoUSpqSZxqgwU+Um2mjDsVsdSAnw9VRNUUK2JWFLV4Rd2n/ZW+qERv+agiLlX32x5hqQWVtla6Afj8Mfnq3HPPjcgoIWmgwVtvvRXbg56wfredsk29VrUJkyUiiHlttb5qHXpQ0J3AUuB9JViJ3ewMkCRJ0jV8dvqcHtpn53BFVkUm6hHVgvRf+WOTJMnI4f3334/0+owzzhj/33x51Iu0vfR6R2y//fYRndQftB6hHFY22mijIcbDyq4QqoqaiOIi6kQqWYWk5LWe0p6KaNxzzz0bU045ZYg9IpFAVEDlvBRMsQXYlnU08jfNyxdkUVg9WVkI6my88cbRvkr7LBCyIqHu9wXb0AOTtohcfWHPPvvs+KA0alUxll6uxGuSJEnSMxgusWoijHRbQYRChOO4445rjoFMkmTkptdV1psSpcm9MaVDq6wvyHyIZhK4+pbKjgwPop/+vxPJ9alRBCDhSfA5xskmmyyE44UXXhhR0oKesaryiUMV+SK9Mjae16tXr4iAiqy+9NJLEQGdeuqpowOAPqvWEV21beu4j/AWbS2Uhv48s7z0rhHrku2cfPLJsX/3Ee777LNP46qrrmr3HNsjbQBJkiTdyPBUbz3zzDNRMbvKKqtEz8T11luvmnPOOaN34l//+tfhrAlLkmRodKWyXv/ReeaZp5p44omrGWaYodpxxx2rTz75JB677777mtXyZXHfBx98UG200UbVdNNNV0000UTx/Msuu6zNdpdZZpmomt99992rKaaYolp22WWrl156KbYxaNCg5np6mJ5xxhnRG9Xx6pU600wzNSvzjzvuuOqiiy6Kzw63y3GU359//vlqq622iq4AqvNV7ls8rivAs88+G+vMOOOM0X3Aef7gBz+I43ZcP/nJT4Y4R/v77LPPqh/96EdR9W9d2xt33HFjH45lqqmmquaff/7Y1pprrhndBKzTHtkNIEmSpId3A1BdK6LTt2/fSNuxBfCHifaYNpMkyfDB4ylT0dFcepXulnp6vRWRxtNOOy1GlYps3nvvvRE5xBJLLBGRyoJop/tEJBdccMHoY8qrqZhJSlzhUx3bk5IXTZU+V8gkOiuaCoVJxrZKzc8000zxmWCqlSlS4Evdd999YzysqCUrgoimKnyFUZCqv+aaa+JzRUR15ZVXDm+riKiRquwDeq+Kkk4xxRRRqMUHy14gwuu2yCybBJyH4k/WJcdqHf5U10mhlf0aaVuiqM5BD1he1448qznBKkmSpBsZAcI4SUYI/fv3b0bCRLxE4/bee+/q888/r8YUSuSzo8lJQ5vq1B5XX311RBxbo7OlR2mhHokU1dTjdO21124TWV1ggQWG2P4mm2wS06hw6623VnPNNVf8vt1221UHH3xw/H7QQQdVM888c0R9bVdkU+SyPjWqV69ezXM/5JBDIqopyvnVV19VG2ywQUyVct8777xTffjhh7Gu6G7BeqKt3kee/+Mf/zjWGTBgQDw+cODA2N4xxxwTPVsLoq36szouzxPFdZ8oa0dkZDVJkqSHR1a1e9FmphX3ibwkyfCiWEdFts4SfIXmuB9yyCGj+rB6nGdVT1BeVddLNFZf0t/+9rfx+N133x0+0Omnnz78qCKL/KzFw9keZaKT5/CBui3CaB/PPPNMcz3R11b4PkVaFUs5luKf1ZJKOyiRTkVXIq187XPNNVdEcq3PdyriKVKpQLOOqKkos8jnpZdeGgVVNLXiLJFT0Vr7M5VKK6zll18+erHy5Hr/8LDarsIsKMrymPeTx0VV7dvvirgKirpEgDsjPatJkiTdyPAo4VlnnbW69957h7ifj2622WYbnk0mSUTE6pE8/PznP29G80Szdt111/AWmu8uGvbYY4811/3oo4+qjTfeOKYgiTqKrF144YXNx994441q/fXXjwiayORaa61Vvfrqq00ftqidGfYQuXN7ww03bD7/iCOOiH3W3+8LL7xw+B2nmWaaat99963+97//NR8f2vGWSKT/T45XlJC3sh5Z7aqXVDRT1NDi+Ysuumj4SHlKL7jggrhv8cUXj+Pwf7Q1svrrX/86bvOjPvXUUzGd7mc/+1ncd+qppzb3I4pqupTjFQnddtttI6prvYcffriaffbZIyrpWF2XMjHKT15R199Pt70OPKe2tdRSSzUnUpXIqsfcvv3225vXwm37fffdd+P69unTp01E2D5FRkWGvcZeF+8D+3BMtun8ttlmm3ic31XE13XxeotUu995ZGQ1SZJkNI6s8orxc7XSp0+fNlNlkuTbwDspisYjCb5L1eCi93yRKsJVtJeIHM+itkR6eGpvpBF9iaqJ4llXpFGvT5FA3k+RSV5Fzd9F8h544IFY3zr12/C7qCHMnTdViX9SxM6+NKs/8sgjm+sP7XhF/ni9zaPnjdQsf7/99mtzDbrqJdX43jlqhC8SqYepyChPqWOF6nr3n3TSSUNc69L2yvnxjPJ7OmaU6y/aev3110dbqsGDB0cmRRTX9kQjVfzzwzoWkU8+1KmmmiraS+GMM86Iav9NNtkkjvH000+Px53zgw8+GN0ARClLdwKR4NKrFWXgyC233BL+1TPPPDO6CLj2Xu/iR33xxRdjm3yuIrN6rzreQw89NHywWnWdd9558TqIsvIHX3bZZeHx5WXVxmqOOebo0K+aJEmSdDPDo4TNy77xxhuHuP+GG24IX1mSDG9kVWW26JdIl7enKBmP5qeffhoex0svvbS5/n//+9+IOKouhwruLbfcst1tX3LJJREt++abb5r3ffnllxFt+8Mf/tCM4qp2xx577BF+WVG2F154IfYlCnfnnXfG4wcccMAQ21MBL4rIh9mV4+U1Lf7OguhsZ55V0UX+UzPtRTRfeeWV2IZ9qaAXNSwz7bfffvvq4osvjkhzqbLvyLP6y1/+shmZdE3K434XZYaIrNfFudUjw14jEU6vnedcddVVsV1R3nnnnTeinJ67wgorVEcffXRcs759+0bkcp999onIs6jsnnvuGdHNwYMHh9fVtkRFRZMffPDBiJI6Hjhv19o5vvbaa/Eaui6OY6eddorr7ljtW/RcJNR+55577tjuFVdcEfd7zvLLLx/7LN5a17I1wt+KyG9rx4GMrCZJkoycyOpwiVV/YPxRYAVQ1GC555574r699tpreDaZJCFWV1xxxUhBE11ub7311vFYSTUTJnXWWWedpkC97bbbQswQQYQmAVT41a9+1RTC9YU4OvPMM2Md6W5iBqwH0s9Ey1lnnRXbImK0P8K6665bbbHFFm2OpQjF119/vUvHW/+9/oWvLlb93zr88MNDsJW0tWOebLLJIo3utnNecMEFq//85z/xnJNOOimEmvOVype6r2+zPbFaCpY8j4Bjp7B9afGCNlitX0b/+c9/xvMcn58EvG2sscYa1XzzzRfru99rWb6AlDZVRdxabFs7PCl+QrZYCLTF89O6nuM18zp7j7i/2B6IcwJ3pZVWinV9wfF6le2fe+658dlkH6WAz+J3z2GbaE98FptIK2kDSJIk6eE2AGm0RRddNIo4FEhYtJdR4HD00UeP+PBvMsYgnSxdLhWtrZK0tfR6V1h11VUbr7/+euOXv/xlFCB5f0otQ2GNdLrUbn3Rgs1ko5ICZyP4y1/+Ej+1ZnOfNDQLgAKf9ia3jUyOP/74GCOq3ZP2UCwH7AdGmEpfS2srMHKs/h/C+bM3SMNLnbMqsO0onIKfra2xpO1hqpMiJQVNd955Z6T1DRCAdlSzzjpru8epMEsbOyn4QYMGRQs7qXnFcm6zJ7AR7L777tEW6sADD4xiKS2qXG+v25xzzhnWBftjodAij+2ALWDnnXeOAi2vARsECwcOO+yw+KmIy+9lQIkJX6wCro1rxDbhOEoR2rbbbhutq2CqlvfZXXfdFcfr2rEQGDTQu3fvkfTKJkmSJF1lmMWqPzDGF/rQ94fMH7XrrrsufGrERfG3Jcm3hZhQ5U3YED+lv2eBR5MXUXV5oXgkf//738e8ezPioVqeKCJgiOH6widZJh3xSPKdmrREEBGrhGqpci8QVsRPmS0Px0ZYzTDDDF06Xtto9Z7qF1rH84lAwpOAn2WWWUJgDwv2wx9LiHW0n/Yg9Ah8QrNsh1gm/urH53VyDXlJXTNV+gQ2cer68oMSs7ZHjPpSe/jhh8eXC9fQOkU4+v3dd9+NDgQEp4p9zyWuX3311TgWnQaMUyXOCfPyunuu6+k18Zm09957x2vOR186mHjMvnhVTeJzvMWbyt9scW2MtNUJoXwBaCW7ASRJknQjwxqy5ceTXnv55Ze/TeQ3SbrUDUB1vVTy8ccfH5XqPJ/S888991ysLzWuC0DxG0qjSxGbciQVbZoSpO9V3au453/kedTTVLW+FG5Bal4amXe0vN/tw3133HFHc7233norUvA8rjyt9ssbystYGNrxsgtId7MovPjii+Gz5Musp+x5SaW42RB4TlWxS3239j+1rzoet79yDnyt0t2sCs6fbaC9Pqv125Byl753vq6hSv5+/fpF9wQ2IP1K7cei2wEP6e9+97tYhwWBpYDNgp1hs802i32UynzXVPq99EF1Hny3PLAec131Td18883jtn3zndoGz7xODMVK4LZer8XnbL1yvKwMZb9lahU7gZ88tSwVHr/uuutiKl/pnNAZaQNIkiTpwTYAUQmpwK7OIU+Sb4N+l6YL6c8pqqbHqDSwSOlf//rXqC4XDYVI5v777x/V30svvXRUnEtrQ/pexbkqdxX4ooTSv6rt69OHpNdFBEsU1fvdtqSXVbsXRPtuu+22iOSJeO6www6xPVHgwjHHHNPp8ToW3QJMo7INE6FabTS257m6CDimaaaZprHOOusM0zV0DtLpKt1FN3UdKNHSoSElzkJgfdfQ8auiZy0wfYrV4je/+U2sK0opKqoS/+abb47JWaZjbb/99mFncL1EO6XXaWPXVHZGF5GCyLQIt0ipinzr6Gggte+1cRtuew11AIBjsW/X1DpbbrllWCNEclX3F4qNw3523XXXOKZ111037vM6OWbRZB0U7L+j7iY5wSpJkqT7iMHXw/okf4iIBy1j+MqSJBmz2WKLLSJVT3gXLr/88saee+4ZTfcJzrfeeqvZQkvanIj0BeDGG2+M+4lx9gv2jQKf6h577BFLgRglvu3LFwBWBC2seHEXWGCBsBCwTfhCze/suAhkYpqwJmJZIvhrCXeWAoKcfYNFgcB1H2FONLeHUbf1cbf//ve/m+eUwjVJkqRr+OxkpRraZ+dwFVhtvvnmzYgST5fijPqSJEmiIEt0W39VH0L8p3yg+uAqYCImeUqHB5HVOr5z6/mqF22ZPmXfPMr2JbosGiqi6ndReN57/WsL7uO9F1UVkRdhL5O9WknPapIkSffR+UzBDqhHPpIkSYZm4ZDCZx/QeUEq3nADEVeCUYRywIABUWwlSurnscce27Ri+GIsanrxxRc3hyboWEBIlgI2X5JFXBWvlQiuFL7n6WpA3Cp6+8UvftEUoH7qIlAGPzgeC0RioahLdLcVdhNR49bIapIkSdJDxGqZSJMkSYLSEqoV4tLCJqDdXbEJuC0Vz3NK0GoVViKjO+20U3hlpfOl421biysC9vzzz4/JYoThCSecEFFNdiQpfNPOVPl7Xt2TWyr6F1tssZhSVVrsibzyxz700EPx+IYbbhiWBFYCrc50CShdCpIkSZLRTKwObaSqIockSZL2kLLXB7dESLWV8plCuJbCTb5S95eCM22/jFdlPYL1+VX1dxYthVZUeqV6Xh0FoQSrKKnRuiK0dS+qFlogqnlo/TTqlYDuyJPPBlB6vCZJkiQ9UKxKi5Wq3PboyOeVJMmYS+nDSnhaREMhba8Aq/7ZITUvgirqWQTr6quvHp0cCEXRU6JXEVQZEACWgscffzwKpspnlJ67hk0oDBVNJXp1VxBlZQ1YbrnlmttXXOXYoIe0fbVH2gCSJEm6j+HKcT355JONJ554ormY/qLtjj84Gm8nSfLt4dmsV8GP7hCFUuuKqlTraxG1wQYbxGMKnTx20kknxW3Tr8okLlOrFEZdddVVIV7ZBqTpixiVui8TyRRwqSolVkF4HnzwwWEVMKwAhx56aGy3TOYqWM9nmS4GxZvPWpAkSZKMYqoRyC233BKNvZPku44m+P77aILfyk477RSPlab8Q8NwgvoggMKHH35Y/fvf/656Io7XMmjQoCGa5ffq1Ssec14dDXwot1966aVYd7XVVov7DSUoH0tbb711td1221UXXXRRNemkk8Z9AwcOjKb/Tz/9dKz3ox/9qDr88MOb291///1j0AA8z7qXXXZZ3DawYc4554znzTfffHGfYQ5u33rrrc1tXHjhhXHfOeec0+H521a5BvUlhwIkSZL0gKEAnaGC1jjJJBkTkPbV4kiz/YIhA8aLjgjftgp3EcWefP6t/lD9T+tp+aEhG7PSSitFc/7TTjstGvtD+p0VQHGVoQKipbYrfa+yX6eBTTbZJDoMnHPOOeFHFRUVQdWrtVgCrGtYg+eyE+ititIxoFzf3/3ud+GBNRTgxBNPHOpxswE4prIYZ5skSZKMHIZLrPJn1Rcf1v4ImLajmCFJxgRMliLYzKEv+J1QVVFeIJp222236Pmp16jiofKlTrV78UyabCW1rVK+PRsArzjBtdVWW4XIsp9zzz23zTFJWxNr9iN9rvreNqXICyruFRURcL17947JTQqdCnfccUcco7ZPfKNrrLFG9B9trytIq1i/8MIL23QLsW/H8Kc//Smq/bWtmmWWWcJKVHqlsgAQ5s7VJLCSkleEZRLV4YcfHufLAmBilnNzzZyn7emLSvTynBoAYLpY+eJQOOigg2Lb9g1FVlCQBddHMRXrgXMfGjnBKkmSpIeLVX/E/GEtiz80+hvqjyiykSQ9CeKPaCpCqM7OO+/cRiAOK4Sj6CIfJPFErBFYdfbZZ58Yqyp6x+P94x//OCKEooLErsdg9Kh2TqeeemqH+xP1I0KJPS2edtxxx3gefHFcc801ox2T/RxxxBGNfffdt83ziTmtm4hphUiEqWhm8Y7is88+i+Ihj99zzz3RvslI0tZG/DynBHQ5fhX6RtoSv61oC6XfKWErCqq/KZGq+n7gwIGxf+6CIiZFOO1PAZVzcG6GC3ieQi3ClzB3v0ItXwbKOTh/7L777tFhwHaIcpFbz0MRtCWyKiJM3P75z39utqvSaaAjfAFp/dKeJEmSjCSq4eD+++9vszz44IPVCy+8UP3vf/8bns0lyUiFP/KHP/xh+B7/85//NO///PPPq8kmm6yaccYZu+wvbfVcvvvuu9UEE0xQ7b777uGHnHDCCav3338/HrPOp59+Wo033njVpZde2nzuf//732q66aarjjvuuE49q/zftlvo06dPtemmmzZvf/PNN9XUU09dnXXWWXHbzymmmCLOq3DeeefFtp988sm4fcQRR1Qrr7xym/28+eabsQ7/aHs4H48/88wzzfvc5i895ZRTquWWWy7uO+yww6p11103zqN4Vst69efxks4///zV97///WqttdaqJppoomq33XarxhlnnLh+5WPJ9eM53XnnnauHHnqoGnfccat99tknbuOf//xnNfHEE1crrLBCXM8pp5xyiP2V8994443j/G6//fa4veeeezYfH2ussar111+/evnll8N3P/3008c6r776aoevf3pWkyRJus+zOkILrJKkJ1KE5TzzzFP9/ve/b95PQCq0KcKyFAjtuuuu1VRTTRUidMkll6wee+yx5nOKAFtxxRVD/BKiCy644BCiZYEFFohtKghye/LJJw9xRtg99dRT1TrrrFNtueWWIXoUCVmHoP7BD35QbbjhhlFYVcTq1VdfHcduHcKOOCOC4fgJvjnmmCPEHvF2xhlnNI/3tttui+edcMIJ1bLLLhvijziznUkmmaS5WEdhlPtnnXXWavHFF69mnnnmOOby+JprrlntvffecS5uO84PPvggBObf/va3aoYZZqjmmmuuavzxx4/Hjz/++KZ4vOKKK6olllgiblvfcVjv7bffjvtWX3316sc//nHz+uGkk06qevfuHUu533N32GGH5vm5Zo7RY86rPXHsNXJefrdfP0888cR4nHD22Pe+973mus5haGLV+8SHa1mK4E+xmiRJ0oMKrHjYdt1118aKK64YizRce762JOkplJR9YVhT9nV4MFlftFjy3udZHG+88aKnp1R+STP/6le/ip+25zl8rnyXmtMXeC7B/ynFrbDomGOOaabkNb137LapbZNeo/+nw/4vrS9lbmLT5ptvHml0/kz7q/Ob3/wmjkXaXWqcfUean1eTFUCq3b75WXnQWXr22muvKFqyQApdv9Jy+8orr4xrxNOqiMno1GmmmaaZalf4BH52xVCrrbZa08rANuEcynXSX9W2S0qePYMVQXspftTyunmu8yzrKWxii2CFMNEKrAJ1vvrqq3iOllnluSwMkPq3+CzzWjo3xVtob8xqkiRJ0v0Ml1jlI/OH2szu+eabLxYf8nPPPXezYCFJehp6eyrSef3112MxV959BcKQ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JSNV64sI5fBwwAEHRDET4arXal1MSssTpB9//HEMEzB6VdpdJwHRV4VULAfEql6pxriuvvrq8VyWAQLWyFZ2ACi0InLL9CoiWdGW1lWip8SuY/C8tddeOwQrimhtj/SsJkmSdB8pVpMk6RKioNL2xJ+0ut8JyAJhyTNa7wwgdd/K73//+8bJJ5/cuP7662OClYp8lEIqdoGNN9648cILL0SU1TYUOymU2mSTTZqiVFpf9FPz/9IiyzAB0Vitr84+++y4z/NOOOGE8K4Svca5ap9F8NYRccXyyy8fUdwinpMkSZJRS4rVJElGCKr4W1tMib7WufnmmxubbbZZrKOvaXtWAh5VAnT22WePdYhiYpVdQIQUJk7xluqjKiKqVRUGDBgQUVaPlft23333sBHoy8qGoAhM4VcdnQOIZOy6665hITC8oCPSBpAkSdJ9pFhNkmSEUDoBnHrqqeEd3WabbRpXXHFFRFxV/BOu0vjaREnzE6oiqNpIYcstt4yfBKh0vMdFSBVClSp9EU+YUiXySnwq2irFVPanGMtUq9IBQGT1sMMOa06zWnLJJaMg66yzzopjLCKazQGln6zIb0ekDSBJkqT7SLGaJC0QVq2Rt9GBEdmgf3goRU58rEaomj610EILhVVAyl1VPn8oEbjEEks03n333cZ5553XFKMLL7xw/JTGN6XqiSeeiOiqKKfzqiMyq8XVww8/HOd72mmnxf0XXXRRY6655oq+qsUyIFJqmhZBWscxEbrQc7W0ujrmmGPi51JLLTWSr1iSJEnSJaok+Y7Qv3//au211x7i/vvuu09euvr444+7tJ333nuv+uyzz0b6sV199dXVBBNMUJ1wwgkjZB9ffvll9c4771TffPNNNTJxLuOMM041ySSTtFkmnHDC5nV2rn5/8skn4zmvvvpq3J544omb2+nTp0+16aabNl+fF198MX7OMssszXUGDRoU980+++xx+6KLLorbe+yxR3OdF154Ie6zPP7449UKK6xQHX300fHYdNNNVx111FHVJZdcUk077bRx38ILL9zcRjkux1mO47XXXoufbnfEIYcc0txnffnXv/41Eq54kiTJdxOfmV357MzIapK0oFK8pJVHFqKPIn9S0XvttdcI2abIoOr61ijkqOgMoO1UeyhuKul4FAsApp566vj56quvRjGUIigTpVCipAX9VQtzzDFHcwiAgq0nn3wy0v5sBHynfKyGC6jud62Lj1bUt7PG/52RNoAkSZLuI8VqMsZBAEnx8kAqjNltt93aNIBvtQEQf4QYryURO+uss0Z7pTp6gSoUIpD0EFVE1FGBjpZJUtP8lcWnCcJVsRDRJf2tUX6doR1HezYAaXbnaH3PO+mkk5qFUOAt5Q91zI5dKv7uu+9us1/X4+ijjw7BZ8qT6v33338/Cp/KYhrUIYccEusvu+yybSZNdYbm/wUdAsCXqrk/EUoUYs0114wq/e233z5un3HGGY3f/e53zfP1k6BlB3AsmvY71g022CBaXenhal9aVCm2Ar+qFlogcL0mdQFNWHdETrBKkiTpPlKsJmMUxJmJR/369Ws8/fTTjSuvvDLE6y677NLp80TqCB/PWW211UIYEUUglgipBRZYoPH4449HdI8f0/qt7LvvvhE15MskHgt8nKrWRf4IX6KMkL3vvvu6fByt8HPusMMOsV3RxJVWWilEYJ1PP/00tnPPPfeEYHNtCEPV93VOPPHEiERaR1GTFlUvvfRScxsmTYlugugjZttjlllmaU6SKhC32mGVFlb8ptpOEe0KoaBpv56qRWir3Bcxhb6oXgPH4EsHcW306rXXXtt47rnnQnT+4x//iCjqdNNN17jxxhub4ljvVVFgx+w1BFFOMF911VWNjsgJVkmSJN1ItxkTkmQk0xUv5dZbb11tt912bZ43cODAauyxx64+//zzppfy5JNPbj7uuQceeGDz9qeffhr33X777XH7iCOOqFZeeeU223zzzTdjnZdeeql5bOOPP37cd8899wxx7EsssUS17bbbtrlv/fXXr1ZbbbUuH0erN3fDDTesVl999Tbb3GSTTapJJ5200+s499xzV6effvoQ3tLCj370o7heZ511Vtw+55xzqimmmKI67rjjmp7P/fffP37fcccd4xrw5bp92GGHtdmu6/zFF1+El/WPf/xjrHP99dfH416rNddcM+7bYostqskmm6xaYIEFqvHGG69aZJFF4j6P8aAutthizdf2jjvuqMYdd9zq0EMPrS6++OJqrLHGqn73u99VAwYMiH2us846Q+zH8956661Y123H4/fynmglPatJkiTd51n9v2HcSfIdgZdSOr2O9keqyyEiKCp56aWXNh+nA1Wc80rOOeec7W637q3UHF/a97333mtuUwRU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Y489olNARzhmS5IkSTLyychq0uMQoSM+CBKCQIqVt/Gee+4Z1YcWApDgqUfmCiYeqTwfFaiw58lUMc+f6hoqXpKary/S2wXRzzI9CnyphFqJfD788MPR/olPVTrca0EoFkoxlzZQxCBhC9fHutLx7hOtFT0tBVAF/lneVJHcM888s3m/VDxLAohXVgVCVSGUa0yg3nnnnfFTEZZt893COvytdYhZvlb9Wkt0V7RXpLVuiXAeBK1tXHvttZ12VsgJVkmSJN1HitWkR8FzqSqc+NIkngBT/CNKx8fYHqJhYxKEEjEqWqk6XwrbuFGtqzbffPPGiiuuGBFQRUhEnWuqWGnAgAGR6i6ogBc9ZRsYOHBgCFPV8MQapP8vueSSiNhK0Zv0VNLy7SFCWUfRlIWgXGutteI+3tkC36kvJPyfBGkR0EQzcQk2BedCQDsu56GnrGMhxr32xXcLtoW67xaujSIv0Vve3LrQLvzqV7+KaCurA4+ujgGt51MnPatJkiTdSJUkPYhVV121mn766atPP/10iMc+/vjj+Olte+aZZ1ZrrrlmNfHEE1eHHHJI9dVXX1VbbbVVNdNMM1UTTjhhNdtss1WnnHJKm+f379+/Wnvttavjjz++mmaaaapevXpVO+20U/Xf//63uc4XX3xR7bXXXtV0000X215kkUWq++67r/m43+2/HEudPn36VCeffHL8vuWWW1arr756m8ftZ6qppqrOP//8uL3MMstUu+yyS7X77rtXk002WTX11FNX5557bpz7FltsUX3ve9+rfvSjH1W33XZbcxubb7557L8s44wzTpzrhRdeWH399dfN81xttdWqJZdcshp77LFjPdv6xS9+Ub3xxhuxzjrrrFNNNNFE1QQTTBDr2I7r+dFHH7U5T9sea6yxYvG761LOsbwWk046aWx/jTXWiNvWveiii5rr3HzzzfGaemzxxRdvHvsPfvCDePyaa66pFl100eb99rHQQgvFduabb75Y54knnqjmnXfeeNxxX3XVVfG416h+LDPOOGP8vP/++6vnnnsufh933HHj/OrXbcopp4zn9OvXL27fc889zWvXt2/fuO+KK67o8H3qffKvf/2rubz55pvxHL8nSZIkXcNnZlc+OzOymvQYpIVFUUVQS1uijvyW0rlStiKvqsOlmhX08B4q8jH9SP9N0bs6KsH5H/00EUmE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nYfX5957720KTtd04YUXjnPmQ7IP50Ms1q+h7cFrrWJfURMxacSu18L1cgx6rZp6xQ5QWlK1Rtwd59Zbbx0FUvYv9e9a+l0UlHAu51LaYNmvKVowtME1kfrXXou3tazXHjluNUmSpPtIsZqMFp7HVoiQ5ZdfPnyIGsPfcccdIWSK+CgQX0QbAXLcccdFalmVN4gRYlfBj32JtBk9WsZtgoDji7zkkktCAKkc16C+YCpS//79o5jokUceCSGqN6j764juOTYiy+Ma0YsUgtAh8rRQEpUk3Aj14UXaXXr7ueeei/MnJOvtnsp5WeeKK66IayfCSBwSzRbnq2JfuryOaVOa66usly73BYF4Na7UlwMpfLeJvWLpIEA17PdTGp/410KKJ7X4T70WJSW/8cYbh5j12tuOVlS+yLAWuD5S/lL55frzuHq+7RG22GWXXeK6+gLAQsAe4PrXo/feY0cffXSsb9v6utq+95XjZEtIkiRJegC6ASTJqKZ///7VOOOMU00yySSxeGtOO+201Z/+9Kd4/NVXX437nnzyybh9xBFHVCuvvHKbbbz55puxzksvvRS3l1lmmapv375t1ll44YWrfffdN37/wx/+UI099tjN9Vu56KKLYnt//etfm/edccYZVe/evTs8j6+//rr6/ve/X918883N+2zjwAMPbN7+9NNP477bb789bu+///7VXHPN1WY7jtE6H3/8cdy+77774na5PvVlrLHGqk4++eQOj+nqq6+upphiik7Pa/vtt68mnnji6pNPPmne97Of/SzuL/Tp06fadNNNm7ffeeed2M5BBx0Ur98qq6xS3XLLLXHfAw88UO20005xbG4/88wz1UQTTRTXbvfdd68mnXTSaoYZZojF677XXntVO+64Y6x76623VrPNNls14YQTVmeeeWZ1zjnnVN/73vfiXL3+77//fnXaaafFurPPPnu11FJLxfvk0UcfrRZccMF43bHzzjtXSy65ZDXuuONWhx56aLXWWmtVyy+/fHX55ZdXAwYMiHW23Xbb2M51113XPK8vv/wy7nNMHXHIIYfEOq3Lv/71rw6fkyRJkrTFZ2ZXPjtHu8iq6I1ei50hmlNvodPVAh89F78NXdlGV45/RDEizqmneB5bUQku7VwKeizFN6iyuzDffPM1f5d21q6oeBHtRzRO9K0jpMhFCwuigCK45br6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SZL0WFKsJkmSJEmSJD2WFKtJkiTfgjPOOCN6yE444YTR6/ixxx5rjEkYzavvrz62ij5bJ4jx1uu5PO2008bQBeOzTbCro0+0gSta4xj6YQBFGQxS0DNXn2bX2USd4447rjG6YiDHwgsvHL2SDffQs1uP4DqGZhjWYQCIgSD6GxtvXEefaMMrjCa2HQNDTLCro4+xXs+quQ3EaG+K3OiCftDzzTdfs0G9Ps31nt95zYaOyYr+n+6xxx6j13XTDSBJkiQZdq644opq/PHHry688MLqueeeq7bddttqsskmq959991qTOG2226rBgwYUF133XUqPqvrr7++zePHHHNMNemkk1Y33HBD9ec//7laa621qplnnrn6/PPPm+usssoq1fzzz1898sgj1cCBA6sf//jH1S9+8Yvm4//617+q3r17V5tsskn17LPPVpdffnk10UQTVeecc041OvKzn/2suuiii+JcnnrqqWq11VarZpxxxurTTz9trrPDDjtUP/zhD6t77rmnevzxx6vFFlusWmKJJZqPf/XVV9U888xTrbjiitWTTz4Zr8OUU05Z7b///s11XnnllWriiSeu9txzz+r555+vTj/99Gqcccap7rjjjmp05KabbqpuvfXW6uWXX65eeuml6oADDqjGG2+8uI7Ia9Y5jz32WDXTTDNV8803X7X77rs37x8drluK1SRJkuFkkUUWqXbeeefm7a+//rqabrrpql//+tfVmEirWP3mm2+qaaaZpjr++OOb9/3zn/+sJphgghCc8IfN8wYPHtxc5/bbb6/GGmus6u23347bZ555ZjX55JNXX375ZXOdfffdt5p99tmr7wLvvfdeXIMHHnigeY2IsKuvvrq5zgsvvBDrDBo0KG4TDGOPPXb1j3/8o7nOWWedVf3gBz9oXqd99tmnmnvuudvsa8MNNwyx/F3B++L888/PazYUPvnkk2rWWWet7rrrrmqZZZZpitXR5bqlDSBJkmQ4MMrWyGBp7YJxtG4PGjRolB5bT8GYXUNL6tfINBx2iXKN/JT6X2ihhZrrWN+1fPTRR5vrGBs8/vjjN9cx7lfq/OOPP26M7pTRx7169Yqf3ldG/9av2xxzzNGYccYZ21y3eeedt9G7d+8218TEoeeee665Tn0bZZ3vwvvz66+/jqE4n332WdgB8pp1jjS/NH7ruY0u1y37rCZJkgwHH3zwQfzBrH+Aw+0XX3xxlB1XT4JQRXvXqDzmJw9cnXHHHTeEW32dmWeeeYhtlMcmn3zyxujKN998E/7BJZdcsjHPPPM0z4kwJ+I7u27tXdfyWGfrEBmff/55eIhHN5555pkQp3yW/JXXX399Y6655mo89dRTec06gKh/4oknGoMHDx7isdHlvZZiNUmSJElGESJezz77bOOhhx4a1YcyWjD77LOHMBWNvuaaaxr9+/dvPPDAA6P6sHosb775ZmP33Xdv3HXXXVGcOLqSNoAkSZLhwKjjccYZZ4iqWbenmWaaUXZcPYlyHTq7Rn6+9957bR5XZaxDQH2d9rZR38foyC677NK45ZZbGvfdd19jhhlmaN7vnNhM/vnPf3Z63YZ2TTpaRyX96BghhCigSvMFF1wwuirMP//8MXI8r1n7SPP7/6VKX8bCQtyfdtpp8bvo5+hw3VKsJkmSDOcfTX8w77nnnjYpXbelKZNGpO79EatfI2lBXtRyjfz0h9If1cK9994b15K3tayjRRZvXUGkSJRtdLQAqEUjVKWwnWurxcH7arzxxmtz3fhztQ+qXzcp8brQd02IA2nxsk59G2Wd79L70/vkyy+/zGvWASussEKcs2h0WfjDtYorv48W122ElGklSZKMoa2rVLb/9re/jar27bbbLlpX1atmv+uoMtbOxuJPykknnRS/v/76683WVa7JjTfeWD399NPV2muv3W7rqgUWWKB69NFHq4ceeiiqluutq1Qsa1212WabRZsi112bnNG1ddWOO+4Y7bzuv//+6p133mku//nPf9q0E9LO6t577412Qosvvngsre2EVl555Wh/pUXQVFNN1W47ob333jsqvM8444zRug3TfvvtFx0TXn311Xgvua1rxJ133hmP5zXrGvVuAKPLdUuxmiRJ8i3QT9AHvX6rWlnpFTomcd9994VIbV369+/fbF910EEHhdgk7FdYYYXokVnnww8/DHH6ve99L9rhbLnlliGC6+jR2rdv39jG9NNPHyJ4dKW962XRe7VAzO+0007RmokIWHfddUPQ1nnttdeqVVddNXrO6nu51157Vf/73/+GeH1+8pOfxPtzlllmabOP0Y2tttqq6tOnT5wLseS9VIQq8poNn1gdHa7bWP4ZMTHaJEmSJEmSJBmxpGc1SZIkSZIk6bGkWE2SJEmSJEl6LClWkyRJkiRJkh5LitUkSZIkSZKkx5JiNUmSJEmSJOmxpFhNkiRJkiRJeiwpVpMkSZIkSZIeS4rVJEmSJEmSpMeSYjVJkiRJkiTpsaRYTZIkSZIkSXosKVaTJEmSJEmSHkuK1SRJkiRJkqTRU/n/AKTZRTIizc3RAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "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(figsize=(6 * 72 / 100, 4 * 72 / 100)));" ] }, { "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.00150s] (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.86 s\n", "Wall time: 4.88 s\n" ] }, { "data": { "text/plain": [ "'ced50816870c5da047d4533187c30224786da02a2b7372140545a5a73cb98012'" ] }, "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.13.5" } }, "nbformat": 4, "nbformat_minor": 4 }