{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Exploring the Te Papa collection API\n", "\n", "Te Papa has a [new collection API](https://data.tepapa.govt.nz/docs/index.html), so I thought I should have a poke around. This notebook is just a preliminary exploration — it's not intended as a tutorial or a guide. There may well be mistakes and misinterpretations. Nonetheless, it might help you get a feel for what's possible.\n", "\n", "In the future I'll add notebooks focused on specific tasks, but for now we're just going to follow our noses and see where we end up." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "

If you haven't used one of these notebooks before, they're basically web pages in which you can write, edit, and run live code. They're meant to encourage experimentation, so don't feel nervous. Just try running a few cells and see what happens!.

\n", "\n", "

\n", " Some tips:\n", "

\n", "

\n", "
" ] }, { "cell_type": "code", "execution_count": 254, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RendererRegistry.enable('notebook')" ] }, "execution_count": 254, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import requests\n", "import pandas as pd\n", "import altair as alt\n", "from tqdm import tnrange\n", "import re\n", "from six import iteritems\n", "from IPython.display import display, HTML\n", "alt.renderers.enable('notebook')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Get an API key\n", "\n", "[Sign up here](https://data.tepapa.govt.nz/docs/register.html) for your very own API key." ] }, { "cell_type": "code", "execution_count": 358, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Your API key is: \n" ] } ], "source": [ "# Insert your API key between the quotes\n", "api_key = ''\n", "# If you don't have an API key yet, you can leave the above blank and we'll pick up a guest token below\n", "print('Your API key is: {}'.format(api_key))" ] }, { "cell_type": "code", "execution_count": 359, "metadata": {}, "outputs": [], "source": [ "search_endpoint = 'https://data.tepapa.govt.nz/collection/search'\n", "object_endpoint = 'https://data.tepapa.govt.nz/collection/object'\n", "endpoint = 'https://data.tepapa.govt.nz/collection/{}'\n", "\n", "headers = {\n", " 'x-api-key': api_key,\n", " 'Accept': 'application/json'\n", "}\n", "\n", "if not api_key:\n", " response = requests.get('https://data.tepapa.govt.nz/collection/search')\n", " data = response.json()\n", " guest_token = data['guestToken']\n", " headers['Authorization'] = 'Bearer {}'.format(guest_token)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What will we search for?\n", "\n", "Here's I'm going to set a keyword that I'll use in my searches throughout this notebook. Feel free to change it to explore your own results. You can also set it to '\\*' (an asterix) to return everything." ] }, { "cell_type": "code", "execution_count": 360, "metadata": {}, "outputs": [], "source": [ "keyword = 'Chinese'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's make our first API request!" ] }, { "cell_type": "code", "execution_count": 361, "metadata": {}, "outputs": [], "source": [ "# Set our search parameters for passing to Requests\n", "params = {\n", " 'q': keyword\n", "}" ] }, { "cell_type": "code", "execution_count": 362, "metadata": {}, "outputs": [], "source": [ "# Send off the API request\n", "# We need to supply the `headers` to authenticate our request with our key\n", "response = requests.get(search_endpoint, headers=headers, params=params)\n", "# Get the JSON result data\n", "data = response.json()" ] }, { "cell_type": "code", "execution_count": 363, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'count': 11852, 'from': 0, 'size': 100, 'truncated': False}" ] }, "execution_count": 363, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Drill down to get the summary data from our search\n", "data['_metadata']['resultset']" ] }, { "cell_type": "code", "execution_count": 261, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Your search for \"Chinese\" using the Te Papa collection API returned 11,852 results.\n" ] } ], "source": [ "print('Your search for \"{}\" using the Te Papa collection API returned {:,} results.'.format(keyword, data['_metadata']['resultset']['count']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What sorts of things are in our search results?\n", "\n", "A really useful feature of the API is that you can ask for facets on lots of different fields. You've probably used the facets on the [Te Papa collection search page](https://collections.tepapa.govt.nz/) to narrow down your results. Using the API, you can go even further, using the facets to summarise your results from a variety of different angles.\n", "\n", "Let's start by getting facets from the `type` field. To request facets you have to POST your query to the [search endpoint](https://data.tepapa.govt.nz/docs/resource_SearchResource.html). Fortunately the Python Requests library makes it really easy to create and submit POST requests. All you have to do is supply the name of the field you want facets for, and the number of facets to return. If you set `size` to `5`, you'll get the 5 most frequent values. According to some ElasticSearch docs I found, you should be able to get all the facets by setting `size` to `0` (ie zero), but I couldn't get this to work.\n", "\n", "#### Create POST request data" ] }, { "cell_type": "code", "execution_count": 262, "metadata": {}, "outputs": [], "source": [ "# This is the dictionary that provides the data for the POST request\n", "# Here we're saying we want the 5 'types' with the most results\n", "# You can change the size parameter as necessary.\n", "\n", "post_data = {\n", " 'query': 'chinese',\n", " 'facets': [\n", " {\n", " 'field': 'type',\n", " 'size': 5\n", " }\n", " ]\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Make the API request\n", "\n", "Note that we're using the `post` method rather than `get`. If we supply the POST data using the `json` parameter, Requests takes care of all the tricky encoding issues." ] }, { "cell_type": "code", "execution_count": 263, "metadata": {}, "outputs": [], "source": [ "response = requests.post(search_endpoint, json=post_data, headers=headers)\n", "data = response.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Convert to a dataframe\n", "\n", "Let's convert the results to a Pandas dataframe because Pandas is awesome and it'll make it easier to create charts." ] }, { "cell_type": "code", "execution_count": 264, "metadata": {}, "outputs": [], "source": [ "types_df = pd.DataFrame(list(data['facets']['type'].items()))\n", "# Set columns names\n", "types_df.columns = ['Type', 'Count']" ] }, { "cell_type": "code", "execution_count": 265, "metadata": {}, "outputs": [ { "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", "
TypeCount
0Specimen83
1Category121
2Object11451
3Topic26
4Place134
\n", "
" ], "text/plain": [ " Type Count\n", "0 Specimen 83\n", "1 Category 121\n", "2 Object 11451\n", "3 Topic 26\n", "4 Place 134" ] }, "execution_count": 265, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# View the results\n", "types_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Display the results as a bar chart" ] }, { "cell_type": "code", "execution_count": 266, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}}, \"data\": {\"name\": \"data-ebfca4b0bdcced03d9739362d7ef3d7d\"}, \"mark\": \"bar\", \"encoding\": {\"tooltip\": [{\"type\": \"ordinal\", \"field\": \"Type\"}, {\"type\": \"quantitative\", \"field\": \"Count\"}], \"x\": {\"type\": \"quantitative\", \"field\": \"Count\"}, \"y\": {\"type\": \"ordinal\", \"field\": \"Type\"}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v2.6.0.json\", \"datasets\": {\"data-ebfca4b0bdcced03d9739362d7ef3d7d\": [{\"Type\": \"Specimen\", \"Count\": 83}, {\"Type\": \"Category\", \"Count\": 121}, {\"Type\": \"Object\", \"Count\": 11451}, {\"Type\": \"Topic\", \"Count\": 26}, {\"Type\": \"Place\", \"Count\": 134}]}};\n", "var opt = {};\n", "var type = \"vega-lite\";\n", "var id = \"6dd1b2b7-7299-4b53-a9db-cb0a153e0565\";\n", "\n", "var output_area = this;\n", "\n", "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n", " var target = document.createElement(\"div\");\n", " target.id = id;\n", " target.className = \"vega-embed\";\n", "\n", " var style = document.createElement(\"style\");\n", " style.textContent = [\n", " \".vega-embed .error p {\",\n", " \" color: firebrick;\",\n", " \" font-size: 14px;\",\n", " \"}\",\n", " ].join(\"\\\\n\");\n", "\n", " // element is a jQuery wrapped DOM element inside the output area\n", " // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n", " // IPython.display.html#IPython.display.Javascript.__init__\n", " element[0].appendChild(target);\n", " element[0].appendChild(style);\n", "\n", " vega.render(\"#\" + id, spec, type, opt, output_area);\n", "}, function (err) {\n", " if (err.requireType !== \"scripterror\") {\n", " throw(err);\n", " }\n", "});\n" ], "text/plain": [ "" ] }, "metadata": { "jupyter-vega": "#6dd1b2b7-7299-4b53-a9db-cb0a153e0565" }, "output_type": "display_data" }, { "data": { "image/png": "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" }, "metadata": { "jupyter-vega": "#6dd1b2b7-7299-4b53-a9db-cb0a153e0565" }, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 266, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alt.Chart(types_df).mark_bar().encode(\n", " y='Type:O',\n", " x='Count',\n", " tooltip=[alt.Tooltip('Type:O'), alt.Tooltip('Count')]\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What collections are the objects in?\n", "\n", "One of the great things about the Te Papa API is the richness of the data and all the interrelations between things, people, places, and subjects. But this also makes it a bit of a challenge to understand how everything fits together. On the GitHub site there's a useful summary of the record structures used to represent the different types of things. Here, for example, is what an [object record](https://github.com/te-papa/collections-api/wiki/Collections-API-Object-Model#object) looks like. Using this as a guide we can start to dig down through the data.\n", "\n", "Let's get an overview of the `objects` in our search results by using the `collection` facet.\n", "\n", "#### Create the POST request data\n", "\n", "This time we're using the `filters` parameter to limit our search to things that have the `type` of 'Object'. We're then getting facets on the `collection` field.\n", "\n", "Instead of using `filters` we could include something like `type: Object` in the query string. I think this changes the way the result set is constructed, but I don't know if it affects the results returned." ] }, { "cell_type": "code", "execution_count": 267, "metadata": {}, "outputs": [], "source": [ "post_data = {\n", " 'query': 'chinese',\n", " 'filters': [{\n", " 'field': 'type',\n", " 'keyword': 'Object'\n", " }],\n", " 'facets': [\n", " {'field': 'collection',\n", " 'size': 20}\n", " ]\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Make the API request and convert the results to a dataframe" ] }, { "cell_type": "code", "execution_count": 268, "metadata": {}, "outputs": [], "source": [ "# Get the API response\n", "response = requests.post(search_endpoint, json=post_data, headers=headers)\n", "data = response.json()" ] }, { "cell_type": "code", "execution_count": 269, "metadata": {}, "outputs": [], "source": [ "# Convert to a dataframe\n", "objects_df = pd.DataFrame(list(data['facets']['collection'].items()))\n", "objects_df.columns = ['Collection', 'Count']" ] }, { "cell_type": "code", "execution_count": 270, "metadata": {}, "outputs": [ { "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", "
CollectionCount
0Photography8920
1MuseumArchives7
2Art86
3CollectedArchives109
4Philatelic73
5TaongaMāori4
6RareBooks8
7PacificCultures29
8History2215
\n", "
" ], "text/plain": [ " Collection Count\n", "0 Photography 8920\n", "1 MuseumArchives 7\n", "2 Art 86\n", "3 CollectedArchives 109\n", "4 Philatelic 73\n", "5 TaongaMāori 4\n", "6 RareBooks 8\n", "7 PacificCultures 29\n", "8 History 2215" ] }, "execution_count": 270, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# View the results\n", "objects_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Display the results as a bar chart" ] }, { "cell_type": "code", "execution_count": 271, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}}, \"data\": {\"name\": \"data-0227cb06d4ff92d6e2e2c5989a42481f\"}, \"mark\": \"bar\", \"encoding\": {\"tooltip\": [{\"type\": \"ordinal\", \"field\": \"Collection\"}, {\"type\": \"quantitative\", \"field\": \"Count\"}], \"x\": {\"type\": \"quantitative\", \"field\": \"Count\"}, \"y\": {\"type\": \"ordinal\", \"field\": \"Collection\"}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v2.6.0.json\", \"datasets\": {\"data-0227cb06d4ff92d6e2e2c5989a42481f\": [{\"Collection\": \"Photography\", \"Count\": 8920}, {\"Collection\": \"MuseumArchives\", \"Count\": 7}, {\"Collection\": \"Art\", \"Count\": 86}, {\"Collection\": \"CollectedArchives\", \"Count\": 109}, {\"Collection\": \"Philatelic\", \"Count\": 73}, {\"Collection\": \"TaongaM\\u0101ori\", \"Count\": 4}, {\"Collection\": \"RareBooks\", \"Count\": 8}, {\"Collection\": \"PacificCultures\", \"Count\": 29}, {\"Collection\": \"History\", \"Count\": 2215}]}};\n", "var opt = {};\n", "var type = \"vega-lite\";\n", "var id = \"ecb09175-ceba-4d8c-86a5-0f4ada1dad2f\";\n", "\n", "var output_area = this;\n", "\n", "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n", " var target = document.createElement(\"div\");\n", " target.id = id;\n", " target.className = \"vega-embed\";\n", "\n", " var style = document.createElement(\"style\");\n", " style.textContent = [\n", " \".vega-embed .error p {\",\n", " \" color: firebrick;\",\n", " \" font-size: 14px;\",\n", " \"}\",\n", " ].join(\"\\\\n\");\n", "\n", " // element is a jQuery wrapped DOM element inside the output area\n", " // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n", " // IPython.display.html#IPython.display.Javascript.__init__\n", " element[0].appendChild(target);\n", " element[0].appendChild(style);\n", "\n", " vega.render(\"#\" + id, spec, type, opt, output_area);\n", "}, function (err) {\n", " if (err.requireType !== \"scripterror\") {\n", " throw(err);\n", " }\n", "});\n" ], "text/plain": [ "" ] }, "metadata": { "jupyter-vega": "#ecb09175-ceba-4d8c-86a5-0f4ada1dad2f" }, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 271, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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" }, "metadata": { "jupyter-vega": "#ecb09175-ceba-4d8c-86a5-0f4ada1dad2f" }, "output_type": "display_data" } ], "source": [ "alt.Chart(objects_df).mark_bar().encode(\n", " y='Collection:O',\n", " x='Count',\n", " tooltip=[alt.Tooltip('Collection:O'), alt.Tooltip('Count')]\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So there's **lots** of photos. Let's see what we can find out about them." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## When were the photos taken?\n", "\n", "As well as examining categories, we can use facets to display the date range of the results. But what date, and where is it? If you look at the structure of an [object record](https://github.com/te-papa/collections-api/wiki/Collections-API-Object-Model#object), you'll see that the `production` field is actually a list of production 'events' which have a `creationDate` field. In order to get a list of facets for `createdDate` we have to use dot notation to move down through the record hierarchy — so the field for faceting is `production.createdDate`.\n", "\n", "#### The POST data" ] }, { "cell_type": "code", "execution_count": 309, "metadata": {}, "outputs": [], "source": [ "post_data = {\n", " 'query': 'chinese',\n", " 'filters': [{\n", " 'field': 'collection',\n", " 'keyword': 'Photography'\n", " }],\n", " 'facets': [\n", " {'field': 'production.createdDate',\n", " 'size': 100}\n", " ]\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The API request and response" ] }, { "cell_type": "code", "execution_count": 310, "metadata": {}, "outputs": [], "source": [ "# Get the API response\n", "response = requests.post(search_endpoint, json=post_data, headers=headers)\n", "data = response.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When I tried to access the data from the `production.createdDate` facet I got an error. If we look at the fields returned in the facets we see why." ] }, { "cell_type": "code", "execution_count": 311, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "dict_keys(['production.createdDate.verbatim', 'production.createdDate.temporal'])" ] }, "execution_count": 311, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's see what the facet data looks like\n", "data['facets'].keys()\n", "# Note that the createdDate facet returns two sets of facets -- a 'verbatim' date, which is ISO-formatted, and a timestamp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's actually two versions of the date facets — `production.createdDate.verbatim` provides ISO formatted dates, while `production.createdDate.temporal` provides timestamps. We'll use the `verbatim` field." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Convert the results to a dataframe and do some cleaning" ] }, { "cell_type": "code", "execution_count": 312, "metadata": {}, "outputs": [ { "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", "
DateCount
01948-01-012
11958-01-0129
2197625
31955-01-011
4197522
\n", "
" ], "text/plain": [ " Date Count\n", "0 1948-01-01 2\n", "1 1958-01-01 29\n", "2 1976 25\n", "3 1955-01-01 1\n", "4 1975 22" ] }, "execution_count": 312, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Let's use the 'verbatim' dates\n", "photos_df = pd.DataFrame(list(data['facets']['production.createdDate.verbatim'].items()))\n", "photos_df.columns = ['Date', 'Count']\n", "photos_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see that the `Date` field is now a mix of days and years. Let's create a new `Year` column and use it to group together the totals." ] }, { "cell_type": "code", "execution_count": 315, "metadata": {}, "outputs": [ { "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", "
YearCount
018701
118904
218951
318983
41900140
\n", "
" ], "text/plain": [ " Year Count\n", "0 1870 1\n", "1 1890 4\n", "2 1895 1\n", "3 1898 3\n", "4 1900 140" ] }, "execution_count": 315, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a Year column by slicing the first four chars from the Date\n", "photos_df['Year'] = photos_df['Date'].str.slice(0, 4)\n", "# Group by Year, summing together the counts\n", "years = photos_df.groupby([photos_df['Year']], as_index=False).sum()\n", "years.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Make a chart" ] }, { "cell_type": "code", "execution_count": 316, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}}, \"data\": {\"name\": \"data-8811f084e95408806ca5b03f37f6cc03\"}, \"mark\": \"bar\", \"encoding\": {\"tooltip\": [{\"type\": \"temporal\", \"field\": \"Year\", \"format\": \"%Y\"}, {\"type\": \"quantitative\", \"field\": \"Count\"}], \"x\": {\"type\": \"temporal\", \"field\": \"Year\"}, \"y\": {\"type\": \"quantitative\", \"field\": \"Count\"}}, \"selection\": {\"selector064\": {\"type\": \"interval\", \"bind\": \"scales\", \"encodings\": [\"x\", \"y\"]}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v2.6.0.json\", \"datasets\": {\"data-8811f084e95408806ca5b03f37f6cc03\": [{\"Year\": \"1870\", \"Count\": 1}, {\"Year\": \"1890\", \"Count\": 4}, {\"Year\": \"1895\", \"Count\": 1}, {\"Year\": \"1898\", \"Count\": 3}, {\"Year\": \"1900\", \"Count\": 140}, {\"Year\": \"1901\", \"Count\": 25}, {\"Year\": \"1902\", \"Count\": 7}, {\"Year\": \"1904\", \"Count\": 2}, {\"Year\": \"1905\", \"Count\": 3}, {\"Year\": \"1906\", \"Count\": 1}, {\"Year\": \"1908\", \"Count\": 4}, {\"Year\": \"1909\", \"Count\": 1}, {\"Year\": \"1910\", \"Count\": 44}, {\"Year\": \"1913\", \"Count\": 10}, {\"Year\": \"1914\", \"Count\": 2}, {\"Year\": \"1915\", \"Count\": 1}, {\"Year\": \"1916\", \"Count\": 1}, {\"Year\": \"1918\", \"Count\": 7}, {\"Year\": \"1919\", \"Count\": 2}, {\"Year\": \"1920\", \"Count\": 1}, {\"Year\": \"1923\", \"Count\": 1}, {\"Year\": \"1924\", \"Count\": 1}, {\"Year\": \"1925\", \"Count\": 1}, {\"Year\": \"1927\", \"Count\": 1}, {\"Year\": \"1928\", \"Count\": 12}, {\"Year\": \"1930\", \"Count\": 91}, {\"Year\": \"1932\", \"Count\": 5}, {\"Year\": \"1935\", \"Count\": 2}, {\"Year\": \"1936\", \"Count\": 3}, {\"Year\": \"1937\", \"Count\": 1}, {\"Year\": \"1938\", \"Count\": 8}, {\"Year\": \"1939\", \"Count\": 1}, {\"Year\": \"1940\", \"Count\": 1}, {\"Year\": \"1945\", \"Count\": 2}, {\"Year\": \"1946\", \"Count\": 19}, {\"Year\": \"1948\", \"Count\": 11}, {\"Year\": \"1949\", \"Count\": 8}, {\"Year\": \"1950\", \"Count\": 9}, {\"Year\": \"1951\", \"Count\": 36}, {\"Year\": \"1952\", \"Count\": 1}, {\"Year\": \"1953\", \"Count\": 68}, {\"Year\": \"1954\", \"Count\": 56}, {\"Year\": \"1955\", \"Count\": 1}, {\"Year\": \"1956\", \"Count\": 14}, {\"Year\": \"1957\", \"Count\": 2463}, {\"Year\": \"1958\", \"Count\": 33}, {\"Year\": \"1959\", \"Count\": 595}, {\"Year\": \"1960\", \"Count\": 576}, {\"Year\": \"1961\", \"Count\": 15}, {\"Year\": \"1962\", \"Count\": 10}, {\"Year\": \"1963\", \"Count\": 117}, {\"Year\": \"1964\", \"Count\": 31}, {\"Year\": \"1965\", \"Count\": 9}, {\"Year\": \"1966\", \"Count\": 7}, {\"Year\": \"1969\", \"Count\": 36}, {\"Year\": \"1970\", \"Count\": 3432}, {\"Year\": \"1971\", \"Count\": 3}, {\"Year\": \"1975\", \"Count\": 22}, {\"Year\": \"1976\", \"Count\": 94}, {\"Year\": \"1984\", \"Count\": 2}, {\"Year\": \"1985\", \"Count\": 2}, {\"Year\": \"1986\", \"Count\": 71}, {\"Year\": \"1989\", \"Count\": 3}, {\"Year\": \"1995\", \"Count\": 3}]}};\n", "var opt = {};\n", "var type = \"vega-lite\";\n", "var id = \"70d2d68d-314b-4528-b4bf-5624c9b83b6b\";\n", "\n", "var output_area = this;\n", "\n", "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n", " var target = document.createElement(\"div\");\n", " target.id = id;\n", " target.className = \"vega-embed\";\n", "\n", " var style = document.createElement(\"style\");\n", " style.textContent = [\n", " \".vega-embed .error p {\",\n", " \" color: firebrick;\",\n", " \" font-size: 14px;\",\n", " \"}\",\n", " ].join(\"\\\\n\");\n", "\n", " // element is a jQuery wrapped DOM element inside the output area\n", " // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n", " // IPython.display.html#IPython.display.Javascript.__init__\n", " element[0].appendChild(target);\n", " element[0].appendChild(style);\n", "\n", " vega.render(\"#\" + id, spec, type, opt, output_area);\n", "}, function (err) {\n", " if (err.requireType !== \"scripterror\") {\n", " throw(err);\n", " }\n", "});\n" ], "text/plain": [ "" ] }, "metadata": { "jupyter-vega": "#70d2d68d-314b-4528-b4bf-5624c9b83b6b" }, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 316, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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" }, "metadata": { "jupyter-vega": "#70d2d68d-314b-4528-b4bf-5624c9b83b6b" }, "output_type": "display_data" } ], "source": [ "c1 = alt.Chart(years).mark_bar().encode(\n", " x='Year:T',\n", " y='Count',\n", " tooltip=[alt.Tooltip('Year:T', format='%Y'), 'Count']\n", ").interactive()\n", "c1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hmmm, the values for 1957 and 1970 are a bit extraordinary. I wonder what's going on...?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What happened in 1970?\n", "\n", "I'd hoped to try and find out what happened in 1970 by limiting the results to those with a `createdDate` of '1970-01-01'. I first tried this query using `filters` to set the value for `production.createdDate`. However, the request returned an error that said the field wasn't facetable. I then tried adding `production.createdDate:\"1970-01-01\"` to the query string but then I go no results at all. Eventually I found this [in the docs](https://github.com/te-papa/collections-api/wiki/Getting-started):\n", "\n", "> Field search is not possible against nested fields, for example collection:Art is possible, but not production:mccahon or production.contributor.title:mccahon (however all nested text is searchable in general searches)\n", "\n", "So I think I'll need to harvest all the photographs data and then explore offline. That'll have to wait..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What are the photos about?\n", "\n", "Let's try another approach. The `depicts` field provides a list of subjects (which I think could themselves be people, places, or categories). By asking for facets from the `depicts` field, we could get a picture of what the photos are about.\n", "\n", "At first I tried getting facets for `depicts.title`, but this didn't work as `title` is a text field. After a bit of trial and error, I realised that asking for facets on `depicts.href` produced useful results. The `href` field is the API link to the full record for the category, so not only does it give us facets, it provides a link to get more information." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The POST data" ] }, { "cell_type": "code", "execution_count": 278, "metadata": {}, "outputs": [], "source": [ "post_data = {\n", " 'query': 'chinese',\n", " 'filters': [{\n", " 'field': 'collection',\n", " 'keyword': 'Photography'\n", " }],\n", " 'facets': [\n", " {'field': 'depicts.href',\n", " 'size': 10}\n", " ]\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The API response" ] }, { "cell_type": "code", "execution_count": 279, "metadata": {}, "outputs": [], "source": [ "# Get the API response\n", "response = requests.post(search_endpoint, json=post_data, headers=headers)\n", "data = response.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Convert the results to a dataframe" ] }, { "cell_type": "code", "execution_count": 280, "metadata": {}, "outputs": [ { "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", "
CategoryCount
0https://data.tepapa.govt.nz/collection/categor...167
1https://data.tepapa.govt.nz/collection/categor...176
2https://data.tepapa.govt.nz/collection/categor...345
3https://data.tepapa.govt.nz/collection/categor...161
4https://data.tepapa.govt.nz/collection/categor...241
\n", "
" ], "text/plain": [ " Category Count\n", "0 https://data.tepapa.govt.nz/collection/categor... 167\n", "1 https://data.tepapa.govt.nz/collection/categor... 176\n", "2 https://data.tepapa.govt.nz/collection/categor... 345\n", "3 https://data.tepapa.govt.nz/collection/categor... 161\n", "4 https://data.tepapa.govt.nz/collection/categor... 241" ] }, "execution_count": 280, "metadata": {}, "output_type": "execute_result" } ], "source": [ "depicts_df = pd.DataFrame(list(data['facets']['depicts.href'].items()))\n", "depicts_df.columns = ['Category', 'Count']\n", "depicts_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Add category titles to the dataframe\n", "\n", "So the `href` field by itself isn't very illuminating. But by looking it up using a simple GET request we get lots more data including the category title.\n", "\n", "I thought this could be useful later on so I created a simple function." ] }, { "cell_type": "code", "execution_count": 281, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0a83c769be994e6482a4993e92f35863", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(IntProgress(value=0, max=10), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\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", "
CategoryCountTitle
0https://data.tepapa.govt.nz/collection/categor...167performing artists
1https://data.tepapa.govt.nz/collection/categor...176People
2https://data.tepapa.govt.nz/collection/categor...345Chinese
3https://data.tepapa.govt.nz/collection/categor...161men
4https://data.tepapa.govt.nz/collection/categor...241Motion picture industry
5https://data.tepapa.govt.nz/collection/categor...474Japanese
6https://data.tepapa.govt.nz/collection/categor...157actors
7https://data.tepapa.govt.nz/collection/categor...241Motion pictures
8https://data.tepapa.govt.nz/collection/categor...245Costumes
9https://data.tepapa.govt.nz/collection/categor...131Men
\n", "
" ], "text/plain": [ " Category Count \\\n", "0 https://data.tepapa.govt.nz/collection/categor... 167 \n", "1 https://data.tepapa.govt.nz/collection/categor... 176 \n", "2 https://data.tepapa.govt.nz/collection/categor... 345 \n", "3 https://data.tepapa.govt.nz/collection/categor... 161 \n", "4 https://data.tepapa.govt.nz/collection/categor... 241 \n", "5 https://data.tepapa.govt.nz/collection/categor... 474 \n", "6 https://data.tepapa.govt.nz/collection/categor... 157 \n", "7 https://data.tepapa.govt.nz/collection/categor... 241 \n", "8 https://data.tepapa.govt.nz/collection/categor... 245 \n", "9 https://data.tepapa.govt.nz/collection/categor... 131 \n", "\n", " Title \n", "0 performing artists \n", "1 People \n", "2 Chinese \n", "3 men \n", "4 Motion picture industry \n", "5 Japanese \n", "6 actors \n", "7 Motion pictures \n", "8 Costumes \n", "9 Men " ] }, "execution_count": 281, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def get_categories(df):\n", " '''\n", " Lookup category urls and get back the title to add to dataframe.\n", " '''\n", " for i in tnrange(len(df)):\n", " href = df.loc[i]['Category']\n", " response = requests.get(href, headers=headers)\n", " title = response.json()['title']\n", " df.at[i, 'Title'] = title\n", " return df\n", "\n", "depicts_df = get_categories(depicts_df)\n", "depicts_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Make a chart\n", "\n", "Now we have the titles, let's make a bar chart." ] }, { "cell_type": "code", "execution_count": 282, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}}, \"data\": {\"name\": \"data-d4c31248a4e03d7b41a1b2f1981a52da\"}, \"mark\": \"bar\", \"encoding\": {\"tooltip\": [{\"type\": \"quantitative\", \"field\": \"Count\"}], \"x\": {\"type\": \"quantitative\", \"field\": \"Count\"}, \"y\": {\"type\": \"ordinal\", \"field\": \"Title\"}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v2.6.0.json\", \"datasets\": {\"data-d4c31248a4e03d7b41a1b2f1981a52da\": [{\"Category\": \"https://data.tepapa.govt.nz/collection/category/327180\", \"Count\": 167, \"Title\": \"performing artists\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/427670\", \"Count\": 176, \"Title\": \"People\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/400\", \"Count\": 345, \"Title\": \"Chinese\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/319914\", \"Count\": 161, \"Title\": \"men\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/426854\", \"Count\": 241, \"Title\": \"Motion picture industry\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/417\", \"Count\": 474, \"Title\": \"Japanese\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/327024\", \"Count\": 157, \"Title\": \"actors\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/426864\", \"Count\": 241, \"Title\": \"Motion pictures\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/422662\", \"Count\": 245, \"Title\": \"Costumes\"}, {\"Category\": \"https://data.tepapa.govt.nz/collection/category/426494\", \"Count\": 131, \"Title\": \"Men\"}]}};\n", "var opt = {};\n", "var type = \"vega-lite\";\n", "var id = \"e045b672-c27d-4314-a9ca-56cf44f0f53c\";\n", "\n", "var output_area = this;\n", "\n", "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n", " var target = document.createElement(\"div\");\n", " target.id = id;\n", " target.className = \"vega-embed\";\n", "\n", " var style = document.createElement(\"style\");\n", " style.textContent = [\n", " \".vega-embed .error p {\",\n", " \" color: firebrick;\",\n", " \" font-size: 14px;\",\n", " \"}\",\n", " ].join(\"\\\\n\");\n", "\n", " // element is a jQuery wrapped DOM element inside the output area\n", " // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n", " // IPython.display.html#IPython.display.Javascript.__init__\n", " element[0].appendChild(target);\n", " element[0].appendChild(style);\n", "\n", " vega.render(\"#\" + id, spec, type, opt, output_area);\n", "}, function (err) {\n", " if (err.requireType !== \"scripterror\") {\n", " throw(err);\n", " }\n", "});\n" ], "text/plain": [ "" ] }, "metadata": { "jupyter-vega": "#e045b672-c27d-4314-a9ca-56cf44f0f53c" }, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 282, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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" }, "metadata": { "jupyter-vega": "#e045b672-c27d-4314-a9ca-56cf44f0f53c" }, "output_type": "display_data" } ], "source": [ "alt.Chart(depicts_df).mark_bar().encode(\n", " y='Title:O',\n", " x='Count',\n", " tooltip=['Count']\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hmmm... Of course we should remember that these are only the top 10 facets — we might want to expand the results. But already we can see a few oddities. For example, there's separate entries for 'Men' and 'men'!\n", "\n", "Perhaps more interestingly, the most cited category in our search for 'Chinese' amongst photos in the Te Papa collection is 'Japanese'. That's weird..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Why do so many photographs in my search for 'Chinese' have the category 'Japanese'?\n", "\n", "Let's see if we can find out what's going on. First of all, let's try to limit our results to those that cite the 'Japanese' category. Filtering on the category `href` value seems to work." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Get the 'Japanese' category href value" ] }, { "cell_type": "code", "execution_count": 283, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'https://data.tepapa.govt.nz/collection/category/417'" ] }, "execution_count": 283, "metadata": {}, "output_type": "execute_result" } ], "source": [ "href = depicts_df.loc[depicts_df['Title'] == 'Japanese']['Category'].values[0]\n", "href" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The POST data" ] }, { "cell_type": "code", "execution_count": 284, "metadata": {}, "outputs": [], "source": [ "post_data = {\n", " 'query': 'chinese',\n", " 'filters': [\n", " {\n", " 'field': 'collection',\n", " 'keyword': 'Photography'\n", " },\n", " {\n", " 'field': 'depicts.href',\n", " 'keyword': href\n", " }\n", " ]\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The API response" ] }, { "cell_type": "code", "execution_count": 285, "metadata": {}, "outputs": [], "source": [ "# Get the API response\n", "response = requests.post(search_endpoint, json=post_data, headers=headers)\n", "data = response.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### View the titles\n", "\n", "Let's just loop through the results and list the titles." ] }, { "cell_type": "code", "execution_count": 286, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Japan series: boats\n", "Japan series: women mourning\n", "Japan series: Hokkaido, Furubira winter fishing port\n", "Japan Series: Honda Factory\n", "Girls cheer teenage idol Akira Mitsu, Noda, Japan. Taken for a series on Japan for ‘Life’\n", "Japan Series: Daiei Movie\n", "A typical Japanese farmer in Rain Coat and Hat\n", "Japanese Rice Planters at Dinner - Eating Rice, Japan\n", "On the Way to the Bridegroom's House\n", "One of Japan's Largest Modern Silk Weaving Plants - American Machinery and American Methods, Kirju, Japan\n" ] } ], "source": [ "for result in data['results']:\n", " print(result['title'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hmmm... Ok, so we can see why they have the 'Japanese' category attached, but why do they come up in a search for 'Chinese'?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Finding the references to our keyword\n", "\n", "From the raw results it's pretty hard to see why these photos are appearing in our search. The function below loops through all the nested records in the data looking for occurances of our keyword." ] }, { "cell_type": "code", "execution_count": 287, "metadata": {}, "outputs": [], "source": [ "def find_fields(doc, keyword):\n", " '''\n", " Find fields that contain the given keyword.\n", " Return the name of the field and the parent object.\n", " '''\n", " if isinstance(doc, list):\n", " for d in doc:\n", " for result in find_fields(d, keyword):\n", " yield result\n", " if isinstance(doc, dict):\n", " for k, v in iteritems(doc):\n", " if isinstance(v, str) and keyword in v:\n", " yield [doc, k]\n", " elif isinstance(v, dict):\n", " for result in find_fields(v, keyword):\n", " yield result\n", " elif isinstance(v, list):\n", " for d in v:\n", " for result in find_fields(d, keyword):\n", " yield result\n", "\n", "fields = list(find_fields(data['results'], keyword))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's list the results, displaying the type of record the keyword appears in (Object, Place, Category etc), the title of the record, and the context in which the keyword appears." ] }, { "cell_type": "code", "execution_count": 288, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n", "\n", "Place -- Japan\n", "ry BCE; adopted handwriting and much of \u001b[43mChinese\u001b[0m culture in the 6th-9th centuries. The e\n" ] } ], "source": [ "for field in fields:\n", " print('\\n{} -- {}'.format(field[0]['type'], field[0]['title']))\n", " context = re.search('(.{{0,40}}{}.{{0,40}})'.format(keyword), field[0][field[1]]).group(1)\n", " print(context.replace(keyword, '\\33[43m{}\\033[0m'.format(keyword)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So what's going on? From the list above you can see that the reference to 'Chinese' comes from a linked record for the `Place` 'Japan'. The default `query` search looks in all nested text fields, including the `scopeNote` of linked `Place` records, which is where the text above comes from.\n", "\n", "On the one hand it's great that the default search looks in all the nested records. But on the other hand it's a bit annoying, because if we want to do anything with the data we'll have to weed out the irrelevant photos. It's a familiar trade-off between discoverability and accuracy. In a web interface it's good to include as much as possible and then relevance rank it in a sensible way. This gives users their best chance of finding what they're after. But it's not so good if you're using an API to assemble a dataset for further analysis. In that case you want to be able to set fairly firm boundaries around your results." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Can we exclude results citing the 'Japanese' category?\n", "\n", "Is there a way of excluding categories from our results. Well, sort of... If we try to filter by the `depicts.href` field we run into the same problem with nested field searching as we did with the dates. But unlike a date string, the category `href` value is pretty specific, so we could probably just through it in the `query` string.\n", "\n", "#### Get the 'Japanese' category href value" ] }, { "cell_type": "code", "execution_count": 289, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'https://data.tepapa.govt.nz/collection/category/417'" ] }, "execution_count": 289, "metadata": {}, "output_type": "execute_result" } ], "source": [ "href = depicts_df.loc[depicts_df['Title'] == 'Japanese']['Category'].values[0]\n", "href" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The POST data" ] }, { "cell_type": "code", "execution_count": 290, "metadata": {}, "outputs": [], "source": [ "post_data = {\n", " 'query': 'chinese -\"{}\"'.format(href),\n", " 'filters': [\n", " {\n", " 'field': 'collection',\n", " 'keyword': 'Photography'\n", " }\n", " ],\n", " 'facets': [\n", " {'field': 'depicts.href',\n", " 'size': 10}\n", " ]\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### The API response" ] }, { "cell_type": "code", "execution_count": 291, "metadata": {}, "outputs": [], "source": [ "# Get the API response\n", "response = requests.post(search_endpoint, json=post_data, headers=headers)\n", "data = response.json()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### How many results do we have now?" ] }, { "cell_type": "code", "execution_count": 292, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'count': 8447, 'from': 0, 'size': 10, 'truncated': False}" ] }, "execution_count": 292, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['_metadata']['resultset']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we look above, we can see we started with 8,920 photos. The 'Japanese' category had 474 results. So I expected we'd have:\n", "\n", " 8,920 - 474 = 8,446 results\n", "\n", "One off..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's next?\n", "\n", "I've had a go at [making maps](Mapping-Te-Papa-collections.ipynb) from some other facets. I think next I want to try harvesting out significant amounts of data. Stay tuned..." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }