Last active
November 3, 2024 11:04
-
-
Save khaeru/8c4ca2147e8467853121332629aed661 to your computer and use it in GitHub Desktop.
Discoverable Data for IPCC AR7 WGIII
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "b31cc161-e5ab-4aa4-a6e0-aee56590f80f", | |
"metadata": {}, | |
"source": [ | |
"# Discoverable data for IPCC AR7 WGIII\n", | |
"\n", | |
"This notebook demonstrates a possible alternative to centralized databases for collecting data used in assessments. The demo is meant to inform planning for, in particular, transportation and other “demand-side” data in the IPCC Seventh Assessment Report (AR7), and more specifically for a probable Working Group III (WGIII) chapter on transportation or mobility. (In IPCC AR6, this was WGIII Chapter 10.)\n", | |
"\n", | |
"The demo is given first (‘Step 1’ to ‘Step 3’) followed by some elaboration and discussion.\n", | |
"\n", | |
"## Step 1: Identify all data sets that may be relevant\n", | |
"\n", | |
"We begin with a query of the Zenodo API for all records that have a given keyword in their metadata.\n", | |
"For the purposes of this demo, we use the keyword ``x-ipcc-ar7-wgiii-data-demo`` which (at the time of writing) is used on only [one record](https://doi.org/10.5281/zenodo.14025749)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "4035259a-3f2b-48d1-af22-724a10d97c08", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import requests\n", | |
"\n", | |
"response = requests.get(\n", | |
" \"https://zenodo.org/api/records\",\n", | |
" params={\"q\": 'keywords:\"x-ipcc-ar7-wgiii-data-demo\"'},\n", | |
")\n", | |
"\n", | |
"info = response.json()[\"hits\"]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "8085e310-533e-44a2-8f4d-e005309a5a94", | |
"metadata": {}, | |
"source": [ | |
"We show some information about the query results (‘hits’):" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "03e10d91-4e86-4a06-a53c-98147eaf44fe", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Total number of records: 1\n", | |
"Number of records in the API response: 1\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\n", | |
" f\"Total number of records: {info['total']}\",\n", | |
" f\"Number of records in the API response: {len(info['hits'])}\",\n", | |
" sep=\"\\n\",\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "ba6af2ce-f671-46de-9bcb-2140e5f37a75", | |
"metadata": {}, | |
"source": [ | |
"Each of the hit(s) for the query contains its complete Zenodo metadata:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "8e09e82f-3180-4942-8a52-15e6b7882bc8", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'title': 'Demonstration record for discoverable IPCC WGIII data',\n", | |
" 'doi': '10.5281/zenodo.14026028',\n", | |
" 'publication_date': '2024-11-01',\n", | |
" 'description': '<p>This is a record used to demonstrate the concept of discoverable data for IPCC AR7 WGIII.</p>',\n", | |
" 'access_right': 'open',\n", | |
" 'creators': [{'name': 'Kishimoto, Paul Natsuo',\n", | |
" 'affiliation': None,\n", | |
" 'orcid': '0000-0002-8578-753X'}],\n", | |
" 'contributors': [{'name': 'Kishimoto, Paul Natsuo',\n", | |
" 'affiliation': None,\n", | |
" 'type': 'ContactPerson'}],\n", | |
" 'keywords': ['x-ipcc-ar7-wgiii-data-demo'],\n", | |
" 'related_identifiers': [{'identifier': '10.5281/zenodo.10148348',\n", | |
" 'relation': 'isDerivedFrom',\n", | |
" 'resource_type': 'dataset',\n", | |
" 'scheme': 'doi'}],\n", | |
" 'dates': [{'type': 'created'}],\n", | |
" 'version': '1.0.1',\n", | |
" 'resource_type': {'title': 'Dataset', 'type': 'dataset'},\n", | |
" 'license': {'id': 'cc-by-4.0'},\n", | |
" 'relations': {'version': [{'index': 1,\n", | |
" 'is_last': True,\n", | |
" 'parent': {'pid_type': 'recid', 'pid_value': '14025749'}}]}}" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"record = info[\"hits\"][0]\n", | |
"record[\"metadata\"]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "aff5b14b-a831-444e-8946-b4b9df34ed30", | |
"metadata": {}, | |
"source": [ | |
"## Step 2: Fetch expected files from matching records\n", | |
"\n", | |
"We can use the API directly or another library to fetch the **files** associated with each record.\n", | |
"\n", | |
"We expect that every record using this keyword will have two files named ``structure.xml`` and ``data.xml``." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "65ec324c-a31d-42f3-bbcc-8bcd207d1e92", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'structure.xml': '/home/khaeru/.cache/pooch/structure.xml',\n", | |
" 'data.xml': '/home/khaeru/.cache/pooch/data.xml'}" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"import pooch\n", | |
"\n", | |
"path = {}\n", | |
"\n", | |
"# Only download files with these names\n", | |
"names = (\"data.xml\", \"structure.xml\")\n", | |
"\n", | |
"for file_info in record[\"files\"]:\n", | |
" name = file_info[\"key\"]\n", | |
" if name not in names:\n", | |
" continue\n", | |
" \n", | |
" # Download the file; verify its contents\n", | |
" path[name] = pooch.retrieve(\n", | |
" url=file_info[\"links\"][\"self\"],\n", | |
" known_hash=file_info[\"checksum\"],\n", | |
" fname=name,\n", | |
" )\n", | |
"\n", | |
"# Show the paths\n", | |
"path" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "041fc67f-74d3-4ab2-ac83-0cd9233b0048", | |
"metadata": {}, | |
"source": [ | |
"These files are in the ISO-standard [**Structural Data and Metadata eXchange (SDMX)**](https://sdmx.org) format, and can be read with free software:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "694352c8-f65a-4b7a-9174-5def1cc05804", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import sdmx\n", | |
"\n", | |
"structure_message = sdmx.read_sdmx(path[\"structure.xml\"])\n", | |
"data_message = sdmx.read_sdmx(\n", | |
" path[\"data.xml\"],\n", | |
" structure=structure_message.structure[\"REG\"],\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "c0496dd1-f198-40a4-bb89-50919e85e65a", | |
"metadata": {}, | |
"source": [ | |
"## Step 3: Inspect and assess data and their structure\n", | |
"\n", | |
"These files contain SDMX ‘messages’ with, respectively:\n", | |
"- ``structure.xml`` **structural metadata**: information about the structure of data.\n", | |
"- ``data.xml`` actual **data**, that is, *observations* with keys and values that conform to the given structure.\n", | |
"\n", | |
"We show some information about these SDMX messages and their contents:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "796735c9-3299-4810-a4de-6ff5c7dc3d06", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<sdmx.StructureMessage>\n", | |
" <Header>\n", | |
" source: \n", | |
" test: False\n", | |
" Codelist (3): SEGMENT POWERTRAIN AREA\n", | |
" ConceptScheme (1): CONCEPTS\n", | |
" DataflowDefinition (4): SEC WT FP REG\n", | |
" AgencyScheme (1): AGENCIES\n", | |
" DataStructureDefinition (4): SEC WT FP REG\n", | |
"\n", | |
"<sdmx.DataMessage>\n", | |
" <Header>\n", | |
" source: \n", | |
" test: False\n", | |
" DataSet (1)\n", | |
" dataflow: <DataflowDefinition (missing id)>\n", | |
"\n", | |
"1 data set(s)\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\n", | |
" repr(structure_message),\n", | |
" repr(data_message),\n", | |
" f\"{len(data_message.data)} data set(s)\",\n", | |
" sep=\"\\n\\n\",\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "b2c2220f-d005-4078-98e2-8cc2850963c2", | |
"metadata": {}, | |
"source": [ | |
"We can inspect the structural information about this one *data set* to decide both **whether**, and **how**, we would like to use it in an assessment workflow—for instance, to perform calculations or prepare figures.\n", | |
"\n", | |
"First we access the data set and its *data structure definition (DSD)* (from ``structure.xml``):" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "266fd1ed-5098-4340-83f3-14a69b582e62", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<DataStructureDefinition GFEI_2023:REG(1.0)>\n", | |
"\n", | |
"AREA SEGMENT POWERTRAIN YEAR\n", | |
"ARE large suv ev 2022 170.0\n", | |
" hv 2022 300.0\n", | |
" ice 2018 63028.0\n", | |
" 2019 68909.0\n", | |
" 2020 42501.0\n", | |
"Name: value, dtype: float64\n" | |
] | |
} | |
], | |
"source": [ | |
"data_set = data_message.data[0]\n", | |
"dsd = data_set.structured_by\n", | |
"print(\n", | |
" repr(dsd),\n", | |
" sdmx.to_pandas(data_set).head(),\n", | |
" sep=\"\\n\\n\",\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "f0b3341a-ddde-46e0-9d0a-59bb2560f7ce", | |
"metadata": {}, | |
"source": [ | |
"Like most SDMX artefacts, this is identified by a short ID (``REG``), the ID of its maintainer (``GFEI_2023``), and a version (``1.0``).\n", | |
"\n", | |
"We can see *what is measured* by the observations in this (in SDMX terms: the concept identity for the primary measure)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "ba6bc4ff-6921-406b-b935-3913ed277d8e", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<Concept REG: Registrations>" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"dsd.measures[0].concept_identity" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "5cbe616b-7310-4943-9c5a-3fcf78276e29", | |
"metadata": {}, | |
"source": [ | |
"This means each of the quantitative values above is the number of registrations (of certain types of vehicles).\n", | |
"\n", | |
"We can look at the number, IDs, and representation of each of the dimensions that these data have:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "d15a170d-0e71-4cfb-8403-c7226519836b", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1. AREA: <Codelist GFEI_2023:AREA(1.0) (68 items)>\n", | |
"2. SEGMENT: <Codelist GFEI_2023:SEGMENT(1.0) (7 items)>\n", | |
"3. POWERTRAIN: <Codelist GFEI_2023:POWERTRAIN(1.0) (7 items)>\n", | |
"4. YEAR: None\n" | |
] | |
} | |
], | |
"source": [ | |
"for i, dim in enumerate(dsd.dimensions, start=1):\n", | |
" # Representation of the dimension\n", | |
" rep = getattr(dim.local_representation, \"enumerated\", None)\n", | |
" print(f\"{i}. {dim.id}: {rep!r}\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "16b39639-490b-4444-9f24-5e09d8223441", | |
"metadata": {}, | |
"source": [ | |
"For instance, we see that the data have a dimension ``POWERTRAIN``; each individual observation is labelled with one of 7 values from a separate *code list* that has the same ID.\n", | |
"\n", | |
"We return to the structural metadata to learn about the *scope* and *resolution* along this dimension, along with other information about the *data flow* (collection of 1 or more data sets with similar structure) to which this data set belongs:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "9da4d624-be0e-4d6b-99e2-100a1e7edfb2", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<Codelist GFEI_2023:POWERTRAIN(1.0) (7 items)>\n", | |
"\n", | |
"<Code ev: Battery electric vehicle>\n", | |
"<Code hv: Hybrid vehicle>\n", | |
"<Code ice: Internal combusion engine vehicle>\n", | |
"<Code phev: Plug-in hybrid vehicle>\n", | |
"<Code fcv: Fuel cell vehicle>\n", | |
"<Code mhv: Mild-hybrid vehicle>\n", | |
"<Code unclassified: unclassified>\n", | |
"\n", | |
"This data contains information on the attributes and fuel economy of newly-sold light-duty vehicles in major automotive markets, as used in the report “Trends in the global vehicle fleet 2023: managing the SUV shift and the EV transition” (https://doi.org/10.7922/G2HM56SV).\n", | |
"\n", | |
"The report is the 2023 installment of the Global Fuel Economy Initiative (https://globalfueleconomy.org) which, among other things, tracks progress in the efficiency of the global vehicle fleet.\n", | |
"\n", | |
"The data have dimensions AREA, SEGMENT, POWERTRAIN, and YEAR; the second and third are enumerated by the code lists with the same IDs. There are four data flows, one for each MEASURE, and one data set for each flow.\n", | |
"The data were obtained from a set of sources and processed to gain the best possible estimate of global trends in energy consumption for light duty vehicles.\n", | |
"The report provides further information on the upstream sources and methods for data analysis.\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\n", | |
" repr(structure_message.codelist[\"POWERTRAIN\"]),\n", | |
" \"\\n\".join(map(repr, structure_message.codelist[\"POWERTRAIN\"].items.values())),\n", | |
" structure_message.dataflow[\"REG\"].description,\n", | |
" sep=\"\\n\\n\",\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "4f880d2d-503e-4300-b2ef-5e475fa4e1c1", | |
"metadata": {}, | |
"source": [ | |
"This concludes the demonstration. We see that:\n", | |
"\n", | |
"- Records from open archives that apply well-defined identifiers can easily be identified, collected, and processed.\n", | |
"- Standard, structured formats can be used to describe **both data and metadata** and include these together.\n", | |
"- Clear and complete metadata facilitates decisions about whether and how to use data in assessment.\n", | |
"\n", | |
"## Processes using discoverable data\n", | |
"\n", | |
"How, in practice, could such discoverable data be used in the context of AR7 or other assessments?\n", | |
"\n", | |
"### Calls for (meta)data\n", | |
"\n", | |
"First, the IPCC or its units (e.g. chapter author teams, or sub-teams) would **define and advertise** how researchers should make their data discoverable. This advice would be simple, including:\n", | |
"\n", | |
"1. **Publish the (meta)data** on an open repository from a given list, including Zenodo, Figshare, and certain others.\n", | |
"2. **Use given identifiers**. In this demonstration we use a single keyword: ``x-ipcc-ar7-wgiii-data-demo``. In practice, one or more keyword(s) could be defined to distinguish data for different parts of the assessment: working groups, chapters, sections, and particular topics within these. For example:\n", | |
"\n", | |
" - ``ipcc-ar7-wgiii-chapter10-road-vehicles`` (hierarchical, including chapter and specific topic).\n", | |
" - ``ipcc-ar7-wgiii``, ``chapter10``, ``road-vehicles`` (multiple defined keywords).\n", | |
"\n", | |
"4. **Include certain files** with given names (here ``structure.xml`` and ``data.xml``) and in given formats. (Here, SDMX; other standard formats could possibly included which support representation of structure and metadata alongside the data itself. More below.)\n", | |
"\n", | |
"### Submission and revision\n", | |
"\n", | |
"If assessment processes are similar to those in AR6 and earlier, researchers could then take advantage of the affordances of Zenodo *et al.* to:\n", | |
"\n", | |
"- Add or remove keywords to include or remove their records in the set of contributions to be assessed—either temporarily or permanently.\n", | |
"- Publish new version(s) of record(s) with updated data files to correct or improve the included data.\n", | |
" This would allow, for instance, to publish a record with data before or with submission of a manuscript for publication in a peer reviewed journal. The data would be immediately usable in draft assessment(s), and then could be updated, confirmed, or removed depending on the progress of the manuscript.\n", | |
"\n", | |
"### Collection and assessment\n", | |
"\n", | |
"IPCC author teams could, in turn:\n", | |
"\n", | |
"- Repeat **Step 1**—regularly, automatically, and/or on demand—to identify and track progress of data contributions over time. This analysis of available data could inform efforts to solicit or support additional contributions.\n", | |
"- For records that fail **Step 2** (e.g. that lack the expected file names and formats): use the Zenodo metadata to directly contact authors and offer advice to correct their contributions. This step could also be automated.\n", | |
"- Define, advertise, and apply criteria for data for **Step 3**.\n", | |
" For instance, in the example above, author teams could say:\n", | |
"\n", | |
" > “We invite contribution of data that:\n", | |
" > - measure vehicle registrations (``REG``)\n", | |
" > - contain projections: have a TIME_PERIOD dimension and scope up to 2030, 2050, or 2100.\n", | |
" > - have a POWERTRAIN dimension and include *at least* the codes ``ev`` and ``_T`` (total).\n", | |
" > - have values for TIME_PERIOD=2020 that are within ±10% of [reference historical source].”\n", | |
"\n", | |
" - These criteria could be applied to identified contributions to filter subsets for particular assessment workflows.\n", | |
" - Researchers could also be given tools to apply these criteria to their own (meta)data *before* submitting to an archive.\n", | |
" - As in Steps 1 and 2, automated and transparent feedback to contributors would allow them to trace how their data are taken up by assessments." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "08f1d5b3-891c-4df7-bbd2-ee774ab86a6e", | |
"metadata": {}, | |
"source": [ | |
"## Discussion\n", | |
"\n", | |
"The IPCC, its author teams, and the broader research community need to design and implement processes that support shared goals for assessments, making judicious use of scarce resources. This high-level goal should inform choices about processes, tools, and methods.\n", | |
"\n", | |
"### Community development of assessment methods\n", | |
"\n", | |
"For AR6 WGIII, assessment processes were in some cases opaque: the data collected and assessment code used to process those data were not visible outside the author teams until after publication of the report. (There were [exceptions](https://github.com/transportenergy/ipcc-ar6-wg3-ch10).)\n", | |
"\n", | |
"With a process based on data in public archives, it becomes possible for *any* member of the broader research community—not only the identified IPCC author teams—to perform collection and assessment (Steps 1, 2, and 3). This comes with opportunities and risks. For instance:\n", | |
"\n", | |
"- As a limited number of volunteers, author teams do not have time and resources to consider all possible assessment methods. Methodological contributions would allow the community to substantially assist author teams, leading to higher-quality and more robust assessment.\n", | |
"- The outlining, drafting, revision, and review of the IPCC reports is labour-intensive. Author teams must defend their work and the contents of the final report. Community submissions that arrive at a late stage could complicate this work. This risk could be managed with a clearly communicated schedule, similar to the literature cut-off dates used in AR6 and previous.\n", | |
"\n", | |
"### Affordances, skills, tooling, and support\n", | |
"\n", | |
"In AR6 WGIII, substantial effort was put in to develop tools and provide support (documentation, training webinars, e-mail support) to authors in submitting certain kinds of data. These tools were developed initially for Chapter 3 (“Mitigation pathways compatible with long-term goals”), and then extended as a courtesy to author teams in other chapters.\n", | |
"\n", | |
"In practice, little data made it into and through these pipelines to other chapters of the report. Anecdotes from would-be contributors indicated that unfamilarity with the particular data/file formats and tools used, and lack of clarity on the way(s) in which data would be used, were among barriers to participation.\n", | |
"\n", | |
"The question of [*affordances*](https://www.interaction-design.org/literature/topics/affordances) is thus central. Specifically we should ask:\n", | |
"\n", | |
"- What affordances can be provided to (a) researchers/data contributors and (b) IPCC author teams within different processes? Using currently available tools? Using improved tools?\n", | |
"- What are the costs of changing the affordances (improving features of tools, providing better documentation and feedback, etc.) within different processes?\n", | |
"\n", | |
"One argument for an open and standards-based process (as demonstrated here) is that authors can **contribute data as-is,** and put effort into expressing, through metadata, the complete and exact meaning of their data; the methods by which it was produced; etc.—in interoperable formats.\n", | |
"\n", | |
"Then, the work of (possibly) modifying or harmonizing data into commensurate dimensionality, measures, categorizations, etc. is then with assessment author teams—not presented as a barrier to would-be data contributors. Open processes ensure it is transparent to data contributors if and why their data are not used in final assessments.\n", | |
"\n", | |
"### Standards and conventions\n", | |
"\n", | |
"The SDMX formats used in the above demo have a few useful attributes:\n", | |
"\n", | |
"- SDMX is a precisely specified, ISO-published, open, and widely used standard. As such there is a wide suite of available tools (for instance, the [Eurostat Data Browser](https://ec.europa.eu/eurostat/databrowser/product/view/avia_if_typ)) and [learning materials](https://sdmx.org/?page_id=2555) developed around the standard.\n", | |
"- It is **generic**, or not domain-specific, and designed from the outset to be so. Initial applicatons were in official statistics and finance; but the standard and file formats *per se* are not inherently tailored for any one domain of data or research (at the inevitable cost of usefulness in others).\n", | |
"- They provide rich options for **structural and process metadata**. For example, Eurostat uses these affordances to publish [detailed information](https://ec.europa.eu/eurostat/cache/metadata/en/avia_if_esms.htm) on the provenance of data.\n", | |
"- The formats are both **machine-** and **human-readable**.\n", | |
"\n", | |
"While a few of the many research domains involved in the IPCC and WGIII have domain-specific file formats, most of these lack one or more of the above attributes. In some domains there are no commonly-used formats, or only loose conventions that are not widely followed.\n", | |
"\n", | |
"In adopting SDMX, or any other standard that offers similar attributes, IPCC author teams should consider the target audience of researchers/data-contributors; their skill-set and prior knowledge; and the costs of providing training, tools, and support that allow them to overcome any barriers to contributing their (meta)data." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "82c7399b-64d3-4059-8d83-cf24922e1fa3", | |
"metadata": {}, | |
"source": [ | |
"Copyright © 2024 Paul Natsuo Kishimoto <<[email protected]>>.\n", | |
"Licensed [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)." | |
] | |
} | |
], | |
"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.12.7" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment