{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import logging\n", "import os\n", "import sys\n", "from pathlib import Path\n", "\n", "import click\n", "from dotenv import find_dotenv, load_dotenv\n", "import pandas as pd\n", "import time\n", "import requests\n", "from tqdm import tqdm" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "input_filepath = \"../data/raw/BM_csv_files/3000BC-AD500/\"\n", "\n", "\n", "csv_files = os.listdir(input_filepath)\n", "regions = [\"north_america\", \"asia\", \"europe\", \"africa\", \"south_america\"]\n", "all_dfs = {}\n", "for region in regions:\n", " region_csv_files = [file for file in csv_files if region in file.lower()]\n", " region_df = pd.concat(\n", " [pd.read_csv(os.path.join(input_filepath, file)) for file in region_csv_files]\n", " )\n", " region_df.drop_duplicates(inplace=True, ignore_index=True)\n", " all_dfs[region] = region_df\n", "\n", "# create a master df with a new column for the region\n", "world_df = pd.DataFrame()\n", "for region, df in all_dfs.items():\n", " df[\"region\"] = region\n", " world_df = pd.concat([world_df, df])\n", "\n", "world_df.drop_duplicates(subset=world_df.columns.difference([\"region\"]), inplace=True)" ] }, { "cell_type": "code", "execution_count": 4, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ImageObject typeMuseum numberTitleDenominationEscapementDescriptionProducer nameSchool/styleState...Acq notes (acq)Acq notes (exc)DeptBM/Big numberReg numberAdd idsCat noBanknote serial numberJoined objectsregion
0https://media.britishmuseum.org/media/Reposito...adzeNo: Am1994,09.1NaNNaNNaNAdze? of pecked and ground stone, grooved for ...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm1994,09.1NaNNaNNaNNaNnorth_america
1https://media.britishmuseum.org/media/Reposito...altarNo: Am,S.818NaNNaNNaNThree fragments of burnt clay that formed part...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm,S.818CDMS number: Am1931E1.818 (old CDMS no.); Prev...NaNNaNNaNnorth_america
2https://media.britishmuseum.org/media/Reposito...altarNo: Am,S.817NaNNaNNaNFragments of an altar or crematory basin made ...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm,S.817CDMS number: Am1931E1.817 (old CDMS no.); Prev...NaNNaNNaNnorth_america
3https://media.britishmuseum.org/media/Reposito...amulet; pendantNo: Am.9685NaNNaNNaNChalchihuitl, amulet, pendant made of amazonst...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm.9685CDMS number: Am1876C1.9685 (old CDMS no.); Mis...NaNNaNNaNnorth_america
4https://media.britishmuseum.org/media/Reposito...arrow; pointNo: Am,S.758.a-cNaNNaNNaNThree expanding stem arrow or spear points, ma...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm,S.758.a-cCDMS number: Am1931E1.758a-c (old CDMS no.); M...NaNNaNNaNnorth_america
..................................................................
719https://media.britishmuseum.org/media/Reposito...whistle; figurineNo: Am1954,05.196NaNNaNNaNAnthropomorphic whistle / whistle in the shape...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm1954,05.196NaNNaNNaNNaNsouth_america
720https://media.britishmuseum.org/media/Reposito...whistleNo: Am1954,05.669NaNNaNNaNWhistle made of pottery, possibly modelled and...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm1954,05.669NaNNaNNaNNaNsouth_america
721https://media.britishmuseum.org/media/Reposito...whistleNo: Am1954,05.194NaNNaNNaNAnthropomorphic whistle in the shape of the An...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm1954,05.194Previous owner/ex-collection number: 167687 (W...NaNNaNNaNsouth_america
722https://media.britishmuseum.org/media/Reposito...whistleNo: Am.6877NaNNaNNaNOvoid shaped whistle made of tumbaga by lost-w...NaNNaNNaN...NaNNaNAfrica, Oceania and the AmericasNaNAm.6877CDMS number: Am1870C1.6877 (old CDMS no.); Mis...NaNNaNNaNsouth_america
723https://media.britishmuseum.org/media/Reposito...whistling vessel; jarNo: Am1982,Q.944NaNNaNNaNRectangular spouted jar with bridge and (broke...NaNNaNNaN...Acquisition details unknown.NaNAfrica, Oceania and the AmericasNaNAm1982,Q.944NaNNaNNaNNaNsouth_america
\n", "

205721 rows × 48 columns

\n", "
" ], "text/plain": [ " Image Object type \\\n", "0 https://media.britishmuseum.org/media/Reposito... adze \n", "1 https://media.britishmuseum.org/media/Reposito... altar \n", "2 https://media.britishmuseum.org/media/Reposito... altar \n", "3 https://media.britishmuseum.org/media/Reposito... amulet; pendant \n", "4 https://media.britishmuseum.org/media/Reposito... arrow; point \n", ".. ... ... \n", "719 https://media.britishmuseum.org/media/Reposito... whistle; figurine \n", "720 https://media.britishmuseum.org/media/Reposito... whistle \n", "721 https://media.britishmuseum.org/media/Reposito... whistle \n", "722 https://media.britishmuseum.org/media/Reposito... whistle \n", "723 https://media.britishmuseum.org/media/Reposito... whistling vessel; jar \n", "\n", " Museum number Title Denomination Escapement \\\n", "0 No: Am1994,09.1 NaN NaN NaN \n", "1 No: Am,S.818 NaN NaN NaN \n", "2 No: Am,S.817 NaN NaN NaN \n", "3 No: Am.9685 NaN NaN NaN \n", "4 No: Am,S.758.a-c NaN NaN NaN \n", ".. ... ... ... ... \n", "719 No: Am1954,05.196 NaN NaN NaN \n", "720 No: Am1954,05.669 NaN NaN NaN \n", "721 No: Am1954,05.194 NaN NaN NaN \n", "722 No: Am.6877 NaN NaN NaN \n", "723 No: Am1982,Q.944 NaN NaN NaN \n", "\n", " Description Producer name \\\n", "0 Adze? of pecked and ground stone, grooved for ... NaN \n", "1 Three fragments of burnt clay that formed part... NaN \n", "2 Fragments of an altar or crematory basin made ... NaN \n", "3 Chalchihuitl, amulet, pendant made of amazonst... NaN \n", "4 Three expanding stem arrow or spear points, ma... NaN \n", ".. ... ... \n", "719 Anthropomorphic whistle / whistle in the shape... NaN \n", "720 Whistle made of pottery, possibly modelled and... NaN \n", "721 Anthropomorphic whistle in the shape of the An... NaN \n", "722 Ovoid shaped whistle made of tumbaga by lost-w... NaN \n", "723 Rectangular spouted jar with bridge and (broke... NaN \n", "\n", " School/style State ... Acq notes (acq) Acq notes (exc) \\\n", "0 NaN NaN ... NaN NaN \n", "1 NaN NaN ... NaN NaN \n", "2 NaN NaN ... NaN NaN \n", "3 NaN NaN ... NaN NaN \n", "4 NaN NaN ... NaN NaN \n", ".. ... ... ... ... ... \n", "719 NaN NaN ... NaN NaN \n", "720 NaN NaN ... NaN NaN \n", "721 NaN NaN ... NaN NaN \n", "722 NaN NaN ... NaN NaN \n", "723 NaN NaN ... Acquisition details unknown. NaN \n", "\n", " Dept BM/Big number Reg number \\\n", "0 Africa, Oceania and the Americas NaN Am1994,09.1 \n", "1 Africa, Oceania and the Americas NaN Am,S.818 \n", "2 Africa, Oceania and the Americas NaN Am,S.817 \n", "3 Africa, Oceania and the Americas NaN Am.9685 \n", "4 Africa, Oceania and the Americas NaN Am,S.758.a-c \n", ".. ... ... ... \n", "719 Africa, Oceania and the Americas NaN Am1954,05.196 \n", "720 Africa, Oceania and the Americas NaN Am1954,05.669 \n", "721 Africa, Oceania and the Americas NaN Am1954,05.194 \n", "722 Africa, Oceania and the Americas NaN Am.6877 \n", "723 Africa, Oceania and the Americas NaN Am1982,Q.944 \n", "\n", " Add ids Cat no \\\n", "0 NaN NaN \n", "1 CDMS number: Am1931E1.818 (old CDMS no.); Prev... NaN \n", "2 CDMS number: Am1931E1.817 (old CDMS no.); Prev... NaN \n", "3 CDMS number: Am1876C1.9685 (old CDMS no.); Mis... NaN \n", "4 CDMS number: Am1931E1.758a-c (old CDMS no.); M... NaN \n", ".. ... ... \n", "719 NaN NaN \n", "720 NaN NaN \n", "721 Previous owner/ex-collection number: 167687 (W... NaN \n", "722 CDMS number: Am1870C1.6877 (old CDMS no.); Mis... NaN \n", "723 NaN NaN \n", "\n", " Banknote serial number Joined objects region \n", "0 NaN NaN north_america \n", "1 NaN NaN north_america \n", "2 NaN NaN north_america \n", "3 NaN NaN north_america \n", "4 NaN NaN north_america \n", ".. ... ... ... \n", "719 NaN NaN south_america \n", "720 NaN NaN south_america \n", "721 NaN NaN south_america \n", "722 NaN NaN south_america \n", "723 NaN NaN south_america \n", "\n", "[205721 rows x 48 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "world_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Null values" ] }, { "cell_type": "code", "execution_count": 5, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ColumnNull PercentageNon-Null Countunique_values
0Image0.00205721202525
6Description0.00205721107102
40Dept0.002057219
25Location0.002057211403
14Production date0.0020572112766
47region0.002057215
2Museum number0.00205721196970
1Object type0.002057184199
17Materials0.052056121856
42Reg number3.86197787196674
13Culture4.181971251738
21Dimensions4.52196413115526
15Production place17.441698533494
37Acq date20.69163156566
24Bib references21.6716113413399
33Acq name (acq)29.951441085215
28Subjects44.441143086779
16Find spot47.621077547860
10Authority49.921030301541
22Inscription53.739517847979
29Assoc name54.57934569520
4Denomination57.3987657636
9State62.187780250
20Technique70.98596954003
23Curators Comments74.305286533459
44Cat no78.424438944280
43Add ids84.813124526824
38Acq notes (acq)86.98267825853
36Acq name (previous)89.06224971501
39Acq notes (exc)90.70191321450
27Condition93.39135905438
19Type series94.52112713001
18Ware94.6011116351
41BM/Big number95.8685268474
26Exhibition history95.8785043688
34Acq name (finding)96.756689108
7Producer name98.2535961447
30Assoc place98.722638492
3Title99.002063313
31Assoc events99.88244113
32Assoc titles99.968938
11Ethnic name (made by)99.983218
12Ethnic name (assoc)100.0084
45Banknote serial number100.0011
35Acq name (excavator)100.0000
8School/style100.0000
46Joined objects100.0000
5Escapement100.0000
\n", "
" ], "text/plain": [ " Column Null Percentage Non-Null Count unique_values\n", "0 Image 0.00 205721 202525\n", "6 Description 0.00 205721 107102\n", "40 Dept 0.00 205721 9\n", "25 Location 0.00 205721 1403\n", "14 Production date 0.00 205721 12766\n", "47 region 0.00 205721 5\n", "2 Museum number 0.00 205721 196970\n", "1 Object type 0.00 205718 4199\n", "17 Materials 0.05 205612 1856\n", "42 Reg number 3.86 197787 196674\n", "13 Culture 4.18 197125 1738\n", "21 Dimensions 4.52 196413 115526\n", "15 Production place 17.44 169853 3494\n", "37 Acq date 20.69 163156 566\n", "24 Bib references 21.67 161134 13399\n", "33 Acq name (acq) 29.95 144108 5215\n", "28 Subjects 44.44 114308 6779\n", "16 Find spot 47.62 107754 7860\n", "10 Authority 49.92 103030 1541\n", "22 Inscription 53.73 95178 47979\n", "29 Assoc name 54.57 93456 9520\n", "4 Denomination 57.39 87657 636\n", "9 State 62.18 77802 50\n", "20 Technique 70.98 59695 4003\n", "23 Curators Comments 74.30 52865 33459\n", "44 Cat no 78.42 44389 44280\n", "43 Add ids 84.81 31245 26824\n", "38 Acq notes (acq) 86.98 26782 5853\n", "36 Acq name (previous) 89.06 22497 1501\n", "39 Acq notes (exc) 90.70 19132 1450\n", "27 Condition 93.39 13590 5438\n", "19 Type series 94.52 11271 3001\n", "18 Ware 94.60 11116 351\n", "41 BM/Big number 95.86 8526 8474\n", "26 Exhibition history 95.87 8504 3688\n", "34 Acq name (finding) 96.75 6689 108\n", "7 Producer name 98.25 3596 1447\n", "30 Assoc place 98.72 2638 492\n", "3 Title 99.00 2063 313\n", "31 Assoc events 99.88 244 113\n", "32 Assoc titles 99.96 89 38\n", "11 Ethnic name (made by) 99.98 32 18\n", "12 Ethnic name (assoc) 100.00 8 4\n", "45 Banknote serial number 100.00 1 1\n", "35 Acq name (excavator) 100.00 0 0\n", "8 School/style 100.00 0 0\n", "46 Joined objects 100.00 0 0\n", "5 Escapement 100.00 0 0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "null_percentage = (world_df.isnull().sum() / len(world_df)) * 100\n", "desc_df = pd.DataFrame(\n", " {\"Column\": null_percentage.index, \"Null Percentage\": null_percentage.values}\n", ")\n", "desc_df[\"Null Percentage\"] = desc_df[\"Null Percentage\"].round(2)\n", "desc_df[\"Non-Null Count\"] = world_df.count().values\n", "desc_df[\"unique_values\"] = world_df.nunique().values\n", "desc_df[\"Non-Null Count\"] = world_df.count().values\n", "desc_df = desc_df.sort_values(by=\"Non-Null Count\", ascending=False)\n", "desc_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There could be some interesting information in the more sparsely populated columns, for example the `Inscription` column could result in a cool OCR task, but we have to draw the line somewhere, hence I will drop all columns with more than 50% null values." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "threshold = len(world_df) * 0.5\n", "world_df.dropna(thresh=threshold, axis=1, inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysing each column" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "for column in world_df.columns:\n", " try:\n", " non_null_examples = world_df[column].dropna().sample(10)\n", " print(\n", " f\"Column: {column}, Non-null count: {desc_df[desc_df['Column'] == column]['Non-Null Count'].values[0]}, Unique values: {desc_df[desc_df['Column'] == column]['unique_values'].values[0]}\"\n", " )\n", " print(non_null_examples.values)\n", " except:\n", " print(f\"Column: {column}\")\n", " print(\"No non-null examples found\")\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### Column: Image, Non-null count: 205721, Unique values: 202525\n", "```\n", "['https://media.britishmuseum.org/media/Repository/Documents/2014_10/11_10/6acbde4c_52c8_482b_a420_a3c100ae572e/preview_00630152_001.jpg'\n", "...\n", " 'https://media.britishmuseum.org/media/Repository/Documents/2022_1/31_15/b9873170_4632_4d7c_92b4_ae2e00f9efa1/preview_ERC_Cab_118_OFFICIAL_01020.jpg']\n", " ```\n", "\n", "Could be the best option for an index column: **keep**\n", "### Column: Production date, Non-null count: 205721, Unique values: 12766\n", "```\n", "['3rdC-7thC' '253-260' '1700BC-1000BC' '400BC-300BC (?)' '550BC-510BC'\n", " '3rdC-7thC' '450-457' '190-230 (circa)' '238-244' '5thC BC-4thC BC']\n", "```\n", "I like this as a regression task, but I will have to do some cleaning first: **keep**\n", "### Column: Dept, Non-null count: 205721, Unique values: 9\n", "```\n", "['Britain, Europe and Prehistory' 'Britain, Europe and Prehistory'\n", " 'Middle East' 'Money and Medals' 'Greek and Roman' 'Greek and Roman'\n", " 'Greek and Roman' 'Greek and Roman' 'Greek and Roman' 'Money and Medals']\n", "```\n", "Too broad: **drop**\n", "### Column: Location, Non-null count: 205721, Unique values: 1403\n", "```\n", "['Not on display' 'Not on display' 'Not on display' 'Not on display'\n", " 'Not on display' 'Not on display' 'Not on display' 'Not on display'\n", " 'Not on display' 'Not on display']\n", "```\n", "\n", "Useless: **drop**\n", "### Column: region, Non-null count: 205721, Unique values: 5\n", "```\n", "['europe' 'asia' 'europe' 'europe' 'asia' 'asia' 'europe' 'europe' 'asia'\n", " 'asia']\n", "```\n", "The column I added, could be useful for splitting the data into smaller datasets if the world is too big: **keep**\n", "### Column: Description, Non-null count: 205721, Unique values: 107102\n", "```\n", "['Pottery: red-figured squat lekythos.\\r\\nAphrodite and a young hunter (Adonis?). In the centre, Aphrodite (flesh coloured white) is seated on raised ground to left, with a mantle over her legs, leaning on her left hand; her face and right arm are missing; she wears a radiated fillet, necklace of beads, and bracelets. Confronting her on left is seated a youth in a chlamys and a Phrygian cap, resting his left hand on the end of his club, the head of which rests on the ground beside him; his left elbow is placed in the hollow between the branch and trunk of a tree which springs from the ground on his left. His face, which is broken away, seems to be turned to the front. Behind Aphrodite, Eros flies towards her, and appears to be clasping her round the neck; his face is damaged; he wears a fillet. On the right is a group of two women: one is seated on raised ground, and holds out in her right hand to left a wreath of laurel (part missing), of which her left hand probably held the other end. Behind her stands a woman who rests one hand on either shoulder of the seated figure; her drapery flies back as if she were in quick movement, though her feet are together. On the left a third woman stands looking to right, leaning forward with left knee raised, and resting her left elbow in another hollow of the tree. All the women wear a long chiton tied, earrings, necklace, and bracelets, and their hair is knotted high with a fillet. In the ground, branches of laurel spring up.\\r\\nBelow, egg pattern; above, a kind of alternate palmette and lotus; round neck, tongue pattern. Below the handle, a pattern composed of four palmettes with tendrils.'\n", "\n", " 'Silver coin.; Head of Septimius Severus, laureate, right.; Victory standing right, left foot on globe, with right hand inscribing shield set on column and holding palm-branch in left hand over left shoulder.'\n", "\n", " 'Fragment of an iron arrow-head.' 'Alloy coin.'\n", "\n", " 'Silver coin.; Silphium.; Ammon Head.' 'Copper alloy coin.'\n", "\n", " 'Gold coin.; Blank.; Stylised horse, right.' 'Silver coin.'\n", "\n", " 'Bronze openwork bell-shaped horse-harness ornaments.'\n", " \n", " 'Fragment of Rhodian pottery transport amphora; neck and rising handle to sharpish turn; clay fine pink-buff with cream slip; rectangular stamp.']\n", "```\n", "This is the most interesting text column, with a lot of unique values. Just from the examples above, we can see that some of the descriptions are quite detailed, whereas others are shorter.\n", "\n", "Only half of the items have a unique description however, so I will need to explore further.\n", "\n", "**keep**\n", "\n", "\n", "### Column: Museum number, Non-null count: 205721, Unique values: 196970\n", "```\n", "['No: 1994,0915.680' 'No: 1933,0214.689' 'No: 1910,0610.21'\n", " 'No: 1909,0503.10' 'No: 1998,0118.2752' 'No: 1814,0704.1886'\n", " 'No: 1913,1119.15' 'No: 1864,1007.1907.+' 'No: IOLC.3415'\n", " 'No: 1981,1219.116']\n", "```\n", "Looks to be the same as the `Reg number` column, but just with a `No:` prefix.: **drop**\n", "\n", "### Column: Object type, Non-null count: 205718, Unique values: 4199\n", "```\n", "['coin' 'transport amphora' 'finger-ring' 'box' 'buckle' 'coin; forgery'\n", " 'panel' 'coin' 'coin' 'coin']\n", "```\n", "\n", "A good option for a high level classification task: **keep**\n", "### Column: Materials, Non-null count: 205612, Unique values: 1856\n", "```\n", "['copper alloy' 'copper alloy' 'copper alloy' 'silver' 'sandstone' 'alloy'\n", " 'alloy' 'copper alloy' 'silver' 'alloy' 'human tissue; linen; wood']\n", "```\n", "Good for a high level classification task: **keep**\n", "\n", "I have found at least one instance of a value with multiple materials, so I will have to think about whether this should be a multi-class classification task or leave it as is.\n", "\n", "Will need to do some analysis on the distribution of labels.\n", "### Column: Reg number, Non-null count: 197787, Unique values: 196674\n", "```\n", "['1887,0108.4' 'R.10443' '2002,0101.686' '1908,0110.1816' 'R.3790'\n", " '1969,0401.207' 'B.427' 'R.15402' '1992,0302.106' '1884,1213.21']\n", "```\n", "\n", "Not a good index column, but can be used to look up items on the collection website: **keep**\n", "### Column: Culture, Non-null count: 197125, Unique values: 1738\n", "```\n", "['Middle Helladic' 'Roman Imperial' 'Greco-Bactrian' 'Greek'\n", " 'Mesopotamian' 'Roman Republican' 'Greek' 'Roman Imperial'\n", " 'Roman Imperial' 'Greek']\n", "```\n", "Good option for a high level classification task: **keep**\n", "### Column: Dimensions, Non-null count: 196413, Unique values: 115526\n", "```\n", "[\"Die-axis: 6 o'clock; Weight: 8.019 grammes\" 'Height: 0.50 centimetres'\n", " \"Die-axis: 12 o'clock; Diameter: 20 millimetres; Weight: 4.29 grammes\"\n", " 'Length: 228.60 centimetres; Width: 157.48 centimetres; Depth: 15.24 centimetres'\n", " \"Die-axis: 12 o'clock; Diameter: 13 millimetres maximum ; Weight: 2.030 grammes\"\n", " 'Weight: 5.680 grammes'\n", " 'Diameter: 21.90 centimetres spout to handle ; Diameter: 10.10 centimetres; Height: 9.20 centimetres; Weight: 166 grammes'\n", " 'Weight: 7.500 grammes' \"Die-axis: 7 o'clock; Weight: 6.460 grammes\"\n", " 'Length: 25 inches']\n", "```\n", "Looks too irregular for a tabular prediction task (for example, different diameter values for spout to handle and just diameter), and i don't think it would be useful for a text prediction task either. I will **drop** this column.\n", "### Column: Production place, Non-null count: 169853, Unique values: 3494\n", "```\n", "['Minted in: Prusa ad Olympum; Associated with: Roman Empire'\n", " 'Minted in: Syracuse (historic - Sicily)' 'Made in: Rhodes'\n", " 'Minted in: Rome (city); Associated with: Roman Empire'\n", " 'Minted in: Gaul'\n", " 'Minted in: Rome (city); Associated with: Roman Empire'\n", " 'Minted in: Nicopolis (Epirus); Associated with: Roman Empire'\n", " 'Minted in: Gaul; Associated with: Roman Empire' 'Minted in: Andros'\n", " 'Minted in: Rome (city); Associated with: Roman Empire']\n", "```\n", "Decent option for a high level classification task, although more null values than others: **keep**\n", "\n", "### Column: Acq date, Non-null count: 163156, Unique values: 566\n", "```\n", "['1927' '1920' '1931' '1799' '1983' '2004' '1937' '1927' '1847'\n", " '21/3/2022']\n", "```\n", "\n", "Useless: **drop**\n", "### Column: Bib references, Non-null count: 161134, Unique values: 13399\n", "```\n", "['RE4 / Coins of the Roman Empire in the British Museum, vol.IV: Antoninus Pius to Commodus. Introduction, indexes and plates.; RIC3 / The Roman imperial coinage, vol. 3: Antoninus Pius to Commodus (type)'\n", " 'RIC8 / The Roman Imperial Coinage, vol. 8: the family of Constantine I, AD 337-364'\n", " 'Vase / Catalogue of Vases in the British Museum'\n", " 'Sculpture / Catalogue of Greek Sculpture in the British Museum; Jenkins 1994 / The Parthenon Frieze'\n", " 'Villing et al 2013-2015 / Naukratis: Greeks in Egypt (Phase 3); Petrie 1886 / Naukratis. Part I., 1884-85'\n", " 'RE3 / Coins of the Roman Empire in the British Museum, vol.III: Nerva to Hadrian; Strack (Hadrian) / Die Reichspraegung zur Zeit des Hadrian; RIC2 / The Roman imperial coinage, vol. 2: Vespasian to Hadrian (type); RIC2.3 / The Roman Imperial Coinage, vol. II - part 3 from AD 117-138 Hadrian'\n", " 'RRC / Roman Republican Coinage; RR1 / Coins of the Roman Republic in the British Museum: vol. 1 aes rude, aes signatum, aes grave, and coinage of Rome from B.C. 268.; Ghey, Leins & Crawford 2010 / A catalogue of the Roman Republican Coins in the British Museum, with descriptions and chronology based on M.H. Crawford, Roman Republican Coinage (1974)'\n", " 'RIC4 / The Roman imperial coinage, vol. 4: Pertinax - Uranius Antonius (type)'\n", " 'Price 1991 / The Coinage in the name of Alexander the Great and Philip Arridhaeus. A British Museum Catalogue.'\n", " 'Sellwood 1980 / An Introduction to the Coinage of Parthia']\n", "```\n", "\n", "Useless: **drop**\n", "### Column: Acq name (acq), Non-null count: 144108, Unique values: 5215\n", "```\n", "['Donated by: Ephesus Excavation Committee' 'Purchased from: R Teather'\n", " \"Purchased from: Sir Edward Herbert Bunbury, 9th Baronet (estate of); Purchased through: Sotheby's (December 1896); Purchased through: Rollin & Feuardent\"\n", " 'Treasure Trove: HM Treasury'\n", " \"Purchased from: Dr Nott; Purchased through: Sotheby's (30/5/1842)\"\n", " 'Transferred from: India Museum' 'Purchased from: James Millingen'\n", " 'Purchased from: Rollin & Feuardent'\n", " 'Purchased from: Peregrine Edward Towneley'\n", " 'Purchased from: Auguste Salzmann; Purchased from: Sir Alfred Biliotti']\n", "```\n", "\n", "Useless: **drop**\n", "### Column: Subjects, Non-null count: 114308, Unique values: 6779\n", "```\n", "['horse/ass; charioteer/chariot-racing; funeral/funerary rite'\n", " 'mammal; symbol' \n", " 'classical deity; mammal; triton'\n", " 'classical deity; cherub/cupid; mammal'\n", " 'emperor/empress; classical deity' \n", " 'emperor/empress; boat/ship'\n", " 'mammal; mythical figure/creature' \n", " 'mammal' \n", " 'classical deity; mammal'\n", " 'mammal']\n", "```\n", "Image to multi-class classification task might be interesting: **keep**\n", "\n", "Seems like entities are just separated by a semi colon\n", "### Column: Find spot, Non-null count: 107754, Unique values: 7860\n", "```\n", "['Excavated/Findspot: Naukratis'\n", " 'Excavated/Findspot: Stonea (Field Baulk hoard)'\n", " 'Found/Acquired: Netherhampton (Salisbury hoard)'\n", " 'Excavated/Findspot: Ur (historic - city)'\n", " 'Excavated/Findspot: Tell Taya' 'Excavated/Findspot: Enkomi'\n", " 'Excavated/Findspot: Susa' 'Excavated/Findspot: Enkomi'\n", " 'Excavated/Findspot: Corbridge'\n", " 'Excavated/Findspot: Sanctuary of Artemis Orthia (Lacedaemon)']\n", "```\n", "Too specific: **drop**\n", "### Column: Authority, Non-null count: 103030, Unique values: 1541\n", "```\n", "['Huvishka' 'Anonymous' 'N Fabius Pictor' 'Wima Takto' 'Titus' 'Huvishka'\n", " 'Hadrian' 'Tiberius' 'Maxentius'\n", " 'Augustus (Octavian); P Petronius Turpilianus']\n", "```\n", "\n", "I see a couple of Roman emperors in there, so it is an option for a high level classification task, but not as good as others. \n", "Also a lot of null values and could have a lot of 'Anonymous' values: **drop**\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "world_df.drop(\n", " [\n", " \"Museum number\",\n", " \"Dept\",\n", " \"Location\",\n", " \"Dimensions\",\n", " \"Acq date\",\n", " \"Bib references\",\n", " \"Acq name (acq)\",\n", " \"Find spot\",\n", " \"Authority\",\n", " ],\n", " axis=1,\n", " inplace=True,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Investigating images that appear multiple times" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Image\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/2_20/f3c887a6_eb2a_4ef6_abd4_a3b8014ab8b8/preview_00329027_001.jpg 40\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/2_16/8eacd3a4_b417_407d_a8ed_a3b80116ba24/preview_00198824_001.jpg 38\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/16_14/3b899983_22f5_43c2_8a40_a3c600e97162/preview_01016240_001.jpg 37\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/1_6/7b94705c_2aed_4c92_a14c_a3b700711952/preview_00033787_001.jpg 26\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/1_12/765e9aca_c6cd_4969_9009_a3b700cbda32/preview_00060253_001.jpg 21\n", " ..\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_11/4_22/9d0ed056_2b66_4b6c_a005_a3d9016f3fc6/preview_01114601_001.jpg 2\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/4_21/4cd34596_f7c0_4838_8c56_a3ba015ed5e4/preview_00263455_001.jpg 2\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/1_7/d2947a6a_4ba4_4faf_9867_a3b700744c3f/preview_00034574_001.jpg 2\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/6_8/a6dbc056_74e5_4473_ae8c_a3bc0093592e/preview_00396916_001.jpg 2\n", "https://media.britishmuseum.org/media/Repository/Documents/2014_10/2_21/716e0100_c932_4011_aceb_a3b801693f1d/preview_00337334_001.jpg 2\n", "Name: count, Length: 1406, dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "non_unique_images = world_df[world_df.duplicated(subset=\"Image\", keep=False)]\n", "non_unique_images[\"Image\"].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are some images that contain multiple items, such as the image of the 5 flints below. In this case, the same image appears multiple times in the dataset, but with different metadata for each item.\n", "\n", "\n", "![](https://media.britishmuseum.org/media/Repository/Documents/2014_10/16_12/4b546ebc_0383_44c9_aa0b_a3c600d4c7b9/preview_01009877_001.jpg)\n", "\n", "More examples:\n", "\n", "![](https://media.britishmuseum.org/media/Repository/Documents/2014_10/1_6/7b94705c_2aed_4c92_a14c_a3b700711952/preview_00033787_001.jpg )\n", "![](https://media.britishmuseum.org/media/Repository/Documents/2014_10/16_14/3b899983_22f5_43c2_8a40_a3c600e97162/preview_01016240_001.jpg )\n", "![](https://media.britishmuseum.org/media/Repository/Documents/2014_10/2_21/716e0100_c932_4011_aceb_a3b801693f1d/preview_00337334_001.jpg )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I think it is best to drop these images. Not being unique means that I can't use them as an index column and also I wouldn't want the same image appearing in the training and test set." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "world_df = world_df[~world_df.duplicated(subset=\"Image\", keep=False)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Potential columns for Multi-label classification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Materials" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looking at the examples below, as well as the overall small number of multi-label instances, it seems to be a case of a primary and secondary material, with the primary material being the first in the list. \n", "\n", "Taking the first material only seems like it would be a fine simplification." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of non-null instances: 201017\n", "Number of instances with multiple classes: 6065\n", "Number of unique class groups: 1541\n", "Number of instances with single class: 194952\n", "Number of unique classes from singles: 239\n" ] } ], "source": [ "print(\"Number of non-null instances:\", world_df[\"Materials\"].notnull().sum())\n", "\n", "materials_semicolon = world_df[world_df[\"Materials\"].str.contains(\";\", regex=False, na=False)]\n", "# materials_no_semicolon = world_df[~world_df['Materials'].str.contains(';')]\n", "num_instances = len(materials_semicolon)\n", "num_classes = len(materials_semicolon[\"Materials\"].unique())\n", "\n", "print(\"Number of instances with multiple classes:\", num_instances)\n", "print(\"Number of unique class groups:\", num_classes)\n", "\n", "materials_no_semicolon = world_df[\n", " ~world_df[\"Materials\"].str.contains(\";\", na=False) & world_df[\"Materials\"].notnull()\n", "]\n", "print(\"Number of instances with single class:\", len(materials_no_semicolon))\n", "print(\"Number of unique classes from singles:\", len(materials_no_semicolon[\"Materials\"].unique()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "materials_semicolon['Materials'].sample(20).values.tolist()\n", "```\n", "```\n", "['copper; silver',\n", " 'steatite; glazed composition',\n", " 'iron; wood',\n", " 'fired clay; 陶器',\n", " 'hemp; 麻',\n", " 'iron; wood',\n", " 'cornelian; silver',\n", " 'silver; electrum',\n", " 'silver; gold',\n", " 'stucco; 灰泥',\n", " 'copper alloy; gold; garnet',\n", " 'lapis lazuli; gold',\n", " 'goat horn; sheep horn',\n", " 'pottery; stone; bitumen',\n", " 'silver; glass',\n", " 'stone; rhyolite',\n", " 'jasper; 碧玉',\n", " 'reed; fibre',\n", " 'iron; organic',\n", " 'stone; pottery']\n", "```\n", "\n", "We have some non-english characters in there.\n", "\n", "One option is to take the first material as the primary material, the other is to drop the rows with multiple materials." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of classes per instance: Materials\n", "2 4770\n", "3 954\n", "4 245\n", "5 59\n", "6 26\n", "8 5\n", "7 5\n", "9 1\n", "Name: count, dtype: int64\n" ] } ], "source": [ "classes_per_instance = materials_semicolon[\"Materials\"].str.split(\";\").apply(len)\n", "print(f\"Number of classes per instance: {classes_per_instance.value_counts()}\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Materials: silver alloy; gold\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Materials: pottery; ceramic; earthenware\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Materials: bronze; turquoise\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Materials: shell; lapis lazuli\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Materials: stucco; 灰泥\n", "------------------------\n" ] } ], "source": [ "from IPython.display import display, Image\n", "\n", "# Take 10 samples of 'Object type' and 'Image' columns\n", "samples = materials_semicolon[[\"Materials\", \"Image\"]].sample(5)\n", "\n", "# Display the images and their associated 'Object type'\n", "for index, row in samples.iterrows():\n", " display(Image(url=row[\"Image\"]))\n", " print(\"Materials:\", row[\"Materials\"])\n", " print(\"------------------------\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Subjects" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Subjects seem to be looking at the people/animals/objects that appear in the artifact. \n", "\n", "A lot of coins are appearing in the examples of multi-subject images below, with the multi-subjects being the different animals or people that appear on the coin.\n", "\n", "A genuine multi-label classification task.\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of non-null instances: 112829\n", "Number of instances with multiple classes: 76222\n", "Number of unique class groups: 6120\n", "Number of instances with single class: 36607\n", "Number of unique classes from singles: 523\n", "Number of instances with single class, including first of multi-class: 112829\n", "Number of unique classes , including first of multi-class: 663\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_425911/2410717160.py:17: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " subjects_semicolon[\"Subjects\"] = subjects_semicolon[\"Subjects\"].str.split(\";\").str[0]\n" ] } ], "source": [ "print(\"Number of non-null instances:\", world_df[\"Subjects\"].notnull().sum())\n", "\n", "subjects_semicolon = world_df[world_df[\"Subjects\"].str.contains(\";\", regex=False, na=False)]\n", "num_instances = len(subjects_semicolon)\n", "num_classes = len(subjects_semicolon[\"Subjects\"].unique())\n", "\n", "print(\"Number of instances with multiple classes:\", num_instances)\n", "print(\"Number of unique class groups:\", num_classes)\n", "\n", "subjects_no_semicolon = world_df[\n", " ~world_df[\"Subjects\"].str.contains(\";\", na=False) & world_df[\"Subjects\"].notnull()\n", "]\n", "print(\"Number of instances with single class:\", len(subjects_no_semicolon))\n", "print(\"Number of unique classes from singles:\", len(subjects_no_semicolon[\"Subjects\"].unique()))\n", "\n", "\n", "subjects_semicolon[\"Subjects\"] = subjects_semicolon[\"Subjects\"].str.split(\";\").str[0]\n", "subjects_no_semicolon = world_df[\n", " ~world_df[\"Subjects\"].str.contains(\";\", na=False) & world_df[\"Subjects\"].notnull()\n", "]\n", "subjects_no_semicolon = pd.concat([subjects_no_semicolon, subjects_semicolon])\n", "print(\n", " \"Number of instances with single class, including first of multi-class:\",\n", " len(subjects_no_semicolon),\n", ")\n", "print(\n", " \"Number of unique classes , including first of multi-class:\",\n", " len(subjects_no_semicolon[\"Subjects\"].unique()),\n", ")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of classes per instance: Subjects\n", "2 41673\n", "3 28095\n", "4 4920\n", "5 1077\n", "6 287\n", "7 94\n", "8 32\n", "9 20\n", "10 10\n", "13 5\n", "11 4\n", "16 2\n", "15 1\n", "14 1\n", "12 1\n", "Name: count, dtype: int64\n" ] } ], "source": [ "subjects_semicolon = world_df[world_df[\"Subjects\"].str.contains(\";\", regex=False, na=False)]\n", "classes_per_instance = subjects_semicolon[\"Subjects\"].str.split(\";\").apply(len)\n", "print(\"Number of classes per instance:\", classes_per_instance.value_counts())" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Subjects: tree/bush; amphibian (frog)\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Subjects: royal/imperial; cart/wagon; equestrian\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Subjects: classical deity; allegory/personification; mythical figure/creature\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Subjects: deity; devotee/worshipper\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Subjects: king/queen; peacock\n", "------------------------\n" ] } ], "source": [ "from IPython.display import display, Image\n", "\n", "# Take 10 samples of 'Object type' and 'Image' columns\n", "samples = subjects_semicolon[[\"Subjects\", \"Image\"]].sample(5)\n", "\n", "# Display the images and their associated 'Object type'\n", "for index, row in samples.iterrows():\n", " display(Image(url=row[\"Image\"]))\n", " print(\"Subjects:\", row[\"Subjects\"])\n", " print(\"------------------------\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Object type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Only 11k/201k have multiple labels\n", "\n", "With single labels only, we have 1218 labels. Including the first label of the multi-labels, we have 1337 labels.\n", "\n", "Seems to be a primary and secondary description, so I think it is fair to drop only use the first label all items." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of non-null instances: 201116\n", "Number of instances with multiple classes: 12088\n", "Number of unique class groups: 2846\n", "Number of instances with single class: 189028\n", "Number of unique classes from singles: 1218\n", "Number of instances with single class, including first of multi-class: 201116\n", "Number of unique classes , including first of multi-class: 1337\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_425911/1440965513.py:16: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " object_semicolon[\"Object type\"] = object_semicolon[\"Object type\"].str.split(\";\").str[0]\n" ] } ], "source": [ "print(\"Number of non-null instances:\", world_df[\"Object type\"].notnull().sum())\n", "\n", "object_semicolon = world_df[world_df[\"Object type\"].str.contains(\";\", regex=False, na=False)]\n", "num_instances = len(object_semicolon)\n", "num_classes = len(object_semicolon[\"Object type\"].unique())\n", "\n", "print(\"Number of instances with multiple classes:\", num_instances)\n", "print(\"Number of unique class groups:\", num_classes)\n", "\n", "object_no_semicolon = world_df[\n", " ~world_df[\"Object type\"].str.contains(\";\", na=False) & world_df[\"Object type\"].notnull()\n", "]\n", "print(\"Number of instances with single class:\", len(object_no_semicolon))\n", "print(\"Number of unique classes from singles:\", len(object_no_semicolon[\"Object type\"].unique()))\n", "\n", "object_semicolon[\"Object type\"] = object_semicolon[\"Object type\"].str.split(\";\").str[0]\n", "object_no_semicolon = world_df[\n", " ~world_df[\"Object type\"].str.contains(\";\", na=False) & world_df[\"Object type\"].notnull()\n", "]\n", "object_no_semicolon = pd.concat([object_no_semicolon, object_semicolon])\n", "print(\n", " \"Number of instances with single class, including first of multi-class:\",\n", " len(object_no_semicolon),\n", ")\n", "print(\n", " \"Number of unique classes , including first of multi-class:\",\n", " len(object_no_semicolon[\"Object type\"].unique()),\n", ")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of classes per instance: Object type\n", "1 12088\n", "Name: count, dtype: int64\n" ] } ], "source": [ "classes_per_instance = object_semicolon[\"Object type\"].str.split(\";\").apply(len)\n", "print(\"Number of classes per instance:\", classes_per_instance.value_counts())" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Object type: cup\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Object type: stemmed dish\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Object type: figure\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Object type: figure\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Object type: textile\n", "------------------------\n" ] } ], "source": [ "from IPython.display import display, Image\n", "\n", "# Take 10 samples of 'Object type' and 'Image' columns\n", "samples = object_semicolon[[\"Object type\", \"Image\"]].sample(5)\n", "\n", "# Display the images and their associated 'Object type'\n", "for index, row in samples.iterrows():\n", " display(Image(url=row[\"Image\"]))\n", " print(\"Object type:\", row[\"Object type\"])\n", " print(\"------------------------\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Culture" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I think this is a genuine multi-label classification task: looking at the examples below I have seen 'Helenistic' appear before 'Classical Greek' or before 'Ptolemaic'\n", "\n", "Also there are examples of a spread of eras for the same item, perhaps for those where the date is unclear.\n", "\n", "However, there is a difficulty in that there are only 20k/193k which have multiple labels" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of non-null instances: 192729\n", "Number of instances with multiple classes: 20242\n", "Number of unique class groups: 1240\n", "Number of instances with single class: 172487\n", "Number of unique classes from singles: 464\n", "Number of instances with single class, including first of multi-class: 192729\n", "Number of unique classes , including first of multi-class: 508\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_425911/1536071001.py:16: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " culture_semicolon[\"Culture\"] = culture_semicolon[\"Culture\"].str.split(\";\").str[0]\n" ] } ], "source": [ "print(\"Number of non-null instances:\", world_df[\"Culture\"].notnull().sum())\n", "\n", "culture_semicolon = world_df[world_df[\"Culture\"].str.contains(\";\", regex=False, na=False)]\n", "num_instances = len(culture_semicolon)\n", "num_classes = len(culture_semicolon[\"Culture\"].unique())\n", "\n", "print(\"Number of instances with multiple classes:\", num_instances)\n", "print(\"Number of unique class groups:\", num_classes)\n", "\n", "culture_no_semicolon = world_df[\n", " ~world_df[\"Culture\"].str.contains(\";\", na=False) & world_df[\"Culture\"].notnull()\n", "]\n", "print(\"Number of instances with single class:\", len(culture_no_semicolon))\n", "print(\"Number of unique classes from singles:\", len(culture_no_semicolon[\"Culture\"].unique()))\n", "\n", "culture_semicolon[\"Culture\"] = culture_semicolon[\"Culture\"].str.split(\";\").str[0]\n", "culture_no_semicolon = world_df[\n", " ~world_df[\"Culture\"].str.contains(\";\", na=False) & world_df[\"Culture\"].notnull()\n", "]\n", "culture_no_semicolon = pd.concat([culture_no_semicolon, culture_semicolon])\n", "print(\n", " \"Number of instances with single class, including first of multi-class:\",\n", " len(culture_no_semicolon),\n", ")\n", "print(\n", " \"Number of unique classes , including first of multi-class:\",\n", " len(culture_no_semicolon[\"Culture\"].unique()),\n", ")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of classes per instance: Culture\n", "2 18538\n", "3 1560\n", "4 101\n", "6 39\n", "5 3\n", "7 1\n", "Name: count, dtype: int64\n" ] } ], "source": [ "culture_semicolon = world_df[world_df[\"Culture\"].str.contains(\";\", regex=False, na=False)]\n", "classes_per_instance = culture_semicolon[\"Culture\"].str.split(\";\").apply(len)\n", "print(\"Number of classes per instance:\", classes_per_instance.value_counts())" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: East Greek; Archaic Greek\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Ptolemaic; Late Period\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Iron Age; Greek\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: East Greek; Archaic Greek\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Iron Age; Hallstatt D; La Tène I\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Western Greek; Etruscan\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Attic; Classical Greek\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Classical Greek; Hellenistic\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Roman; Hellenistic\n", "------------------------\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Culture: Old Babylonian; Isin-Larsa\n", "------------------------\n" ] } ], "source": [ "from IPython.display import display, Image\n", "\n", "# Take 10 samples of 'Culture' and 'Image' columns\n", "samples = culture_semicolon[[\"Culture\", \"Image\"]].sample(10)\n", "\n", "# Display the images and their associated 'Culture'\n", "for index, row in samples.iterrows():\n", " display(Image(url=row[\"Image\"]))\n", " print(\"Culture:\", row[\"Culture\"])\n", " print(\"------------------------\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Concluding thoughts on multi-label columns\n", "\n", "**Object type**: use the first label only, only 11k/201k have multiple labels\n", "\n", "**Culture**: could be a multi-label classification task, but only 20k/193k have multiple labels, so first label only\n", "\n", "**Materials**: use the first label only, seems to be primary and secondary materials, only 6k/201k have multiple labels\n", "\n", "**Subjects**: definitely a multi-label classification task, 76k/113k have multiple labels" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_425911/3353630846.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " world_df[world_df[\"Object type\"].str.contains(\";\", regex=False, na=False)] = world_df[\n", "/tmp/ipykernel_425911/3353630846.py:4: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " world_df[world_df[\"Culture\"].str.contains(\";\", regex=False, na=False)] = world_df[\n", "/tmp/ipykernel_425911/3353630846.py:7: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " world_df[world_df[\"Materials\"].str.contains(\";\", regex=False, na=False)] = world_df[\n" ] } ], "source": [ "world_df[world_df[\"Object type\"].str.contains(\";\", regex=False, na=False)] = world_df[\n", " world_df[\"Object type\"].str.contains(\";\", regex=False, na=False)\n", "].apply(lambda x: x.str.split(\";\").str[0])\n", "world_df[world_df[\"Culture\"].str.contains(\";\", regex=False, na=False)] = world_df[\n", " world_df[\"Culture\"].str.contains(\";\", regex=False, na=False)\n", "].apply(lambda x: x.str.split(\";\").str[0])\n", "world_df[world_df[\"Materials\"].str.contains(\";\", regex=False, na=False)] = world_df[\n", " world_df[\"Materials\"].str.contains(\";\", regex=False, na=False)\n", "].apply(lambda x: x.str.split(\";\").str[0])" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['1-1600 (?)',\n", " '200BC - 400AD',\n", " '200BC - 400AD',\n", " '400 - 800',\n", " '1000BC - 400AD',\n", " '200BC - 400AD',\n", " '1500BC - 500BC',\n", " '200BC - 1000AD',\n", " '200BC - 400AD',\n", " '200BC - 400AD',\n", " '500 - 1000AD',\n", " '3000BC - 500BC',\n", " '11,000BC - 8000BC',\n", " '300 - 1200',\n", " '200BC-400',\n", " '6000BC - 1000BC',\n", " '6000BC - 1000BC',\n", " '6000BC - 1000BC',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '250AD - 900AD',\n", " '1-1800',\n", " '1300BC - 700BC',\n", " '200BC - 400AD',\n", " '200BC- 400 AD',\n", " '200BC - 400AD',\n", " '200BC-500',\n", " '200BC - 400AD',\n", " '200BC-400',\n", " '200BC - 400AD',\n", " '200BC- 400AD',\n", " '200BC - 400AD',\n", " '200BC-400',\n", " '200BC - 400AD',\n", " '200BC - 400AD',\n", " '200BC-400AD',\n", " '1700 BC - 150 BC',\n", " '400 BC-AD 400 (This is carved in Marpole Culture style, and it may be of this period and culture); 1900-1949 (Further work is required to date this bowl; it may have made by or for R A Brooks, from whom Inverarity acquired it in 1949.)',\n", " '200BC-500',\n", " '150 BC - 750',\n", " '1000BC - 200AD',\n", " '200BC - 400AD',\n", " '1200BC - 150AD',\n", " '200BC - 400AD',\n", " '200BC - 400AD (?)',\n", " '200BC-1000',\n", " '250AD - 900AD',\n", " '1000BC - 200AD (?)',\n", " '1000BC - 200BC',\n", " '200BC - 400AD',\n", " '200BC - 400AD',\n", " '1000BC - 200BC (?)',\n", " '1000BC - 200BC',\n", " '1000BC - 200BC',\n", " '1000BC - 400AD',\n", " '200BC - 400AD (?)',\n", " '200BC-1000 (?)',\n", " '1200 BC - 400 BC',\n", " '300-1200',\n", " '1-500',\n", " '300-1200',\n", " '200BC - 1520AD',\n", " '200BC - 1520AD',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '200BC-400',\n", " '1000BC - 200AD',\n", " '300-900',\n", " '1200 BC - 400 BC',\n", " '300 BC - AD 300',\n", " '400BC-AD400 (Marpole Culture)',\n", " '150 BC - AD 750',\n", " '300-1200',\n", " '100 BC - 750',\n", " '150 BC - AD 750',\n", " '1500 BC - 900 BC',\n", " '300BC-300AD',\n", " '300-1200',\n", " '200BC-500',\n", " '300 BC - AD 300',\n", " '200BC-500',\n", " '100 BC - AD 750',\n", " '100 BC-AD 750',\n", " '200BC-500',\n", " '150 BC - 750',\n", " '150 BC - AD 750',\n", " '300 BC - AD 300',\n", " '200BC-500',\n", " '200BC-500',\n", " '300 BC - AD 300',\n", " '200BC-500',\n", " '150BC - AD750',\n", " '150BC - AD750',\n", " '200BC-500',\n", " '1500 BC - 900 BC',\n", " '1500BC - 900BC',\n", " '300 BC - AD 300',\n", " '150BC - AD750',\n", " '150BC - AD750',\n", " '1700 BC - 150 BC',\n", " '250-900 (?)',\n", " '250-900',\n", " '700BC-1560s',\n", " '100 BC - AD 750',\n", " '1200BC-400BC (circa)',\n", " '250-900',\n", " '150BC - AD750',\n", " '100 BC-AD 750',\n", " '250-900',\n", " '100 BC - AD 750',\n", " '1200BC - 400BC',\n", " '150BC - 400AD',\n", " '100 BC - AD 750',\n", " '1500 BC - 900 BC',\n", " '200BC-500',\n", " '1500 BC - 900 BC',\n", " '1500 BC - 900 BC',\n", " '150BC - AD750',\n", " '150BC - AD750',\n", " '150 BC - AD 750',\n", " '1500BC - 900BC',\n", " '400BC-100BC',\n", " '1500BC - 900BC',\n", " '200BC - 1520AD',\n", " '200 BC - AD 800',\n", " '700BC-1560s',\n", " '700BC-1560s',\n", " '700BC-1560s',\n", " '700BC-1560s',\n", " '1000BC - 200AD']" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "world_df[\"Production date\"].values[:150].tolist()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 adze\n", "1 altar\n", "2 altar\n", "3 amulet\n", "4 arrow\n", " ... \n", "719 whistle\n", "720 whistle\n", "721 whistle\n", "722 whistle\n", "723 whistling vessel\n", "Name: Object type, Length: 201119, dtype: object" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "world_df[\"Object type\"]" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('600BC-575BC (circa (Möller 2000, 142, n. 414).)', -588),\n", " ('15 - 18 Aug, 1868', 'error'),\n", " ('550BC - 500BC (possibly 530 BC (S. Weber))', -525),\n", " ('480BC (about)', -480),\n", " ('1stC (circa)', 50),\n", " ('102BC', -102),\n", " ('350BC (circa)', -350),\n", " ('4thC BC', -350),\n", " ('1stC-3rdC', 150),\n", " ('182 BC (see N. Badoud, Le temps de Rhodes, 2015, 142.)', -182),\n", " ('87BC', -87),\n", " ('460BC (circa)', -460),\n", " ('138', 138),\n", " ('124 BC (see N. Badoud, Le temps de Rhodes, 2015, 143.)', -124),\n", " ('2ndC', 150),\n", " ('2ndC BC(mid)', -150),\n", " ('2ndC BC(late)', -150),\n", " ('1stC-2ndC', 100),\n", " ('2ndC', 150),\n", " ('6thC BC', -550),\n", " ('late 7thC BC - late 1stC BC', -350),\n", " ('271', 271),\n", " ('1stC-3rdC', 150),\n", " ('70', 70),\n", " ('192', 192),\n", " ('103BC', -103),\n", " ('85BC', -85),\n", " ('6thC', 550)]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import re\n", "\n", "\n", "def convert_century_to_year(century):\n", " match = re.search(r\"(\\d+)(st|nd|rd|th|stC|ndC|rdC|thC)\", century)\n", " if match:\n", " century_number = int(match.group(1))\n", " year = (century_number - 1) * 100 + 50\n", " return str(year)\n", " else:\n", " return century\n", "\n", "\n", "def parse_date(raw_date):\n", " try:\n", " raw_date = raw_date.lower().strip()\n", " raw_date = re.sub(r\"\\(.*?\\)\", \"\", raw_date) # Remove anything in parentheses\n", " raw_date = re.sub(r\"[?,.!()]\", \"\", raw_date) # Remove punctuation\n", " if \";\" in raw_date:\n", " raw_date = raw_date.split(\";\")[0]\n", "\n", " # Check for ranges\n", " splitter = \"–\" if \"–\" in raw_date else \"-\"\n", " if splitter in raw_date:\n", " parts = raw_date.split(splitter)\n", " num_parts = raw_date.replace(\"bc\", \"\").replace(\"ad\", \"\").split(splitter)\n", " num_parts = [convert_century_to_year(part) for part in num_parts]\n", "\n", " if \"bc\" in raw_date and \"ad\" in raw_date: # Mixed ranges including both bc and ad\n", " start, end = int(num_parts[0].strip()), int(num_parts[1].strip())\n", " if \"bc\" in parts[0]:\n", " start *= -1\n", " # For mixed bc/ad, only the end will be ad, so no action needed\n", " elif \"bc\" in raw_date:\n", " start, end = (\n", " int(num_parts[0].strip()) * -1,\n", " int(num_parts[1].strip()) * -1,\n", " ) # Convert to negative for bc\n", " else:\n", " start, end = int(num_parts[0].strip()), int(num_parts[1].strip())\n", " # Calculate middle date and correct for bc/ad crossover\n", " middle_date = start + (end - start) // 2\n", " if middle_date > 2021:\n", " return \"error\"\n", " else:\n", " return middle_date\n", "\n", " else:\n", " num_date = raw_date.replace(\"bc\", \"\").replace(\"ad\", \"\")\n", " num_date = convert_century_to_year(num_date)\n", " if \"bc\" in raw_date:\n", " num_date = int(num_date) * -1\n", " if int(num_date) > 2021:\n", " return \"error\"\n", " else:\n", " return int(num_date)\n", "\n", " except Exception as e:\n", " # print(f\"Error parsing date {raw_date}: {e}\")\n", " return \"error\"\n", "\n", "\n", "# # for date_range in world_df['Production date'].values[:150].tolist(): # Iterate through your ranges\n", "# for date_range in (\n", "# world_df[\"Production date\"].sample(150).values.tolist()\n", "# ): # Iterate through your ranges\n", "# middle_date = parse_date(date_range)\n", "# print(f\"{date_range}: Middle Date = {middle_date}\")\n", "\n", "test_cases = [\n", " \"600BC-575BC (circa (Möller 2000, 142, n. 414).)\",\n", " \"15 - 18 Aug, 1868\",\n", " \"550BC - 500BC (possibly 530 BC (S. Weber))\",\n", " \"480BC (about)\",\n", " \"1stC (circa)\",\n", " \"102BC\",\n", " \"350BC (circa)\",\n", " \"4thC BC\",\n", " \"1stC-3rdC\",\n", " \"182 BC (see N. Badoud, Le temps de Rhodes, 2015, 142.)\",\n", " \"87BC\",\n", " \"460BC (circa)\",\n", " \"138\",\n", " \"124 BC (see N. Badoud, Le temps de Rhodes, 2015, 143.)\",\n", " \"2ndC\",\n", " \"2ndC BC(mid)\",\n", " \"2ndC BC(late)\",\n", " \"1stC-2ndC\",\n", " \"2ndC\",\n", " \"6thC BC\",\n", " \"late 7thC BC - late 1stC BC\",\n", " \"271\",\n", " \"1stC-3rdC\",\n", " \"70\",\n", " \"192\",\n", " \"103BC\",\n", " \"85BC\",\n", " \"6thC\",\n", "]\n", "\n", "[(date, parse_date(date)) for date in test_cases]\n", "# parse_date(\"600BC-575BC (circa (Möller 2000, 142, n. 414).)\")" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_425911/1669513916.py:2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " dates[\"correct\"] = dates.apply(lambda x: parse_date(x[\"Production date\"]), axis=1)\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", "
Production dateReg numbercorrect
129700BC-1560sAm1849,0629.23error
152700BC-1560sAm1940,02.45error
153700BC-1560sAm1946,19.6error
154700BC-1560sAm1943,04.3error
155700BC-1560sAm1946,19.7error
............
20519Third century BC (?)1925,0119.611error
2140019135Af1935,0205.2error
214056 April 29 AD1898,0315.342error
115C14-C15Am1842,1112.3error
225C212013,2014.1.a-berror
\n", "

385 rows × 3 columns

\n", "
" ], "text/plain": [ " Production date Reg number correct\n", "129 700BC-1560s Am1849,0629.23 error\n", "152 700BC-1560s Am1940,02.45 error\n", "153 700BC-1560s Am1946,19.6 error\n", "154 700BC-1560s Am1943,04.3 error\n", "155 700BC-1560s Am1946,19.7 error\n", "... ... ... ...\n", "20519 Third century BC (?) 1925,0119.611 error\n", "21400 19135 Af1935,0205.2 error\n", "21405 6 April 29 AD 1898,0315.342 error\n", "115 C14-C15 Am1842,1112.3 error\n", "225 C21 2013,2014.1.a-b error\n", "\n", "[385 rows x 3 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates = world_df[[\"Production date\", \"Reg number\"]]\n", "dates[\"correct\"] = dates.apply(lambda x: parse_date(x[\"Production date\"]), axis=1)\n", "dates[dates[\"correct\"] == \"error\"]" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_425911/1922912582.py:2: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " d[\"correct\"] = d[\"correct\"].astype(int)\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", "
Production dateReg numbercorrect
01-1600 (?)Am1994,09.1800
1200BC - 400ADAm,S.818100
2200BC - 400ADAm,S.817100
3400 - 800Am.9685600
41000BC - 400ADAm,S.758.a-c-300
............
719100BC-600Am1954,05.196-350
720100BC-600Am1954,05.669-350
721100BC-650Am1954,05.194-375
722150BC-1600 (?)Am.6877-875
723100BC-600Am1982,Q.944-350
\n", "

200734 rows × 3 columns

\n", "
" ], "text/plain": [ " Production date Reg number correct\n", "0 1-1600 (?) Am1994,09.1 800\n", "1 200BC - 400AD Am,S.818 100\n", "2 200BC - 400AD Am,S.817 100\n", "3 400 - 800 Am.9685 600\n", "4 1000BC - 400AD Am,S.758.a-c -300\n", ".. ... ... ...\n", "719 100BC-600 Am1954,05.196 -350\n", "720 100BC-600 Am1954,05.669 -350\n", "721 100BC-650 Am1954,05.194 -375\n", "722 150BC-1600 (?) Am.6877 -875\n", "723 100BC-600 Am1982,Q.944 -350\n", "\n", "[200734 rows x 3 columns]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = dates[dates[\"correct\"] != \"error\"]\n", "d[\"correct\"] = d[\"correct\"].astype(int)\n", "d" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "if dates[\"correct\"].notnull().any():\n", " filtered_dates = dates[dates[\"correct\"] != \"error\"]\n", " plt.boxplot(filtered_dates[\"correct\"], showfliers=False)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_425911/3093622834.py:4: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", " equal_buckets = filtered_dates.groupby(\"bucket\").size().reset_index(name=\"count\")\n" ] } ], "source": [ "# Assuming you have a DataFrame called 'filtered_dates' with a column 'correct'\n", "filtered_dates = filtered_dates[filtered_dates[\"correct\"] >= -3000]\n", "filtered_dates[\"bucket\"] = pd.qcut(filtered_dates[\"correct\"], q=100, duplicates=\"drop\")\n", "equal_buckets = filtered_dates.groupby(\"bucket\").size().reset_index(name=\"count\")" ] }, { "cell_type": "code", "execution_count": 30, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Production dateReg numbercorrectbucket
01-1600 (?)Am1994,09.1800(600.0, 1995.0]
1200BC - 400ADAm,S.818100(81.0, 100.0]
2200BC - 400ADAm,S.817100(81.0, 100.0]
3400 - 800Am.9685600(550.0, 600.0]
41000BC - 400ADAm,S.758.a-c-300(-303.0, -300.0]
...............
719100BC-600Am1954,05.196-350(-375.0, -350.0]
720100BC-600Am1954,05.669-350(-375.0, -350.0]
721100BC-650Am1954,05.194-375(-400.0, -375.0]
722150BC-1600 (?)Am.6877-875(-970.0, -800.0]
723100BC-600Am1982,Q.944-350(-375.0, -350.0]
\n", "

197667 rows × 4 columns

\n", "
" ], "text/plain": [ " Production date Reg number correct bucket\n", "0 1-1600 (?) Am1994,09.1 800 (600.0, 1995.0]\n", "1 200BC - 400AD Am,S.818 100 (81.0, 100.0]\n", "2 200BC - 400AD Am,S.817 100 (81.0, 100.0]\n", "3 400 - 800 Am.9685 600 (550.0, 600.0]\n", "4 1000BC - 400AD Am,S.758.a-c -300 (-303.0, -300.0]\n", ".. ... ... ... ...\n", "719 100BC-600 Am1954,05.196 -350 (-375.0, -350.0]\n", "720 100BC-600 Am1954,05.669 -350 (-375.0, -350.0]\n", "721 100BC-650 Am1954,05.194 -375 (-400.0, -375.0]\n", "722 150BC-1600 (?) Am.6877 -875 (-970.0, -800.0]\n", "723 100BC-600 Am1982,Q.944 -350 (-375.0, -350.0]\n", "\n", "[197667 rows x 4 columns]" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filtered_dates" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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WtfNN98cN95440APBwAAAACAjOVyuZg9Z250tO8/rK1q4qTYtrUlGhsbM6gMAACAsWrAoarZs2fH5s2bY+/evfGjH/0olixZEk888cRQ1DYgV199dSxbtqxwu62tLRoaGjKsCAAAAACA/sjn89HRvj9qFi6PiprfX9ft2r0jdq+6NfL5vFAVAAAAw2rAoaoJEybErFmzIiJi3rx58dxzz8Xtt98en/zkJ+PAgQOxZ8+eotmqdu7cGfX19RERUV9fH88++2zR/nbu3Flo6/nesy3dp7q6us9ZqiIiKisro7KycqCHAwAAAABAiaioaYjK+llZlwEAAABRfrw76O7ujs7Ozpg3b15UVFTE2rVrC23btm2LXC4XTU1NERHR1NQUL7zwQuzatavQZ82aNVFdXR2nnnpqoU96Hz19evYBAAAAAAAAAAAwlAY0U9XVV18dH/3oR6OxsTFef/31uPfee+Pxxx+PRx55JKZMmRIXXnhhLFu2LKZNmxbV1dXxxS9+MZqamuLMM8+MiIhzzz03Tj311LjgggvilltuidbW1rjmmmti6dKlhVmmLr744rjjjjviyiuvjM997nPx2GOPxf333x+rV68e/KMHAAAAACghuVwu8vl84XZtba1l7wAAACADAwpV7dq1Kz796U/HK6+8ElOmTIl3vOMd8cgjj8SHP/zhiIi47bbbory8PBYtWhSdnZ3R3Nwcd955Z+H+48aNi1WrVsUll1wSTU1NccIJJ8SSJUvipptuKvSZOXNmrF69Oi6//PK4/fbbY8aMGfHd7343mpubB+mQAQAAAABKTy6Xi9lz5kZH+/7CtqqJk2Lb1hbBKgAAABhmAwpVfe973ztie1VVVaxYsSJWrFjRZ59TTjklHnrooSPu5+yzz45NmzYNpDQAAAAAgBEtn89HR/v+qFm4PCpqGqJr947YverWyOfzQlUAAAAwzAYUqgIAAAAAYGhV1DREZf2srMsAAACAMa086wIAAAAAAAAAAABKiVAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABAilAVAAAAAAAAAABA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(30, 6)) # Set the figure size to 10x6\n", "bin_edges = [interval.left for interval in filtered_dates[\"bucket\"].cat.categories] + [\n", " filtered_dates[\"bucket\"].cat.categories[-1].right\n", "]\n", "plt.hist(filtered_dates[\"correct\"], bins=bin_edges, edgecolor=\"black\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAACV4AAAH+CAYAAABu9IexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABTxUlEQVR4nO3de5hV9X0v/vcgMIARkJnCSDMYWlPAaLxggpjEk1QesWIaWptGA4lNqFQLbQwcb0kkatPYYL3HSu1F21+0SWyPpgctkWITTERU1HrJQNMTm0GTwW4QJshthP37I4d9nCiwF86wZ4bX63n2o3utz177s/be7DWz1nu+37pyuVwOAAAAAAAAAAAAVetX6wYAAAAAAAAAAAB6G8ErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCCgevli9fng9/+MMZPXp06urqct999+2x9oILLkhdXV1uvPHGTss3bNiQGTNmZOjQoRk+fHhmzZqVzZs3d6p55pln8oEPfCCDBg1Kc3NzFi5c+Ibt33PPPRk/fnwGDRqUY489Ng888EDR3QEAAAAAAAAAACiscPDq1VdfzXHHHZdbb711r3X33ntvHn300YwePfoN62bMmJHnn38+S5cuzeLFi7N8+fLMnj27sr69vT2nn356jjzyyKxatSrXXnttrrzyytx+++2VmkceeSTnnntuZs2alaeeeirTp0/P9OnT89xzzxXdJQAAAAAAAAAAgELqyuVyeb8fXFeXe++9N9OnT++0/KWXXsqkSZPy7W9/O9OmTctFF12Uiy66KEnS0tKSo48+Oo8//nhOOumkJMmSJUty5pln5sUXX8zo0aNz22235fOf/3za2toycODAJMlll12W++67L6tXr06SfOxjH8urr76axYsXV5735JNPzvHHH59FixZV1f+uXbvyk5/8JIcddljq6ur292UAAAAAAAAAAAD6iHK5nJ/97GcZPXp0+vXb87hW/bv6iXft2pVPfOITufjii/Oud73rDetXrFiR4cOHV0JXSTJlypT069cvK1euzG/91m9lxYoVOfXUUyuhqySZOnVqvvKVr+SVV17J4Ycf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zY9//OOMGTMmLS0tOfroo/P444/npJNOSpIsWbIkZ555Zl588cWMHj06t912Wz7/+c+nra0tAwcOTJJcdtllue+++7J69eokycc+9rG8+uqrWbx4ceW5Tj755Bx//PFZtGhRVf23t7dn2LBh2bRpU4YOHbqfrwIAAAAAAPQeTz75ZCZOnJim825MfdNRe63d3vafafu7i7Jq1aqceOKJB6hDAACA2qo2U1R4xKuiNm3alLq6ugwfPjxJsmLFigwfPrwSukqSKVOmpF+/flm5cmWl5tRTT62ErpJk6tSpWbNmTV555ZVKzZQpUzo919SpU7NixYo99rJ9+/a0t7d3ugEAAAAAAAAAABTVrcGrbdu25dJLL825555bSX+1tbVl5MiRner69++fESNGpK2trVIzatSoTjW77++rZvf6N3PNNddk2LBhlVtzc/Nb20EAAAAAAAAAAOCg1G3Bq46Ojvzu7/5uyuVybrvttu56mkIuv/zybNq0qXJbu3ZtrVsCAAAAAAAAAAB6of7dsdHdoasf//jHeeihhzrNddjU1JSXX365U/1rr72WDRs2pKmpqVKzbt26TjW77++rZvf6N1NfX5/6+vr93zEAAAAAAAAAAIB0w4hXu0NXP/zhD/Ov//qvaWho6LR+8uTJ2bhxY1atWlVZ9tBDD2XXrl2ZNGlSpWb58uXp6Oio1CxdujTjxo3L4YcfXqlZtmxZp20vXbo0kydP7updAgAAAAAAAAAA6KRw8Grz5s15+umn8/TTTydJXnjhhTz99NNpbW1NR0dHfud3fidPPPFE7rrrruzcuTNtbW1pa2vLjh07kiQTJkzIGWeckfPPPz+PPfZYvv/972fu3Lk555xzMnr06CTJxz/+8QwcODCzZs3K888/n2984xu56aabMm/evEofn/nMZ7JkyZJcd911Wb16da688so88cQTmTt3bhe8LAAAAAAAAAAAAHtWOHj1xBNP5IQTTsgJJ5yQJJk3b15OOOGELFiwIC+99FL++Z//OS+++GKOP/74HHHEEZXbI488UtnGXXfdlfHjx+e0007LmWeemfe///25/fbbK+uHDRuWBx98MC+88EImTpyY+fPnZ8GCBZk9e3al5pRTTsndd9+d22+/Pccdd1z+8R//Mffdd1+OOeaYt/J6AAAAAAAAAAAA7FP/og/44Ac/mHK5vMf1e1u3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GzZsyIwZMzJ06NAMHz48s2bNyubNmzvVPPPMM/nABz6QQYMGpbm5OQsXLuzq3QEAAAAAAAAAAHiDLg9efeUrX8ltt92Wr371q2lpaclXvvKVLFy4MLfcckulZuHChbn55puzaNGirFy5MoceemimTp2abdu2VWpmzJiR559/PkuXLs3ixYuzfPnyzJ49u7K+vb09p59+eo488sisWrUq1157ba688srcfvvtXb1LAAAAAAAAAAAAnfTv6g0+8sgj+chHPpJp06YlSd7xjnfkH/7hH/LYY48l+floVzfeeGO+8IUv5CMf+UiS5O///u8zatSo3HfffTnnnHPS0tKSJUuW5PHHH89JJ52UJLnlllty5pln5s///M8zevTo3HXXXdmxY0f+9m//NgMHDsy73vWuPP3007n++us7BbQAAAAAAAAAAAC6WpcHr0455ZTcfvvt+Y//+I/82q/9Wv793/893/ve93L99dcnSV544YW0tbVlypQplccMGzYskyZNyooVK3LOOedkxYoVGT58eCV0lSRTpkxJv379snLlyvzWb/1WVqxYkVNPPTUDBw6s1EydOjVf+cpX8sorr+Twww9/Q2/bt2/P9u3bK/fb29u7evcBAAAAAKDPaWlp2WdNY2NjxowZcwC6AQAA6Bm6PHh12WWXpb29PePHj88hhxySnTt35k//9E8zY8aMJElbW1uSZNSoUZ0eN2rUqMq6tra2jBw5snOj/ftnxIgRnWrGjh37hm3sXvdmwatrrrkmV111VRfsJQAAAAAA9H07N7+S1NVl5syZ+6wdNHhI1qxuEb4CAAAOGl0evPrmN7+Zu+66K3fffXdl+r+LLrooo0ePznnnndfVT1fI5Zdfnnnz5lXut7e3p7m5uYYdAQAAAADQl7S2tqZUKu2zrreMDrVr++akXE7DWfMzoGHP59M71q/N+sXXpVQq9Yr9AgAA6ApdHry6+OKLc9lll+Wcc85Jkhx77LH58Y9/nGuuuSbnnXdempqakiTr1q3LEUccUXncunXrcvzxxydJmpqa8vLLL3fa7muvvZYNGzZUHt/U1JR169Z1qtl9f3fNL6qvr099ff1b30kAAAAAAPgFra2tGTd+QrZt3bLP2iKjQ1Ub5kq6L9A1oKE59U1Hdfl2AQAAerMuD15t2bIl/fr167TskEMOya5du5IkY8eOTVNTU5Yt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KpWybeuWNJw1PwMamvdY17F+bdYvvi6lUknwCgAAgE66fKrBf/7nf85JJ52Uj370oxk5cmROOOGE/NVf/VVl/QsvvJC2trZMmTKlsmzYsGGZNGlSVqxYkSRZsWJFhg8fXgldJcmUKVPSr1+/rFy5slJz6qmnZuDAgZWaqVOnZs2aNXnllVfetLft27envb290w0AAAAAgIPXgIbm1Dcdtcfb3kJZAAAAHNy6fMSrH/3oR7ntttsyb968fO5zn8vjjz+eP/7jP87AgQNz3nnnpa2tLUkyatSoTo8bNWpUZV1bW1tGjhzZudH+/TNixIhONa8fSev122xra+s0teFu11xzTa666qqu2VEAAAAAAA6Y1tbWlEqlfdY1NjYamQoAAIADosuDV7t27cpJJ52UL3/5y0mSE044Ic8991wWLVqU8847r6ufrpDLL7888+bNq9xvb29Pc7O/VgIAAAAA6MlaW1szbvyEbNu6ZZ+1gwYPyZrVLcJXAAAAdLsuD14dccQROfroozstmzBhQv7pn/4pSdLU1JQkWbduXY444ohKzbp163L88cdXal5++eVO23jttdeyYcOGyuObmpqybt26TjW77++u+UX19fWpr6/fzz0DAAAAAKAWSqVStm3dkoaz5u916r+O9WuzfvF1KZVKglcAAAB0uy4PXr3vfe/LmjVrOi37j//4jxx55JFJkrFjx6apqSnLli2rBK3a29uzcuXKXHjhhUmSyZMnZ+PGjVm1alUmTpyYJHnooYeya9euTJo0qVLz+c9/Ph0dHRkwYECSZOnSpRk3btybTjMIAAAAAEBn1U7fl/SMKfwGNDSnvumomvYAAAAAu3V58Oqzn/1sTjnllHz5y1/O7/7u7+axxx7L7bffnttvvz1JUldXl4suuihf+tKX8s53vjNjx47NFVdckdGjR2f69OlJfj5C1hlnnJHzzz8/ixYtSkdHR+bOnZtzzjkno0ePTpJ8/OMfz1VXXZVZs2bl0ksvzXPPPZebbropN9xwQ1fvEgAAAABAn1Nk+r7EFH4AAADwi7o8ePWe97wn9957by6//PJcffXVGTt2bG688cbMmDGjUnPJJZfk1VdfzezZs7Nx48a8//3vz5IlSzJo0KBKzV133ZW5c+fmtNNOS79+/XL22Wfn5ptvrqwfNmxYHnzwwcyZMycTJ05MY2NjFixYkNmz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99xz5a9//evlIUOGlP/yL/+ysp3vf//75f79+5f//M//vNzS0lL+4he/WB4wYED52WefrdT82Z/9WXn48OHlb33rW+Vnnnmm/JGPfKQ8duzY8tatWw/4fgPQc7344ovlo446qnzaaaeVX3zxxfJPf/rTym03xyYADrQf//jH5aeeeqp81VVXld/2treVn3rqqfJTTz1V/tnPflYul8vl1157rXzMMceUTz/99PLTTz9dXrJkSfmXfumXypdffnllGz/60Y/KQ4YMKV988cXllpaW8q233lo+5JBDykuWLKnUfP3rXy/X19eX77zzzvIPfvCD8uzZs8vDhw8vt7W1HfB9BqB3c0wBoLv87Gc/q/xOlKR8/fXXl5966qnyj3/843K5XN05tzPOOKN8wgknlFeuXFn+3ve+V37nO99ZPvfccyvrqzn/BwDlcrl84YUXlocNG1b+zne+0+ma0pYtWyo1F1xwQXnMmDHlhx56qPzEE0+UJ0+eXJ48eXJlfVed26P2BK844J555pnyhz70ofKIESPK9fX15Xe84x3lCy64oPziiy92qvv3f//38vvf//5yfX19+Zd/+ZfLf/Znf/aGbX3zm98s/9qv/Vp54MCB5Xe9613l+++/v9P6Xbt2la+44oryqFGjyvX19eXTTjutvGbNmm7dPwB6nzvuuKOc5E1vr+fYBMCBdN55573psenf/u3fKjX/9V//Vf6N3/iN8uDBg8uNjY3l+fPnlzs6Ojpt59/+7d/Kxx9/fHngwIHlX/mVXynfcccdb3iuW265pTxmzJjywIEDy+9973vLjz76aDfvHQB9lWMKAN3h3/7t397096PzzjuvXC5Xd85t/fr15XPPPbf8tre9rTx06NDypz71qcoftuxWzfk/ANjTNaXXn3fbunVr+Q//8A/Lhx9+eHnIkCHl3/qt3+r0B//lcted26O26srlcvkADrAFAAAAAAAAAADQ6/WrdQMAAAAAAAAAAAC9jeAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAF/f/0c2igrkvd9QAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "fig, ax = plt.subplots(figsize=(30, 6)) # Set the figure size to 10x6\n", "bin_edges = np.arange(filtered_dates[\"correct\"].min(), filtered_dates[\"correct\"].max() + 26, 25)\n", "plt.hist(filtered_dates[\"correct\"], bins=bin_edges, edgecolor=\"black\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "from scipy.ndimage import convolve1d\n", "from scipy.ndimage import gaussian_filter1d\n", "from scipy.signal.windows import triang" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "def get_bin_idx(label, window=25):\n", " return int((label - (-3000)) // window)\n", "\n", "\n", "def get_lds_kernel_window(kernel, ks, sigma):\n", " assert kernel in [\"gaussian\", \"triang\", \"laplace\"]\n", " half_ks = (ks - 1) // 2\n", " if kernel == \"gaussian\":\n", " base_kernel = [0.0] * half_ks + [1.0] + [0.0] * half_ks\n", " kernel_window = gaussian_filter1d(base_kernel, sigma=sigma) / max(\n", " gaussian_filter1d(base_kernel, sigma=sigma)\n", " )\n", " elif kernel == \"triang\":\n", " kernel_window = triang(ks)\n", " else:\n", " laplace = lambda x: np.exp(-abs(x) / sigma) / (2.0 * sigma)\n", " kernel_window = list(map(laplace, np.arange(-half_ks, half_ks + 1))) / max(\n", " map(laplace, np.arange(-half_ks, half_ks + 1))\n", " )\n", "\n", " return kernel_window" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "bin_index_per_label = [get_bin_idx(label) for label in filtered_dates[\"correct\"]]\n", "\n", "Nb = max(bin_index_per_label) + 1\n", "\n", "num_samples_of_bins = dict(Counter(bin_index_per_label))\n", "emp_label_dist = [num_samples_of_bins.get(i, 0) for i in range(Nb)]\n", "\n", "# lds_kernel_window: [ks,], here for example, we use gaussian, ks=5, sigma=2\n", "lds_kernel_window = get_lds_kernel_window(kernel=\"gaussian\", ks=5, sigma=2)\n", "# calculate effective label distribution: [Nb,]\n", "eff_label_dist = convolve1d(np.array(emp_label_dist), weights=lds_kernel_window, mode=\"constant\")" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 113, 0, 35, 0, 36, 28, 1, 1, 70,\n", " 2, 87, 0, 193, 1, 16, 67, 287, 2,\n", " 52, 10, 443, 7, 85, 2, 45, 4, 14,\n", " 6, 1142, 20, 165, 13, 329, 1, 104, 27,\n", " 597, 23, 697, 98, 355, 44, 145, 80, 186,\n", " 136, 268, 52, 718, 99, 362, 79, 106, 58,\n", " 142, 24, 49, 104, 154, 150, 124, 125, 119,\n", " 107, 191, 113, 980, 214, 1154, 174, 827, 120,\n", " 408, 46, 223, 249, 122, 76, 69, 53, 134,\n", " 156, 252, 173, 198, 230, 627, 120, 373, 144,\n", " 848, 148, 705, 554, 814, 975, 4148, 3313, 3990,\n", " 1566, 3023, 1802, 3341, 1750, 2073, 1857, 6430, 4183,\n", " 3506, 1492, 2834, 3644, 3081, 2890, 5376, 3308, 7121,\n", " 3263, 5851, 3481, 1643, 4370, 5959, 3178, 6091, 5658,\n", " 7929, 3568, 7901, 6216, 13351, 7987, 4463, 866, 2411,\n", " 1642, 1168, 1217, 2032, 310, 1235, 15, 2443, 52,\n", " 1111, 0, 842, 0, 21, 0, 23, 6, 5,\n", " 0, 9, 0, 36, 5, 75, 0, 184, 1,\n", " 1, 0, 0, 0, 3, 0, 0, 0, 3,\n", " 0, 1, 0, 0, 0, 0, 0, 1, 0,\n", " 0, 0, 2, 0, 0, 0, 0, 0, 0,\n", " 0, 15, 1, 2, 0, 53, 0, 109, 21,\n", " 16, 14])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array(emp_label_dist)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 143, 139, 162, 91, 93, 63, 119, 93, 148,\n", " 151, 314, 267, 282, 256, 492, 356, 410, 388,\n", " 689, 485, 576, 516, 512, 134, 135, 66, 1042,\n", " 1119, 1320, 1272, 1458, 498, 573, 444, 925, 710,\n", " 1331, 1354, 1628, 1150, 1211, 669, 726, 547, 744,\n", " 678, 1221, 1186, 1401, 1232, 1237, 656, 668, 380,\n", " 352, 343, 424, 445, 542, 609, 618, 575, 608,\n", " 604, 1342, 1496, 2443, 2478, 3071, 2334, 2445, 1476,\n", " 1466, 959, 956, 680, 680, 515, 410, 444, 607,\n", " 715, 848, 929, 1333, 1261, 1448, 1386, 1888, 1528,\n", " 2049, 2215, 2795, 2954, 6425, 8987, 12326, 13191, 14759,\n", " 12589, 12500, 10667, 11074, 10011, 13870, 14991, 16931, 16455,\n", " 16824, 14206, 13345, 12999, 16307, 16855, 19994, 20409, 22972,\n", " 21359, 19751, 17120, 19205, 17275, 19736, 23182, 26368, 24708,\n", " 28664, 28731, 35419, 36234, 37396, 30914, 26364, 15632, 9616,\n", " 6814, 7685, 5919, 5538, 4457, 5383, 3804, 4519, 3426,\n", " 3979, 1891, 1813, 816, 763, 46, 50, 32, 38,\n", " 18, 44, 46, 112, 109, 268, 250, 250, 175,\n", " 159, 1, 3, 2, 3, 2, 5, 2, 3,\n", " 3, 3, 0, 0, 0, 0, 0, 1, 0,\n", " 2, 1, 2, 1, 1, 0, 0, 0, 12,\n", " 15, 17, 17, 61, 52, 148, 171, 188, 151,\n", " 142, 47])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eff_label_dist" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "# from loss import weighted_mse_loss\n", "\n", "# Use re-weighting based on effective label distribution, sample-wise weights: [Ns,]\n", "eff_num_per_label = [eff_label_dist[bin_idx] for bin_idx in bin_index_per_label]\n", "weights = [np.float32(1 / x) for x in eff_num_per_label]\n", "\n", "# calculate loss\n", "# loss = weighted_mse_loss(preds, labels, weights=weights)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(197667,)" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array(weights).shape" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'ellipsis' object is not iterable", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[40], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m preds, labels \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m, \u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# assign each label to its corresponding bin (start from 0)\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# with your defined get_bin_idx(), return bin_index_per_label: [Ns,]\u001b[39;00m\n\u001b[0;32m----> 5\u001b[0m bin_index_per_label \u001b[38;5;241m=\u001b[39m [get_bin_idx(label) \u001b[38;5;28;01mfor\u001b[39;00m label \u001b[38;5;129;01min\u001b[39;00m labels]\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# calculate empirical (original) label distribution: [Nb,]\u001b[39;00m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# \"Nb\" is the number of bins\u001b[39;00m\n\u001b[1;32m 9\u001b[0m Nb \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmax\u001b[39m(bin_index_per_label) \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m\n", "\u001b[0;31mTypeError\u001b[0m: 'ellipsis' object is not iterable" ] } ], "source": [ "# preds, labels: [Ns,], \"Ns\" is the number of total samples\n", "preds, labels = ..., ...\n", "# assign each label to its corresponding bin (start from 0)\n", "# with your defined get_bin_idx(), return bin_index_per_label: [Ns,]\n", "bin_index_per_label = [get_bin_idx(label) for label in labels]\n", "\n", "# calculate empirical (original) label distribution: [Nb,]\n", "# \"Nb\" is the number of bins\n", "Nb = max(bin_index_per_label) + 1\n", "num_samples_of_bins = dict(Counter(bin_index_per_label))\n", "emp_label_dist = [num_samples_of_bins.get(i, 0) for i in range(Nb)]\n", "\n", "# lds_kernel_window: [ks,], here for example, we use gaussian, ks=5, sigma=2\n", "lds_kernel_window = get_lds_kernel_window(kernel=\"gaussian\", ks=5, sigma=2)\n", "# calculate effective label distribution: [Nb,]\n", "eff_label_dist = convolve1d(np.array(emp_label_dist), weights=lds_kernel_window, mode=\"constant\")" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import torch.nn.functional as F\n", "import numpy as np\n", "from scipy.ndimage import gaussian_filter1d\n", "from scipy.signal.windows import triang\n", "from scipy.ndimage import convolve1d\n", "\n", "\n", "def get_lds_kernel_window(kernel, ks, sigma):\n", " assert kernel in [\"gaussian\", \"triang\", \"laplace\"]\n", " half_ks = (ks - 1) // 2\n", "\n", " if kernel == \"gaussian\":\n", " base_kernel = [0.0] * half_ks + [1.0] + [0.0] * half_ks\n", " kernel_window = gaussian_filter1d(base_kernel, sigma=sigma) / max(\n", " gaussian_filter1d(base_kernel, sigma=sigma)\n", " )\n", " elif kernel == \"triang\":\n", " kernel_window = triang(ks)\n", " else:\n", " laplace = lambda x: np.exp(-abs(x) / sigma) / (2.0 * sigma)\n", " kernel_window = list(map(laplace, np.arange(-half_ks, half_ks + 1))) / max(\n", " map(laplace, np.arange(-half_ks, half_ks + 1))\n", " )\n", "\n", " return kernel_window\n", "\n", "\n", "def prepare_weights(labels, reweight, lds=True, lds_kernel=\"gaussian\", lds_ks=5, lds_sigma=2):\n", " assert reweight in {\"none\", \"inverse\", \"sqrt_inv\"}\n", " assert (\n", " reweight != \"none\" if lds else True\n", " ), \"Set reweight to 'sqrt_inv' (default) or 'inverse' when using LDS\"\n", "\n", " value_dict = {\n", " x: 0 for x in list(set(labels))\n", " } # initialize value dictionary with labels as keys\n", " for label in labels:\n", " value_dict[label] += 1 # increment counts of labels which occur multiple times\n", " if reweight == \"sqrt_inv\":\n", " value_dict = {k: np.sqrt(v) for k, v in value_dict.items()}\n", " elif reweight == \"inverse\":\n", " value_dict = {\n", " k: np.clip(v, 5, 1000) for k, v in value_dict.items()\n", " } # clip weights for inverse re-weight\n", " num_per_label = [value_dict[label] for label in labels]\n", " if not len(num_per_label) or reweight == \"none\":\n", " return None\n", " print(f\"Using re-weighting: [{reweight.upper()}]\")\n", "\n", " if lds:\n", " lds_kernel_window = get_lds_kernel_window(lds_kernel, lds_ks, lds_sigma)\n", " print(f\"Using LDS: [{lds_kernel.upper()}] ({lds_ks}/{lds_sigma})\")\n", " # apply kernel to the reweighted values\n", " smoothed_value = convolve1d(\n", " np.asarray([v for _, v in value_dict.items()]),\n", " weights=lds_kernel_window,\n", " mode=\"constant\",\n", " )\n", " value_dict_keys = list(value_dict.keys())\n", " num_per_label = [smoothed_value[value_dict_keys.index(label)] for label in labels]\n", "\n", " weights = [np.float32(1 / x) for x in num_per_label]\n", " scaling = len(weights) / np.sum(weights)\n", " weights = [scaling * x for x in weights]\n", "\n", " return torch.Tensor(weights)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using re-weighting: [SQRT_INV]\n", "Using LDS: [GAUSSIAN] (5/2)\n" ] }, { "data": { "text/plain": [ "tensor([3.7173, 0.5529, 0.5529, ..., 1.0680, 3.0975, 0.5203])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prepare_weights(filtered_dates[\"correct\"], \"sqrt_inv\")" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using re-weighting: [SQRT_INV]\n", "Using LDS: [GAUSSIAN] (1000/1000)\n" ] } ], "source": [ "weights = np.array(\n", " prepare_weights(filtered_dates[\"correct\"], \"sqrt_inv\", lds_ks=1000, lds_sigma=1000)\n", ")" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAACV4AAAH5CAYAAABz8bcJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABQdElEQVR4nO39e5iV5X0vcH+HwwxgBAQCA9vBEE0AFU8kkrGJwS1ltJiWxtjGiJqUhOiGNIrbUFJjUHeK1aoxiqFeqZq+aj10J6ZBq454wBQ0gUAsBnhj1IypDmZQmSBnWO8ffVnbiXh4dI3DMJ/Pda0L1nP/1m/d94g8M8/6cj9VpVKpFAAAAAAAAAAAAN62bh09AQAAAAAAAAAAgM5G8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAgnp09AQ60s6dO/P8889n3333TVVVVUdPBwAAAAAAAAAA6GClUim///3vM2zYsHTr9sb7WnXp4NXzzz+furq6jp4GAAAAAAAAAACwh3nuueey//77v+F4lw5e7bvvvkn++4vUt2/fDp4NAAAAAAAAAADQ0VpbW1NXV1fOFr2RLh282nV7wb59+wpeAQAAAAAAAAAAZbuyRW/kjW9CCAAAAAAAAAAAwG4JXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAU1KOjJwAAAAAAALy3mpqa0tLSUtGegwYNyvDhwyvaEwAAYE8meAUAAAAAAF1IU1NTRo4anc2bNla0b6/efbJm9SrhKwAAoMsoFLyaO3dufvCDH2T16tXp3bt3jjnmmPz93/99Ro4cWa7ZvHlzzjvvvNx2223ZsmVLGhoact1112XIkCHlmqamppx99tl56KGH8r73vS9nnnlm5s6dmx49/t90Hn744cycOTNPPvlk6urqcsEFF+Tzn/98m/nMmzcvl19+eZqbm3P44YfnmmuuydFHH/0OvxQAAAAAALD3a2lpyeZNGzPwpPPSc2BdRXpuW/dc1i24Ii0tLYJXAABAl1EoePXII49k+vTp+ehHP5rt27fn61//eiZOnJhf/vKX2WeffZIk5557bu6+++7ceeed6devX2bMmJFPf/rT+Y//+I8kyY4dOzJp0qTU1tZm8eLFeeGFF3LGGWekZ8+e+bu/+7skyTPPPJNJkyblrLPOyi233JKFCxfmi1/8YoYOHZqGhoYkye23356ZM2dm/vz5GTduXL797W+noaEha9asyeDBgyv5NQIAAAAAgL1Oz4F1qak9qKOnAQAA0GlVlUql0jt98e9+97sMHjw4jzzySI499tisX78+73//+3PrrbfmM5/5TJJk9erVGT16dJYsWZKPfexj+fd///ecdNJJef7558u7YM2fPz+zZs3K7373u1RXV2fWrFm5++67s3LlyvJ7ffazn80rr7ySe++9N0kybty4fPSjH821116bJNm5c2fq6uryla98JX/zN3/ztubf2tqafv36Zf369enbt+87/TIAAAAAAECn8fOf/zxjx45N7ZnfrljwakvzU2n+/jlZtmxZjjrqqIr0BAAA6ChvN1PU7d28yfr165MkAwYMSJIsW7Ys27Zty4QJE8o1o0aNyvDhw7NkyZIkyZIlSzJmzJg2tx5saGhIa2trnnzyyXLNa3vsqtnVY+vWrVm2bFmbmm7dumXChAnlmt3ZsmVLWltb2zwAAAAAAAAAAACKesfBq507d+acc87JH/3RH+XQQw9NkjQ3N6e6ujr9+/dvUztkyJA0NzeXa14buto1vmvszWpaW1uzadOmtLS0ZMeOHbut2dVjd+bOnZt+/fqVH3V1lbl3PQAAAAAAAAAA0LW84+DV9OnTs3Llytx2222VnE+7mj17dtavX19+PPfccx09JQAAAAAAAAAAoBPq8U5eNGPGjCxYsCCLFi3K/vvvXz5eW1ubrVu35pVXXmmz69XatWtTW1tbrvnpT3/apt/atWvLY7t+3XXstTV9+/ZN7969071793Tv3n23Nbt67E5NTU1qamqKLxgAAAAAADpIU1NTWlpaKtZv1apVFesFAADQlRUKXpVKpXzlK1/JD3/4wzz88MMZMWJEm/GxY8emZ8+eWbhw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RxxxRC655JLMmjUrc+bMSXV1debPn58RI0bkiiuuSJKMHj06P/nJT3LVVVeloaHhDee1ZcuWbNmypfy8tbW1wisHAAAAAAAAAAC6gnbZ8epXv/pVhg0blg9+8IM57bTT0tTUlCRZtmxZtm3blgkTJpRrR40aleHDh2fJkiVJkiVLlmTMmDEZMmRIuaahoSGtra158sknyzWv7bGrZlePNzJ37tz069ev/Kirq6vIegEAAAAAAAAAgK6l4jtejRs3LjfddFNGjhyZF154IRdddFE+8YlPZOXKlWlubk51dXX69+/f5jVDhgxJc3NzkqS5ublN6GrX+K6xN6tpbW3Npk2b0rt3793Obfbs2Zk5c2b5eWtrq/AVAAAAAADsoZqamtLS0lLxvoMGDcrw4cMr3hcAAOhaKh68OvHEE8u/P+ywwzJu3LgccMABueOOO94wEPVeqampSU1NTYfOAQAAAAAAeGtNTU0ZOWp0Nm/aWPHevXr3yZrVq4SvAACAd6Xiwas/1L9//3z4wx/OU089lT/+4z/O1q1b88orr7TZ9Wrt2rWpra1NktTW1uanP/1pmx5r164tj+36ddex19b07du3w8NdAAAAAADAu9fS0pLNmzZm4EnnpefAyt29Ytu657JuwRVpaWkRvAIAAN6Vdg9ebdiwIb/+9a9z+umnZ+zYsenZs2cWLlyYk08+OUmyZs2aNDU1pb6+PklSX1+fb33rW3nxxRczePDgJEljY2P69u2bgw8+uFxzzz33tHmfxsbGcg8AAAAAAGDv0HNgXWpqD+roaQAAALxOt0o3/N//+3/nkUceybPPPpvFixfnz//8z9O9e/eceuqp6devX6ZOnZqZM2fmoYceyrJly/KFL3wh9fX1+djHPpYkmThxYg4++OCcfvrp+cUvfpH77rsvF1xwQaZPn16+TeBZZ52Vp59+Ol/72teyevXqXHfddbnjjjty7rnnVno5AAAAAAAAAAAAr1PxHa9++9vf5tRTT826devy/ve/Px//+Mfz2GOP5f3vf3+S5Kqrrkq3bt1y8sknZ8uWLWloaMh1111Xfn337t2zYMGCnH322amvr88+++yTM888MxdffHG5ZsSIEbn77rtz7rnn5uqrr87++++f733ve2loaKj0cgAAAAAAAAAAAF6n4sGr22677U3He/XqlXnz5mXevHlvWHPAAQe87laCf2j8+PFZvnz5O5ojAAAAAAAAAADAu1HxWw0CAAAAAAAAAADs7QSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAACioR0dPAAAAAAAA2DusWrVqj+wFAADQHgSvAAAAAACAd2XHhpeTqqpMmTKlo6cCAADwnhG8AgAAAAAA3pWdWzYkpVIGnnReeg6sq0jPTU8vzfpHb65ILwAAgPYgeAUAAAAAAFREz4F1qak9qCK9tq17riJ9AAAA2ovgFQAAAAAA0OWsWrWqov0GDRqU4cOHV7QnAACwZxO8AgAAAAAAuowdG15OqqoyZcqUivbt1btP1qxeJXwFAABdiOAVAAAAAADQZezcsiEplTLwpPPSc2BdRXpuW/dc1i24Ii0tLYJXAADQhQheAQAAAAAAXU7PgXWpqT2oo6cBAAB0Yt06egIAAAAAAAAAAACdjeAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFFTx4NXcuXPz0Y9+NPvuu28GDx6cyZMnZ82aNW1qxo8fn6qqqjaPs846q01NU1NTJk2alD59+mTw4ME5//zzs3379jY1Dz/8cI466qjU1NTkoIMOyk033VTp5QAAAAAAAAAAALxOxYNXjzzySKZPn57HHnssjY2N2bZtWyZOnJhXX321Td2XvvSlvPDCC+XHZZddVh7bsWNHJk2alK1bt2bx4sX5/ve/n5tuuikXXnhhueaZZ57JpEmTctxxx2XFihU555xz8sUvfjH33XdfpZcEAAAAAAAAAADQRo9KN7z33nvbPL/pppsyePDgLFu2LMcee2z5eJ8+fVJbW7vbHvfff39++ctf5oEHHsiQIUNyxBFH5JJLLsmsWbMyZ86cVFdXZ/78+RkxYkSuuOKKJMno0aPzk5/8JFdddVUaGhoqvSwAAAC6mKamprS0tFS876BBgzJ8+PCK9wUAAAAA4L1V8eDVH1q/fn2SZMCAAW2O33LLLbn55ptTW1ubT33qU/nGN76RPn36JEmWLFmSMWPGZMiQIeX6hoaGnH322XnyySdz5JFHZsmSJZkwYUKbng0NDTnnnHPecC5btmzJli1bys9bW1vf7fIAAADYCzU1NWXkqNHZvGljxXv36t0na1avEr4CAAAAAOjk2jV4tXPnzpxzzjn5oz/6oxx66KHl45/73OdywAEHZNiwYXniiScya9asrFmzJj/4wQ+SJM3NzW1CV0nKz5ubm9+0prW1NZs2bUrv3r1fN5+5c+fmoosuqugaAQAA2Pu0tLRk86aNGXjSeek5sK5ifbetey7rFlyRlpYWwSsAAAAAgE6uXYNX06dPz8qVK/OTn/ykzfFp06aVfz9mzJgMHTo0xx9/fH7961/nwAMPbLf5zJ49OzNnziw/b21tTV1d5S6gAwAAsHfpObAuNbUHdfQ0AAAAAADYA3Vrr8YzZszIggUL8tBDD2X//fd/09px48YlSZ566qkkSW1tbdauXdumZtfz2traN63p27fvbne7SpKampr07du3zQMAAAAAAAAAAKCoigevSqVSZsyYkR/+8Id58MEHM2LEiLd8zYoVK5IkQ4cOTZLU19fnP//zP/Piiy+WaxobG9O3b98cfPDB5ZqFCxe26dPY2Jj6+voKrQQAAAAAAAAAAGD3Kh68mj59em6++ebceuut2XfffdPc3Jzm5uZs2rQpSfLrX/86l1xySZYtW5Znn302//Zv/5Yzzjgjxx57bA477LAkycSJE3PwwQfn9NNPzy9+8Yvcd999ueCCCzJ9+vTU1NQkSc4666w8/fTT+drXvpbVq1fnuuuuyx133JFzzz230ksCAAAAAAAAAABoo+LBq+9+97tZv359xo8fn6FDh5Yft99+e5Kkuro6DzzwQCZOnJhRo0blvPPOy8knn5wf//jH5R7du3fPggUL0r1799TX12fKlCk544wz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3rx5+cAHPpBevXpl3Lhx+elPf9oOKwKgK3BOAaA9LFq0KJ/61KcybNiwVFVV5a677moz/nauub300ks57bTT0rdv3/Tv3z9Tp07Nhg0b2tS8net/ADB37tx89KMfzb777pvBgwdn8uTJWbNmTZuazZs3Z/r06Rk4cGDe97735eSTT87atWvb1FTq2h4dS/CKDnHcccfljjvuyJo1a/J//+//za9//et85jOfKY+3trZm4sSJOeCAA7Js2bJcfvnlmTNnTq6//vpyzeLFi3Pqqadm6tSpWb58eSZPnpzJkydn5cqV5ZrLLrss3/nOdzJ//vw8/vjj2WeffdLQ0JDNmze/p+sFYM+2evXq7Ny5M//4j/+YJ598MldddVXmz5+fr3/96+Ua5yYA3mtbt27NKaeckrPPPnu34zt27MikSZOydevWLF68ON///vdz00035cILLyzXPPPMM5k0aVKOO+64rFixIuecc06++MUv5r777ivX3H777Zk5c2a++c1v5uc//3kOP/zwNDQ05MUXX2z3NQKwd3FOAaC9vPrqqzn88MMzb9683Y6/nWtup512Wp588sk0NjZmwYIFWbRoUaZNm1YefzvX/wAgSR555JFMnz49jz32WBobG7Nt27ZMnDgxr776arnm3HPPzY9//OPceeedeeSRR/L888/n05/+dHm8Utf22AOUYA/wox/9qFRVVVXaunVrqVQqla677rrSfvvtV9qyZUu5ZtasWaWRI0eWn//FX/xFadKkSW36jBs3rvTlL3+5VCqVSjt37izV1taWLr/88vL4K6+8UqqpqSn9y7/8S3suB4C9wGWXXVYaMWJE+blzEwAd5cYbbyz169fvdcfvueeeUrdu3UrNzc3lY9/97ndLffv2LZ+vvva1r5UOOeSQNq/7y7/8y1JDQ0P5+dFHH12aPn16+fmOHTtKw4YNK82dO7fCKwFgb+ecAsB7IUnphz/8Yfn527nm9stf/rKUpPSzn/2sXPPv//7vpaqqqtJ//dd/lUqlt3f9DwB258UXXywlKT3yyCOlUum/z0M9e/Ys3XnnneWaVatWlZKUlixZUiqVKndtj45nxys63EsvvZRbbrklxxxzTHr27JkkWbJkSY499thUV1eX6xoaGrJmzZq8/PLL5ZoJEya06dXQ0JAlS5Yk+e/0Z3Nzc5uafv36Zdy4ceUaAHgj69evz4ABA8rPnZsA2NMsWbIkY8aMyZAhQ8rHGhoa0tramieffLJc82bnpq1bt2bZsmVtarp165YJEyY4NwFQiHMKAB3l7VxzW7JkSfr375+PfOQj5ZoJEyakW7duefzxx8s1b3X9DwB2Z/369UlS/lxp2bJl2bZtW5tz06hRozJ8+PA256Z3e22PPYPgFR1m1qxZ2WeffTJw4MA0NTXlRz/6UXmsubm5zV8wScrPm5ub37TmteOvfd3uagBgd5566qlcc801+fKXv1w+5twEwJ7m3ZybWltbs2nTprS0tGTHjh3OTQC8a84pAHSUt3PNrbm5OYMHD24z3qNHjwwYMOAtf3567XsAwB/auXNnzjnnnPzRH/1RDj300CT/fd6orq5O//7929T+4bnp3V7bY88geEXF/M3f/E2qqqre9LF69epy/fnnn5/ly5fn/vvvT/fu3XPGGWekVCp14AoA2NsUPTclyX/913/lhBNOyCmnnJIvfelLHTRzAPZW7+TcBAAAAADsmaZPn56VK1fmtttu6+ip0EF6dPQE2Hucd955+fznP/+mNR/84AfLvx80aFAGDRqUD3/4wxk9enTq6ury2GOPpb6+PrW1tVm7dm2b1+56XltbW/51dzWvHd91bOjQoW1qjjjiiHe0RgA6l6Lnpueffz7HHXdcjjnmmFx//fVt6pybAKiEouemN1NbW5uf/vSnbY693XNT375907t373Tv3j3du3d/0/MXALwdgwYNck4BoEO8nWtutbW1efHFF9u8bvv27XnppZfe8uen174HALzWjBkzsmDBgixatCj7779/+XhtbW22bt2aV155pc2uV3/4mdG7vbbHnsGOV1TM+9///owaNepNH6+9L/Zr7dy5M0myZcuWJEl9fX0WLVqUbdu2lWsaGxszcuTI7LfffuWahQsXtunT2NiY+vr6JMmIESNSW1vbpqa1tTWPP/54uQaAvVuRc9N//dd/Zfz48Rk7dmxuvPHGdOvW9tsk5yYAKuHd/Nz0h+rr6/Of//mfbT48aGxsTN++fXPwwQeXa97s3FRdXZ2xY8e2qdm5c2cWLlzo3ARAIc4pAHSUt3PNrb6+Pq+88kqWLVtWrnnwwQezc+fOjBs3rlzzVtf/ACBJSqVSZsyYkR/+8Id58MEHM2LEiDbjY8eOTc+ePducm9asWZOmpqY256Z3e22PPUQJ3mOPPfZY6ZprriktX7689Oyzz5YWLlxYOuaYY0oHHnhgafPmzaVSqVR65ZVXSkOGDCmdfvrppZUrV5Zuu+22Up8+fUr/+I//WO7zH//xH6UePXqU/uEf/qG0atWq0je/+c1Sz549S//5n/9Zrrn00ktL/fv3L/3oRz8qPfHEE6U/+7M/K40YMaK0adOm93zdAOy5fvvb35YOOuig0vHHH1/67W9/W3rhhRfKj12cmwB4r/3mN78pLV++vHTRRReV3ve+95WWL19eWr58een3v/99qVQqlbZv31469NBDSxMnTiytWLGidO+995be//73l2bPnl3u8fTTT5f69OlTOv/880urVq0qzZs3r9S9e/fSvffeW6657bbbSjU1NaWbbrqp9Mtf/rI0bdq0Uv/+/UvNzc3v+ZoB6NycUwBoL7///e/LPxMlKV155ZWl5cuXl37zm9+USqW3d83thBNOKB155JGlxx9/vPSTn/yk9KEPfah06qmnlsffzvU/ACiVSqWzzz671K9fv9LDDz/c5jOljRs3lmvOOuus0vDhw0sPPvhgaenSpaX6+vpSfX19ebxS1/boeIJXvOeeeOKJ0nHHHVcaMGBAqaampvSBD3ygdNZZZ5V++9vftqn7xS9+Ufr4xz9eqqmpKf2P//E/Spdeeunret1xxx2lD3/4w6Xq6urSIYccUrr77rvbjO/cubP0jW98ozRkyJBSTU1N6fjjjy+tWbOmXdcHQOdz4403lpLs9vFazk0AvJfOPPPM3Z6bHnrooXLNs88+WzrxxBNLvXv3Lg0aNKh03nnnlbZt29amz0MPPVQ64ogjStXV1aUPfvCDpRtvvPF173XNNdeUhg8fXqquri4dffTRpccee6ydVwfA3so5BYD28NBDD+3256MzzzyzVCq9vWtu69atK5166qml973vfaW+ffuWvvCFL5T/Ycsub+f6HwC80WdKr73utmnTptL/+l//q7TffvuV+vTpU/rzP//zNv/gv1Sq3LU9OlZVqVQqvYcbbAEAAAAAAAAAAHR63Tp6AgAAAAAAAAAAAJ2N4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAX9/wBnlNT6UpDvhQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(30, 6)) # Set the figure size to 10x6\n", "bin_edges = np.arange(filtered_dates[\"correct\"].min(), filtered_dates[\"correct\"].max() + 51, 50)\n", "plt.hist(filtered_dates[\"correct\"] * weights, bins=bin_edges, edgecolor=\"black\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAACV4AAAH5CAYAAABz8bcJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABSNElEQVR4nO39f3RV9Z0v/j/DjwSwBiQUAtdgqbSAir9oS+O0jl4ZokVnuLXO1IrSltbqxU4Vrzp2WYt6Z/Dq4I9WW8bVUTsfdazOtDqDjjViFVtRK0ItFvnWqg0dDTaopCiEX+f7xyzOmIo/tp6YBB6Ptc4ie79f53XeO+RkJ+c8895VpVKpFAAAAAAAAAAAAN62Pt09AQAAAAAAAAAAgN5G8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAgvp19wS607Zt2/Lcc89l9913T1VVVXdPBwAAAAAAAAAA6GalUil/+MMfMmrUqPTp88brWu3SwavnnnsuDQ0N3T0NAAAAAAAAAACgh1m9enX23HPPNxzfpYNXu+++e5L/+iTV1tZ282wAAAAAAAAAAIDu1t7enoaGhnK26I3s0sGr7ZcXrK2tFbwCAAAAAAAAAADKtmeL3sgbX4QQAAAAAAAAAACAHRK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAACioX3dPAAAAAAAAeG+1tLSkra2toj2HDRuW0aNHV7QnAABATyZ4BQAAAAAAu5CWlpaMGz8hGze8WtG+AwYOyqonVwpfAQAAuwzBKwAAAAAA2IW0tbVl44ZXU3f0melf11CRnpvXrs7ahfPT1tYmeAUAAOwyBK8AAAAAAGAX1L+uITX1Y7t7GgAAAL1Wn+6eAAAAAAAAAAAAQG8jeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFFQoeDVv3rx89KMfze67757hw4dn+vTpWbVqVaeajRs3Zvbs2amrq8v73ve+HHvssVmzZk2nmpaWlkybNi2DBg3K8OHDc9ZZZ2XLli2dau67774cfPDBqampydixY3P99de/bj5XX311PvCBD2TAgAGZPHlyHnnkkSKHAwAAAAAAAAAA8I4UCl7df//9mT17dh566KE0Nzdn8+bNmTp1al555ZVyzRlnnJF///d/z6233pr7778/zz33XD796U+Xx7du3Zpp06Zl06ZNefDBB/P9738/119/fc4///xyzTPPPJNp06bl8MMPz/Lly3P66afnS1/6Un784x+Xa37wgx9kzpw5+eY3v5nHHnssBxxwQJqamvLCCy+8m88HAAAAAAAAAADAW6oqlUqld3rn3//+9xk+fHjuv//+HHrooVm3bl3e//7356abbspnPvOZJMmTTz6ZCRMmZMmSJfn4xz+e//iP/8jRRx+d5557LiNGjEiSLFiwIOecc05+//vfp7q6Ouecc07uuOOOrFixovxYn/3sZ/Pyyy/nrrvuSpJMnjw5H/3oR3PVVVclSbZt25aGhoZ89atfzd/8zd+8rfm3t7dn8ODBWbduXWpra9/ppwEAAAAAAHqNxx57LJMmTUr9zCtSUz+2Ij07Wp9K6/dPz9KlS3PwwQdXpCcAAEB3ebuZokIrXv2xdevWJUmGDh2aJFm6dGk2b96cKVOmlGvGjx+f0aNHZ8mSJUmSJUuWZOLEieXQVZI0NTWlvb09TzzxRLnmtT2212zvsWnTpixdurRTTZ8+fTJlypRyzY50dHSkvb290w0AAAAAAAAAAKCodxy82rZtW04//fT8yZ/8Sfbbb78kSWtra6qrqzNkyJBOtSNGjEhra2u55rWhq+3j28ferKa9vT0bNmxIW1tbtm7dusOa7T12ZN68eRk8eHD51tDQUPzAAQAAAAAAAACAXd47Dl7Nnj07K1asyM0331zJ+XSpc889N+vWrSvfVq9e3d1TAgAAAAAAAAAAeqF+7+ROp512WhYuXJjFixdnzz33LO+vr6/Ppk2b8vLLL3da9WrNmjWpr68v1zzyyCOd+q1Zs6Y8tv3f7fteW1NbW5uBAwemb9++6du37w5rtvfYkZqamtTU1BQ/YAAAAAAAAAAAgNcotOJVqVTKaaedlh/96Ee59957M2bMmE7jkyZNSv/+/bNo0aLyvlWrVqWlpSWNjY1JksbGxvzyl7/MCy+8UK5pbm5ObW1t9tlnn3LNa3tsr9neo7q6OpMmTepUs23btixatKhcAwAAAAAAAAAA0FUKrXg1e/bs3HTTTbn99tuz++67p7W1NUkyePDgDBw4MIMHD86sWbMyZ86cDB06NLW1tfnqV7+axsbGfPzjH0+STJ06Nfvss09OPPHEXHLJJWltbc15552X2bNnl1ejOuWUU3LVVVfl7LPPzhe/+MXce++9ueWWW3LHHXeU5zJnzpzMnDkzH/nIR/Kxj30sV1xxRV555ZV84QtfqNTnBgAAAAAAAAAAYIcKBa+++93vJkkOO+ywTvuvu+66fP7zn0+SXH755enTp0+OPfbYdHR0pKmpKd/5znfKtX379s3ChQtz6qmnprGxMbvttltmzpyZCy+8sFwzZsyY3HHHHTnjjDNy5ZVXZs8998z3vve9NDU1lWv+6q/+Kr///e9z/vnnp7W1NQceeGDuuuuujBgxoujnAAAAAAAAAAAAoJCqUqlU6u5JdJf29vYMHjw469atS21tbXdPBwAAAAAAutxjjz2WSZMmpX7mFampH1uRnh2tT6X1+6dn6dKlOfjggyvSEwAAoLu83UxRn/dwTgAAAAAAAAAAADsFwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgoMLBq8WLF+eYY47JqFGjUlVVldtuu63TeFVV1Q5vl156abnmAx/4wOvGL7744k59Hn/88Xzyk5/MgAED0tDQkEsuueR1c7n11lszfvz4DBgwIBMnTsydd95Z9HAAAAAAAAAAAAAKKxy8euWVV3LAAQfk6quv3uH4888/3+l27bXXpqqqKscee2ynugsvvLBT3Ve/+tXyWHt7e6ZOnZq99torS5cuzaWXXpq5c+fmmmuuKdc8+OCDOf744zNr1qwsW7Ys06dPz/Tp07NixYqihwQAAAAAAAAAAFBIv6J3OOqoo3LUUUe94Xh9fX2n7dtvvz2HH354PvjBD3bav/vuu7+udrsbb7wxmzZtyrXXXpvq6ursu+++Wb58eS677LKcfPLJSZIrr7wyRx55ZM4666wkyUUXXZTm5uZcddVVWbBgwQ77dnR0pKOjo7zd3t7+1gcMAAAAAAAAAADwRwqveFXEmjVrcscdd2TWrFmvG7v44otTV1eXgw46KJdeemm2bNlSHluyZEkOPfTQVFdXl/c1NTVl1apVeemll8o1U6ZM6dSzqakpS5YsecP5zJs3L4MHDy7fGhoa3u0hAgAAAAAAAAAAu6AuDV59//vfz+67755Pf/rTnfb/9V//dW6++eb85Cc/yVe+8pX83d/9Xc4+++zyeGtra0aMGNHpPtu3W1tb37Rm+/iOnHvuuVm3bl35tnr16nd1fAAAAAAAAAAAwK6p8KUGi7j22mtzwgknZMCAAZ32z5kzp/zx/vvvn+rq6nzlK1/JvHnzUlNT02Xzqamp6dL+AAAAAAAAAADArqHLVrx64IEHsmrVqnzpS196y9rJkydny5YtefbZZ5Mk9fX1WbNmTaea7dv19fVvWrN9HAAAAAAAAAAAoKt0WfDqH//xHzNp0qQccMABb1m7fPny9OnTJ8OHD0+SNDY2ZvHixdm8eXO5prm5OePGjcsee+xRrlm0aFGnPs3NzWlsbKzgUQAAAAAAAAAAALxe4eDV+vXrs3z58ixfvjxJ8swzz2T58uVpaWkp17S3t+fWW2/d4WpXS5YsyRVXXJFf/OIXefrpp3PjjTfmjDPOyIwZM8qhqs997nOprq7OrFmz8sQTT+QHP/hBrrzyyk6XKPza176Wu+66K/Pnz8+TTz6ZuXPn5tFHH81pp51W9JAAAAAAAAAAAAAK6Vf0Do8++mgOP/zw8vb2MNTMmTNz/fXXJ0luvvnmlEqlHH/88a+7f01NTW6++ebMnTs3HR0dGTNmTM4444xOoarBgwfn7rvvzuzZszNp0qQMGzYs559/fk4++eRyzSGHHJKbbrop5513Xr7+9a/nQx/6UG677bbst99+RQ8JAAAAAAAAAACgkKpSqVTq7kl0l/b29gwePDjr1q1LbW1td08HAAAAAAC63GOPPZZJkyalfuYVqakfW5GeHa1PpfX7p2fp0qU5+OCDK9ITAACgu7zdTFHhSw0CAAAAAAAAAADs6gSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoCDBKwAAAAAAAAAAgIIErwAAAAAAAAAAAAoSvAIAAAAAAAAAAChI8AoAAAAAAAAAAKAgwSsAAAAAAAAAAICCBK8AAAAAAAAAAAAKErwCAAAAAAAAAAAoSPAKAAAAAAAAAACgIMErAAAAAAAAAACAggSvAAAAAAAAAAAAChK8AgAAAAAAAAAAKEjwCgAAAAAAAAAAoKDCwavFixfnmGOOyahRo1JVVZXbbrut0/jnP//5VFVVdbodeeSRnWpefPHFnHDCCamtrc2QIUMya9asrF+/vlPN448/nk9+8pMZMGBAGhoacskll7xuLrfeemvGjx+fAQMGZOLEibnzzjuLHg4AAAAAAAAAAEBhhYNXr7zySg444IBcffXVb1hz5JFH5vnnny/f/vmf/7nT+AknnJAnnngizc3NWbhwYRYvXpyTTz65PN7e3p6pU6dmr732ytKlS3PppZdm7ty5ueaaa8o1Dz74YI4//vjMmjUry5Yty/Tp0zN9+vSsWLGi6CEBAAAAAAAAAAAU0q/oHY466qgcddRRb1pTU1OT+vr6HY6tXLkyd911V37+85/nIx/5SJLk29/+dj71qU/l7//+7zNq1KjceOON2bRpU6699tpUV1dn3333zfLly3PZZZeVA1pXXnlljjzyyJx11llJkosuuijNzc256qqrsmDBgqKHBQAAAAAAAAAA8LYVXvHq7bjvvvsyfPjwjBs3LqeeemrWrl1bHluyZEmGDBlSDl0lyZQpU9KnT588/PDD5ZpDDz001dXV5ZqmpqasWrUqL730UrlmypQpnR63qakpS5YsecN5dXR0pL29vdMNAAAAAAAAAACgqIoHr4488sj80z/9UxYtWpT/9//+X+6///4cddRR2bp1a5KktbU1w4cP73Sffv36ZejQoWltbS3XjBgxolPN9u23qtk+viPz5s3L4MGDy7eGhoZ3d7AAAAAAAAAAAMAuqfClBt/KZz/72fLHEydOzP7775+999479913X4444ohKP1wh5557bubMmVPebm9vF74CAAAAAAAAAAAK65JLDb7WBz/4wQwbNixPPfVUkqS+vj4vvPBCp5otW7bkxRdfTH19fblmzZo1nWq2b79VzfbxHampqUltbW2nGwAAAAAAAAAAQFFdHrz63e9+l7Vr12bkyJFJksbGxrz88stZunRpuebee+/Ntm3bMnny5HLN4sWLs3nz5nJNc3Nzxo0blz322KNcs2jRok6P1dzcnMbGxq4+JAAAAAAAAAAAYBdXOHi1fv36LF++PMuXL0+SPPPMM1m+fHlaWlqyfv36nHXWWXnooYfy7LPPZtGiRfmLv/iLjB07Nk1NTUmSCRMm5Mgjj8yXv/zlPPLII/nZz36W0047LZ/97GczatSoJMnnPve5VFdXZ9asWXniiSfygx/8IFdeeWWnywR+7Wtfy1133ZX58+fnySefzNy5c/Poo4/mtNNOq8CnBQAAAAAAAAAA4I0VDl49+uijOeigg3LQQQclSebMmZODDjoo559/fvr27ZvHH388f/7nf54Pf/jDmTVrViZNmpQHHnggNTU15R433nhjxo8fnyOOOCKf+tSn8olPfCLXXHNNeXzw4MG5++6788wzz2TSpEk588wzc/755+fkk08u1xxyyCG56aabcs011+SAAw7Iv/zLv+S2227Lfvvt924+HwAAAAAAAAAAAG+pqlQqlbp7Et2lvb09gwcPzrp161JbW9vd0wEAAAAAgC732GOPZdKkSamfeUVq6sdWpGdH61Np/f7pWbp0aQ4++OCK9AQAAOgubzdTVHjFKwAAAAAAAAAAgF2d4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEH9unsCAAAAAADAG2tpaUlbW1vF+q1cubJivQAAAHZlglcAAAAAANBDtbS0ZNz4Cdm44dXungoAAAB/RPAKAAAAAAB6qLa2tmzc8Grqjj4z/esaKtJzw9OPZt0DN1SkFwAAwK5M8AoAAAAAAHq4/nUNqakfW5Fem9eurkgfAACAXV2f7p4AAAAAAAAAAABAbyN4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQYJXAAAAAAAAAAAABQleAQAAAAAAAAAAFCR4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGFg1eLFy/OMccck1GjRqWqqiq33XZbeWzz5s0555xzMnHixOy2224ZNWpUTjrppDz33HOdenzgAx9IVVVVp9vFF1/cqebxxx/PJz/5yQwYMCANDQ255JJLXjeXW2+9NePHj8+AAQMyceLE3HnnnUUPBwAAAAAAAAAAoLDCwatXXnklBxxwQK6++urXjb366qt57LHH8o1vfCOPPfZYfvjDH2bVqlX58z//89fVXnjhhXn++efLt69+9avlsfb29kydOjV77bVXli5dmksvvTRz587NNddcU6558MEHc/zxx2fWrFlZtmxZpk+fnunTp2fFihVFDwkAAAAAAAAAAKCQfkXvcNRRR+Woo47a4djgwYPT3Nzcad9VV12Vj33sY2lpacno0aPL+3fffffU19fvsM+NN96YTZs25dprr011dXX23XffLF++PJdddllOPvnkJMmVV16ZI488MmeddVaS5KKLLkpzc3OuuuqqLFiwoOhhAQAAAAAAAAAAvG2FV7wqat26damqqsqQIUM67b/44otTV1eXgw46KJdeemm2bNlSHluyZEkOPfTQVFdXl/c1NTVl1apVeemll8o1U6ZM6dSzqakpS5YsecO5dHR0pL29vdMNAAAAAAAAAACgqMIrXhWxcePGnHPOOTn++ONTW1tb3v/Xf/3XOfjggzN06NA8+OCDOffcc/P888/nsssuS5K0trZmzJgxnXqNGDGiPLbHHnuktbW1vO+1Na2trW84n3nz5uWCCy6o1OEBAAAAAAAAAAC7qC4LXm3evDl/+Zd/mVKplO9+97udxubMmVP+eP/99091dXW+8pWvZN68eampqemqKeXcc8/t9Njt7e1paGjosscDAAAAAAAAAAB2Tl0SvNoeuvrtb3+be++9t9NqVzsyefLkbNmyJc8++2zGjRuX+vr6rFmzplPN9u36+vryvzuq2T6+IzU1NV0a7AIAAAAAAAAAAHYNfSrdcHvo6te//nXuueee1NXVveV9li9fnj59+mT48OFJksbGxixevDibN28u1zQ3N2fcuHHZY489yjWLFi3q1Ke5uTmN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xsbG1NfXZ82aNZ3uu327vr6+/O+Oal47vn3fyJEjO9UceOCB7+gYAehdip6bnnvuuRx++OE55JBDcs0113Sqc24CoBKKnpveTH19fR555JFO+97uuam2tjYDBw5M375907dv3zc9fwHA2zFs2DDnFAC6xdt5za2+vj4vvPBCp/tt2bIlL7744lv+/vTaxwCA1zrttNOycOHCLF68OHvuuWd5f319fTZt2pSXX36506pXf/ye0bt9bY+ewYpXVMz73//+jB8//k1vr70u9mtt27YtSdLR0ZEkaWxszOLFi7N58+ZyTXNzc8aNG5c99tijXLNo0aJOfZqbm9PY2JgkGTNmTOrr6zvVtLe35+GHHy7XALBzK3Ju+s///M8cdthhmTRpUq677rr06dP5xyTnJgAq4d383vTHGhsb88tf/rLTmwfNzc2pra3NPvvsU655s3NTdXV1Jk2a1Klm27ZtWbRokXMTAIU4pwDQXd7Oa26NjY15+eWXs3Tp0nLNvffem23btmXy5Mnlmrd6/Q8AkqRUKuW0007Lj370o9x7770ZM2ZMp/FJkyalf//+nc5Nq1atSktLS6dz07t9bY8eogTvsYceeqj07W9/u7Rs2bLSs88+W1q0aFHpkEMOKe29996ljRs3lkqlUunll18ujRgxonTiiSeWVqxYUbr55ptLgwYNKv3DP/xDuc/PfvazUr9+/Up///d/X1q5cmXpm9/8Zql///6lX/7yl+Waiy++uDRkyJDS7bffXnr88cdLf/EXf1EaM2ZMacOGDe/5cQPQc/3ud78rjR07tnTEEUeUfve735Wef/758m075yYA3mu//e1vS8uWLStdcMEFpfe9732lZcuWlZYtW1b6wx/+UCqVSqUtW7aU9ttvv9LUqVNLy5cvL911112l97///aVzzz233OPpp58uDRo0qHTWWWeVVq5cWbr66qtLffv2Ld11113lmptvvrlUU1NTuv7660u/+tWvSieffHJpyJAhpdbW1vf8mAHo3ZxTAOgqf/jDH8q/EyUpXXbZZaVly5aVfvvb35ZKpbf3mtuRRx5ZOuigg0oPP/xw6ac//WnpQx/6UOn4448vj7+d1/8AoFQqlU499dTS4MGDS/fdd1+n95ReffXVcs0pp5xSGj16dOnee+8tPfroo6XGxsZSY2NjebxSr+3R/QSveM89/vjjpcMPP7w0dOjQUk1NTekDH/hA6ZRTTin97ne/61T3i1/8ovSJT3yiVFNTU/of/+N/lC6++OLX9brllltKH/7wh0vV1dWlfffdt3THHXd0Gt+2bVvpG9/4RmnEiBGlmpqa0hFHHFFatWpVlx4fAL3PddddV0qyw9trOTcB8F6aOXPmDs9NP/nJT8o1zz77bOmoo44qDRw4sDRs2LDSmWeeWdq8eXOnPj/5yU9KBx54YKm6urr0wQ9+sHTddde97rG+/e1vl0aPHl2qrq4ufexjHys99NBDXXx0AOysnFMA6Ao/+clPdvj70cyZM0ul0tt7zW3t2rWl448/vvS+972vVFtbW/rCF75Q/sOW7d7O638A8EbvKb32dbcNGzaU/vf//t+lPfbYozRo0KDS//pf/6vTH/yXSpV7bY/uVVUqlUrv4QJbAAAAAAAAAAAAvV6f7p4AAAAAAAAAAABAbyN4BQAAAAAAAAAAUJDgFQAAAAAAAAAAQEGCVwAAAAAAAAAAAAUJXgEAAAAAAAAAABQkeAUAAAAAAAAAAFCQ4BUAAAAAAAAAAEBBglcAAAAAAAAAAAAFCV4BAAAAAAAAAAAUJHgFAAAAAAAAAABQkOAVAAAAAAAAAABAQf9/6o/N+aWugMEAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(30, 6)) # Set the figure size to 10x6\n", "bin_edges = np.arange(filtered_dates[\"correct\"].min(), filtered_dates[\"correct\"].max() + 51, 50)\n", "plt.hist(filtered_dates[\"correct\"], bins=bin_edges, edgecolor=\"black\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "from scipy.ndimage import gaussian_filter1d\n", "from scipy.signal.windows import triang\n", "from scipy.ndimage import convolve1d\n", "\n", "\n", "def get_lds_kernel_window(lds_kernel=\"gaussian\", lds_ks=9, lds_sigma=1):\n", " r\"\"\"Function to determine the label distribution smoothing kernel window\n", "\n", " lds_kernel (str): LDS kernel type\n", " lds_ks (int): LDS kernel size (should be an odd number).\n", " lds_sigma (float): LDS gaussian/laplace kernel sigma\n", " \"\"\"\n", "\n", " assert lds_kernel in [\"gaussian\", \"triang\", \"laplace\"]\n", " half_ks = (lds_ks - 1) // 2\n", "\n", " if lds_kernel == \"gaussian\":\n", " base_kernel = [0.0] * half_ks + [1.0] + [0.0] * half_ks\n", " kernel_window = gaussian_filter1d(base_kernel, sigma=lds_sigma) / max(\n", " gaussian_filter1d(base_kernel, sigma=lds_sigma)\n", " )\n", " elif lds_kernel == \"triang\":\n", " kernel_window = triang(lds_ks)\n", " else:\n", "\n", " def laplace(x):\n", " return np.exp(-abs(x) / lds_sigma) / (2.0 * lds_sigma)\n", "\n", " kernel_window = list(map(laplace, np.arange(-half_ks, half_ks + 1))) / max(\n", " map(laplace, np.arange(-half_ks, half_ks + 1))\n", " )\n", "\n", " return kernel_window\n", "\n", "\n", "def prepare_LDS_weights(\n", " labels,\n", " n_bins=None,\n", " label_range=None,\n", " reweight=\"inv\",\n", " lds_kernel=\"gaussian\",\n", " lds_ks=9,\n", " lds_sigma=1,\n", " max_rel_weight=None,\n", " show_plot=True,\n", "):\n", "\n", " assert reweight in {\"inv\", \"sqrt_inv\"}\n", " labels_shape = labels.shape\n", " if n_bins is None:\n", " labels = labels.astype(int)\n", " n_bins = np.max(labels) - np.min(labels)\n", " num_per_label, bin_edges = np.histogram(labels, bins=n_bins, range=label_range)\n", " new_labels = np.searchsorted(bin_edges, labels, side=\"left\")\n", " new_labels[new_labels == 0] = 1\n", " if reweight == \"sqrt_inv\":\n", " num_per_label = np.sqrt(num_per_label)\n", " lds_kernel_window = get_lds_kernel_window(\n", " lds_kernel=lds_kernel, lds_ks=lds_ks, lds_sigma=lds_sigma\n", " )\n", " smoothed_value = convolve1d(num_per_label, weights=lds_kernel_window, mode=\"constant\")\n", " if show_plot:\n", " plt.bar(\n", " bin_edges[:-1],\n", " num_per_label / num_per_label.sum(),\n", " width=(bin_edges[1] - bin_edges[0]),\n", " color=\"lime\",\n", " edgecolor=\"black\",\n", " label=\"original\",\n", " )\n", " plt.plot(\n", " bin_edges[:-1], smoothed_value / smoothed_value.sum(), color=\"red\", label=\"smoothed\"\n", " )\n", " plt.title(f\"Label distribution by bin (reweight={reweight})\")\n", " plt.legend(loc=\"best\")\n", " plt.show()\n", " num_per_label = smoothed_value[new_labels.flatten() - 1].reshape(*labels_shape)\n", " weights = 1 / num_per_label\n", " weights[num_per_label == 0] = 0\n", " if max_rel_weight is not None:\n", " weights = np.clip(weights, None, np.min(weights) * max_rel_weight)\n", " weights = weights / weights.sum() * len(labels)\n", " return torch.Tensor(weights)" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGzCAYAAAAMr0ziAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB23ElEQVR4nO3deVwU9f/A8RcgsICCCgre4oV45IFKXmlpYtmBlZqZV2WnZVlWdqidZqVpapl9UyszTX9ll0fmUd4HeIt4pOKFiIoo9/H5/THsygoox+7O7vJ+Ph772NnZz8y8Z1iWN5/5HC5KKYUQQgghhB1z1TsAIYQQQoibkYRFCCGEEHZPEhYhhBBC2D1JWIQQQghh9yRhEUIIIYTdk4RFCCGEEHZPEhYhhBBC2D1JWIQQQghh9yRhEUIIIYTdk4RFFHD8+HFcXFz49NNPLbbPdevW4eLiwrp160q1/YQJE3BxcTFbV79+fYYNG1b24G7CeD3mzZtnWjds2DAqVqxo9WMbubi4MGHCBJsdz8hW5+ni4sLIkSNvWm7evHm4uLhw/Phxix7/5MmTGAwGNm7caNH9WltZPhfFvebllbV/5y5cuICPjw/Lli2z2jGcjSQsTsL4Rb5jxw69Q7Fry5Yt0+UPf3HYc2zO7t133yU8PJzOnTvrHYrd2bRpExMmTCApKUnvUErsww8/ZOnSpXqHUSh/f3+eeOIJ3n77bb1DcRiSsAiHFRsby9dff12ibZYtW8Y777xTom3q1atHWloagwcPLtF2JXWj2NLS0njrrbesenxHMHjwYNLS0qhXr57F9nn+/Hm+/fZbnn76aYvt01Zs8bnYtGkT77zzTrlLWGxxbZ9++mmio6NZs2aNVY/jLCRhEQ7L09MTd3d3q+0/OzubzMxMXFxcMBgMuLm5We1YN2MwGKhQoYJux7cXbm5uGAyGArcHy2L+/PlUqFCBe++996ZlU1NTLXZcS5DPRUFKKdLS0sq8H1tc29DQUFq0aGF2u1kUTRKWciQzM5Nx48YRFhaGn58fPj4+dO3albVr1xa5zWeffUa9evXw8vKiW7du7Nu3r0CZgwcP8tBDD1G1alUMBgPt2rXjt99+K3WcGzZsoH379hgMBho2bMhXX31VaLnr27BkZWXxzjvv0LhxYwwGA/7+/nTp0oVVq1YBWnuMmTNnAtr9aeMDzNvtTJ06lYYNG+Lp6cmBAwcKbcNi9N9//xEREYGPjw81a9bk3XffJf8E6EW13bl+nzeKzbju+ttFO3fu5K677sLX15eKFSvSo0cPtmzZYlbGeKtw48aNjB49mmrVquHj40Pfvn05f/584T+AQtzoPJVS1K9fn/vvv7/Adunp6fj5+fHUU08V6zg//PADISEhGAwGwsLC+Pfffws9n/xtWOrXr88999zDhg0b6NChAwaDgQYNGvDdd98V65hLly4lPDy8QFud7t2706JFC6Kiorjtttvw9vbmjTfeACAjI4Px48fTqFEjPD09qVOnDq+++ioZGRmm7R944AHatm1rts97770XFxcXs9+PrVu34uLiwvLly03rkpKSePHFF6lTpw6enp40atSISZMmkZuba7a/wj4X69ato127dma/P4W1Act//i1atMDT05PmzZuzYsUK03sTJkxgzJgxAAQHB5s+l2VtQ7Rw4ULCwsKoVKkSvr6+tGzZkmnTppmV2b9/P3fccQdeXl7Url2b999/nzlz5hT581+5ciXt2rXDy8uLr776ChcXF1JSUvj2229NcZekzdv119Z4DY8cOcKwYcOoXLkyfn5+DB8+3CyRbdGiBbfffnuB/eXm5lKrVi0eeughs/V33nknv//+u9n3hiicpOblSHJyMv/73/8YOHAgI0aM4MqVK3zzzTdERESwbds2WrdubVb+u+++48qVKzz33HOkp6czbdo07rjjDvbu3UtgYCCgfal07tyZWrVq8frrr+Pj48NPP/1EZGQk//d//0ffvn1LFOPevXvp1asX1apVY8KECWRnZzN+/HjT8W5kwoQJTJw4kSeeeIIOHTqQnJzMjh07iI6O5s477+Spp57izJkzrFq1iu+//77QfcydO5f09HSefPJJPD09qVq1aoE/EkY5OTn07t2bW2+9lY8//pgVK1Ywfvx4srOzeffdd0t03sWJLb/9+/fTtWtXfH19efXVV3F3d+err76ie/fu/PPPP4SHh5uVf/7556lSpQrjx4/n+PHjTJ06lZEjR7Jo0aKbHutm5+ni4sKjjz7Kxx9/zMWLF6latapp299//53k5GQeffTRmx7nn3/+YdGiRbzwwgt4enryxRdf0Lt3b7Zt20aLFi1uuO2RI0d46KGHePzxxxk6dChz5sxh2LBhhIWF0bx58yK3y8rKYvv27TzzzDOFvn/hwgXuuusuHn74YR599FECAwPJzc3lvvvuY8OGDTz55JOEhoayd+9ePvvsMw4dOmS6BdG1a1d+/fVXkpOT8fX1RSnFxo0bcXV1Zf369dx3330ArF+/HldXV1P7mdTUVLp168bp06d56qmnqFu3Lps2bWLs2LGcPXuWqVOnFnk+O3fupHfv3tSoUYN33nmHnJwc3n33XapVq1Zo+Q0bNvDzzz/z7LPPUqlSJT7//HMefPBB4uLi8Pf354EHHuDQoUP8+OOPfPbZZwQEBACY9nf58mWysrJu+LMBrbbCmBCuWrWKgQMH0qNHDyZNmgRATEwMGzduZNSoUQDEx8dz++23k52dbfpemT17Nl5eXoXuPzY2loEDB/LUU08xYsQIQkJC+P77703fBU8++SQADRs2vGmsN9O/f3+Cg4OZOHEi0dHR/O9//6N69eqmcxkwYAATJkwgPj6eoKAg03YbNmzgzJkzPPzww2b7CwsL47PPPmP//v03/ZyXe0o4hblz5ypAbd++vcgy2dnZKiMjw2zdpUuXVGBgoHrsscdM644dO6YA5eXlpU6dOmVav3XrVgWol156ybSuR48eqmXLlio9Pd20Ljc3V3Xq1Ek1btzYtG7t2rUKUGvXrr3heURGRiqDwaBOnDhhWnfgwAHl5uamrv+41qtXTw0dOtT0ulWrVqpPnz433P9zzz1XYD/5z9nX11clJCQU+t7cuXNN64YOHaoA9fzzz5vW5ebmqj59+igPDw91/vz5G553YfssKjallALU+PHjTa8jIyOVh4eHOnr0qGndmTNnVKVKldRtt91mWmf8XPTs2VPl5uaa1r/00kvKzc1NJSUlFXq8kp5nbGysAtSXX35ptv19992n6tevb3bsos4PUDt27DCtO3HihDIYDKpv374FzufYsWOmdfXq1VOA+vfff03rEhISlKenp3r55ZdveNwjR44oQE2fPr3Ae926dVOAmjVrltn677//Xrm6uqr169ebrZ81a5YC1MaNG5VSSm3fvl0BatmyZUoppfbs2aMA1a9fPxUeHm7a7r777lNt2rQxvX7vvfeUj4+POnTokNn+X3/9deXm5qbi4uJM667/XNx7773K29tbnT592rTu8OHDqkKFCgU+W4Dy8PBQR44cMa3bvXt3gevxySefFLjm11+jmz3y/56OGjVK+fr6quzs7AL7M3rx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IDw8nG3btt2w/OLFi2natCkGg4GWLVuybNmyIss+/fTTuLi4WLSfuRBCCGENDRs2xMPDg40bN5rWZWVlsX37dpo1a1asffj5+REYGGhqqAuQk5NDdHR0mWLbtGkT9erV480336Rdu3Y0btyYEydOlGmfeirxLaFFixYxevRoZs2aRXh4OFOnTiUiIoLY2FiqV69eoPymTZsYOHAgEydO5J577mHBggVERkYSHR1NixYtzMr+8ssvbNmyhZo1a5b+jIQQQjifGPs8jo+PD8888wxjxoyhatWq1K1bl48//pjU1FQef/xxdu/eXaz9PP/880ycOJFGjRrRtGlTpk+fzqVLl3BxcSnFSWgaN25MXFwcCxcupH379vz555/88ssvpd6f3kqcsEyZMoURI0YwfPhwAGbNmsWff/7JnDlzeP311wuUnzZtGr1792bMmDEAvPfee6xatYoZM2Ywa9YsU7nTp0/z/PPPs3LlSvr06VPa8xFCCOFEAgICMHgbSH/UtiPdBgQEFLv8Rx99RG5uLoMHD+bKlSu0a9eOlStXUqVKlWLv47XXXiM+Pp4hQ4bg5ubGk08+SUREBG5ubqU5BQDuu+8+XnrpJUaOHElGRgZ9+vTh7bffZsKECaXep55clFKquIUzMzPx9vZmyZIlZn3Dhw4dSlJSEr/++muBberWrcvo0aPN+o6PHz+epUuXmjLP3Nxcevbsyf3338+oUaOoX78+L774otk2+WVkZJCRkWF6nZycTJ06dbh8+bLDNiYSQojCREdHExYWBlFoA6f9ADzKtdcA0UAYREVF0batY46ulp6ezrFjxwgODsZgMJi9Vx7nEsrNzSU0NJT+/fvz3nvv6RqLJRT1801OTsbPz69Yf79LVMOSmJhITk4OgYGBZusDAwM5ePBgodvEx8cXWj4+Pt70etKkSVSoUIEXXnihWHFMnDiRd955pyShCyGEcFB169bVPYGwthMnTvDXX3/RrVs3MjIymDFjBseOHeORRx7ROzS7oXsvoaioKKZNm8a8efOKfa9u7NixXL582fQ4efKklaMUQgghrMfV1ZV58+bRvn17OnfuzN69e/n7778JDbXFBEqOoUQ1LAEBAbi5uXHu3Dmz9efOnSMoKKjQbYKCgm5Yfv369SQkJJhlzzk5Obz88stMnTqV48ePF9inp6cnnp6eJQldCCGEsFt1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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "tensor([14.5464, 0.6404, 0.6404, ..., 0.8173, 2.5599, 0.8173])" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prepare_LDS_weights(\n", " filtered_dates[\"correct\"],\n", " n_bins=100,\n", " label_range=(-3000, 2021),\n", " reweight=\"sqrt_inv\",\n", " lds_ks=5,\n", " lds_sigma=2,\n", ")" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGzCAYAAADXFObAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACNoklEQVR4nO3deVxUVf/A8c+wgwru4obirmmamORWVjxhWUmWmfW4/SzbLMuy0sy1sk2z1CdbbbXMnjIfM8pMWxQ1FU3LtVBMQEEElB3m/P64M1cGZmAGBpgZvu/XC+/Mveeee+Y6zHw5q0EppRBCCCGEcHNetV0AIYQQQghnkKBGCCGEEB5BghohhBBCeAQJaoQQQgjhESSoEUIIIYRHkKBGCCGEEB5BghohhBBCeAQJaoQQQgjhESSoEUIIIYRHkKBGOOz48eMYDAZeeeUVp+W5ZcsWDAYDW7ZsqdT5c+fOxWAwWOxr3749EyZMqHrhKmC+H++//76+b8KECdSvX7/ar21mMBiYO3dujV3PrKZep8FgYMqUKRWme//99zEYDBw/ftyp1z958iQBAQFs3brVqflWt6q8L+y953VVdf/OnT17lnr16rFhw4Zqu4YnkqCmjjB/2O/atau2i+LSNmzYUCvBgT1cuWyebv78+URGRjJo0KDaLorL2bZtG3PnziUjI6O2i+Kw559/nrVr19Z2Maxq0qQJd999N88880xtF8WtSFAjPNbhw4d5++23HTpnw4YNzJs3z6Fz2rVrR25uLmPHjnXoPEeVV7bc3FxmzZpVrdd3B2PHjiU3N5d27do5Lc/U1FQ++OAD7rvvPqflWVNq4n2xbds25s2bV+eCmpq4t/fddx979uzhxx9/rNbreBIJaoTH8vf3x9fXt9ryLyoqoqCgAIPBQEBAAN7e3tV2rYoEBATg4+NTa9d3Fd7e3gQEBJRpiqyKjz/+GB8fH2666aYK0+bk5Djtus4g74uylFLk5uZWOZ+auLfdu3enZ8+eFk3bonwS1AhdQUEBs2fPJiIigpCQEOrVq8eQIUPYvHmzzXNeffVV2rVrR2BgIFdddRUHDhwok+bQoUPcdtttNG7cmICAAPr168e6desqXc5ff/2Vyy+/nICAADp27Mibb75pNV3pPjWFhYXMmzePzp07ExAQQJMmTRg8eDAbN24EtP4hy5cvB7T2cvMPWPYjWrJkCR07dsTf358///zTap8as7///pvo6Gjq1atHq1atmD9/Pkop/bitvkSl8yyvbOZ9pZum4uPjuf766wkODqZ+/fpce+21bN++3SKNuVly69atTJs2jWbNmlGvXj1uueUWUlNTrf8HWFHe61RK0b59e0aMGFHmvLy8PEJCQrj33nvtus4nn3xC165dCQgIICIigp9//tnq6ynZp6Z9+/bceOON/Prrr/Tv35+AgAA6dOjAhx9+aNc1165dS2RkZJm+Q0OHDqVnz57s3r2bK6+8kqCgIGbOnAlAfn4+c+bMoVOnTvj7+9O2bVueeOIJ8vPz9fNHjhxJ3759LfK86aabMBgMFr8fO3bswGAw8O233+r7MjIyeOSRR2jbti3+/v506tSJF198EaPRaJGftffFli1b6Nevn8Xvj7U+aSVff8+ePfH39+eSSy4hNjZWPzZ37lymT58OQHh4uP6+rGqfps8++4yIiAgaNGhAcHAwvXr14rXXXrNI88cff3DNNdcQGBhImzZtePbZZ3nvvfds/v9/99139OvXj8DAQN58800MBgPZ2dl88MEHerkd6YNX+t6a7+GxY8eYMGECDRs2JCQkhIkTJ1oEuz179uTqq68uk5/RaKR169bcdtttFvv/9a9/8b///c/ic0PYJiG80GVlZfHOO+8wZswY7rnnHs6fP8+7775LdHQ0O3fupE+fPhbpP/zwQ86fP8+DDz5IXl4er732Gtdccw379++nRYsWgPbBM2jQIFq3bs1TTz1FvXr1+Pzzz4mJieG///0vt9xyi0Nl3L9/P9dddx3NmjVj7ty5FBUVMWfOHP165Zk7dy4LFy7k7rvvpn///mRlZbFr1y727NnDv/71L+69916SkpLYuHEjH330kdU8Vq5cSV5eHpMnT8bf35/GjRuX+SIxKy4uZtiwYVxxxRW89NJLxMbGMmfOHIqKipg/f75Dr9uespX0xx9/MGTIEIKDg3niiSfw9fXlzTffZOjQofz0009ERkZapH/ooYdo1KgRc+bM4fjx4yxZsoQpU6awevXqCq9V0es0GAz8+9//5qWXXiI9PZ3GjRvr5/7vf/8jKyuLf//73xVe56effmL16tU8/PDD+Pv785///Idhw4axc+dOevbsWe65x44d47bbbmPSpEmMHz+e9957jwkTJhAREcEll1xi87zCwkJ+++03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nAoNDVW+vr6qdevW6sYbb1RffPGFnsbeId1KKfXTTz+piIgI5efnpzp06KBWrFihD6csqfSQ7meffVb1799fNWzYUAUGBqpu3bqp5557ThUUFOhpioqK1EMPPaSaNWumDAaDnmfJ11yarSHd9erVU3/99Ze67rrrVFBQkGrRooWaM2eOKi4utjg/NTVV3XrrrSooKEg1atRI3XvvverAgQNl8rRVNqXKDi9VSqk9e/ao6OhoVb9+fRUUFKSuvvpqtW3bNos0tob62/v/4cjrNHvggQcUoFatWlVu3iUB6sEHH1Qff/yx6ty5s/7+LF0+W0O6rQ3lv+qqq9RVV11V4bVPnz6tfHx81EcffVTm/EsuucTqOQUFBerFF19Ul1xyifL391eNGjVSERERat68eSozM9Mi7fTp0xWgXnzxRYv9nTp1UoDFsHyz8+fPqxkzZqhOnTopPz8/1bRpUzVw4ED1yiuvWLyfrb0vNm3apC677DLl5+enOnbsqN555x312GOPqYCAAIt05nteWunfK6W0YeatW7dWXl5eNod32+uLL75Q1113nWrevLny8/NTYWFh6t5771XJyckW6X7//Xd11VVXqYCAANW6dWu1YMEC9e6779r9/6+UUocOHVJXXnmlCgwMLDO0vCKl7635M8g8jYGZtfek2aBBgxSg7r77bqvXOHjwoALUDz/8YHe56jqDUjJNoRCi5jz66KO8++67pKSkEBQUVNvFscukSZM4cuSIPlLJ08TExFR5ugNX8P777zNx4kQSEhIs+nO5q0ceeYSff/6Z3bt3S02NnaRPjRCixuTl5fHxxx9z6623uk1AA1pn+d9++42tW7fWdlGqrPS6R0ePHmXDhg0MHTq0dgokrDp79izvvPMOzz77rAQ0DpA+NUKIanfmzBl++OEHvvjiC86ePatPd+8uwsLCyMvLq+1iOEWHDh2YMGECHTp04MSJE7zxxhv4+fnZHCJelxQXF1c4gKF+/fpl1gGrDk2aNLHal1GUT4IaIUS1+/PPP7nrrrto3rw5r7/+epl1xETNGTZsGJ9++ikpKSn4+/szYMAAnn/+eauTG9Y1J0+erHCivjlz5pRZJFS4DulTI4QQQqA1j/7666/lpunQoUOZGbSF65CgRgghhBAeQToKCyGEEMIj1Jk+NUajkaSkJBo0aCA9yYUQQgg3oZTi/Pnz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SilFcXEx9evXp379+g6d27hx42oqlXuQjsJCCCFENcvPz+fhhx+mefPmBAQEMHjwYH777TcAtmzZgsFg4NtvvyUiIgJ/f39+/fVX5s6dS58+ffQ8ioqKePjhh2nYsCFNmjThySefZPz48cTExOhphg4dyiOPPKI/b9++Pc8//zz/93//R4MGDQgLC+Ott96yKNuTTz5Jly5dCAoKokOHDjzzzDMUFhZW5+2oNhLUCCGEENXsiSee4L///S8ffPABe/bsoVOnTkRHR5Oenq6neeqpp3jhhRc4ePAgl156aZk8XnzxRT755BNWrlzJ1q1bycrKYu3atRVee9GiRfTr14/4+HgeeOAB7r//fg4fPqwfb9CgAe+//z5//vknr732Gm+//TavvvqqU153TZOgRgghhKhG2dnZvPHGG7z88stcf/319OjRg7fffpvAwEDeffddPd38+fP517/+RceOHa02Iy1dupQZM2Zwyy230K1bN5YtW0bDhg0rvP4NN9zAAw88QKdOnXjyySdp2rQpmzdv1o/PmjWLgQMH0r59e2666SYef/xxPv/8c6e89pomfWqEEEKIavTXX39RWFjIoEGD9H2+vr7079+fgwcPcvnllwPQr18/m3lkZmZy+vRp+vfvr+/z9vYmIiICo9FY7vVL1voYDAZCQ0M5c+aMvm/16tW8/vrr/PXXX1y4cIGioiKCg4Mdfp2uQGpqhBBCCBdQr169asm39Ggog8GgB0JxcXHcdddd3HDDDaxfv574+HiefvppCgoKqqUs1U2CGiGE8EDJyckkJibWdjEE0LFjR/z8/Ni6dau+r7CwkN9++40ePXrYlUdISAgtWrTQOxcDFBcXs2fPniqVbdu2bbRr146nn36afv360blzZ06cOFGlPGuTND8JIYQHGjlqJF4GrxqZJM5lHHTNa9SrV4/777+f6dOn07hxY8LCwnjppZfIyclh0qRJ7Nu3z658HnroIRYuXEinTp3o1q0bS5cu5dy5cxgMBscLZdK5c2cSExP57LPPuPzyy/nmm2/46quvKp1fbZOgRgghPFBBrtZ8UBOTxNW2pk2bEhAUQN6/a25G4aZNmzp0zgsvvIDRaGTs2LGcP3+efv368d1339GoUSO783jyySdJSUlh3LhxeHt7M3nyZKKjo/H29nb0JehuvvlmHn30UaZMmUJ+fj7Dhw/n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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "w = prepare_LDS_weights(\n", " filtered_dates[\"correct\"],\n", " n_bins=500,\n", " label_range=(-3000, 2021),\n", " reweight=\"sqrt_inv\",\n", " lds_ks=20,\n", " lds_sigma=2,\n", ")" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "tensor([13.8139, 0.6039, 0.6039, ..., 0.8029, 2.6979, 0.7797])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 800\n", "1 100\n", "2 100\n", "3 600\n", "4 -300\n", " ... \n", "719 -350\n", "720 -350\n", "721 -375\n", "722 -875\n", "723 -350\n", "Name: correct, Length: 197667, dtype: object" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "filtered_dates[\"correct\"]" ] }, { "cell_type": "code", "execution_count": 51, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ImageObject typeDescriptionCultureProduction dateProduction placeMaterialsSubjectsReg numberregion
0https://media.britishmuseum.org/media/Reposito...adzeAdze? of pecked and ground stone, grooved for ...Anasazi1-1600 (?)NaNstoneNaNAm1994,09.1north_america
1https://media.britishmuseum.org/media/Reposito...altarThree fragments of burnt clay that formed part...Middle Woodland Period200BC - 400ADNaNclayNaNAm,S.818north_america
2https://media.britishmuseum.org/media/Reposito...altarFragments of an altar or crematory basin made ...Middle Woodland Period200BC - 400ADNaNclayNaNAm,S.817north_america
3https://media.britishmuseum.org/media/Reposito...amuletChalchihuitl, amulet, pendant made of amazonst...Classic Maya400 - 800NaNamazoniteNaNAm.9685north_america
4https://media.britishmuseum.org/media/Reposito...arrowThree expanding stem arrow or spear points, ma...Early Woodland Period1000BC - 400ADNaNchertNaNAm,S.758.a-cnorth_america
.................................
719https://media.britishmuseum.org/media/Reposito...whistleAnthropomorphic whistle / whistle in the shape...Nasca100BC-600NaNpotterysociety/human lifeAm1954,05.196south_america
720https://media.britishmuseum.org/media/Reposito...whistleWhistle made of pottery, possibly modelled and...Nasca100BC-600NaNpotteryanimalAm1954,05.669south_america
721https://media.britishmuseum.org/media/Reposito...whistleAnthropomorphic whistle in the shape of the An...Nasca100BC-650NaNpotterysociety/human life; anthropomorphism; amphibia...Am1954,05.194south_america
722https://media.britishmuseum.org/media/Reposito...whistleOvoid shaped whistle made of tumbaga by lost-w...Zenu150BC-1600 (?)NaNtumbagaNaNAm.6877south_america
723https://media.britishmuseum.org/media/Reposito...whistling vesselRectangular spouted jar with bridge and (broke...Nasca100BC-600NaNpotterybirdAm1982,Q.944south_america
\n", "

201119 rows × 10 columns

\n", "
" ], "text/plain": [ " Image Object type \\\n", "0 https://media.britishmuseum.org/media/Reposito... adze \n", "1 https://media.britishmuseum.org/media/Reposito... altar \n", "2 https://media.britishmuseum.org/media/Reposito... altar \n", "3 https://media.britishmuseum.org/media/Reposito... amulet \n", "4 https://media.britishmuseum.org/media/Reposito... arrow \n", ".. ... ... \n", "719 https://media.britishmuseum.org/media/Reposito... whistle \n", "720 https://media.britishmuseum.org/media/Reposito... whistle \n", "721 https://media.britishmuseum.org/media/Reposito... whistle \n", "722 https://media.britishmuseum.org/media/Reposito... whistle \n", "723 https://media.britishmuseum.org/media/Reposito... whistling vessel \n", "\n", " Description \\\n", "0 Adze? of pecked and ground stone, grooved for ... \n", "1 Three fragments of burnt clay that formed part... \n", "2 Fragments of an altar or crematory basin made ... \n", "3 Chalchihuitl, amulet, pendant made of amazonst... \n", "4 Three expanding stem arrow or spear points, ma... \n", ".. ... \n", "719 Anthropomorphic whistle / whistle in the shape... \n", "720 Whistle made of pottery, possibly modelled and... \n", "721 Anthropomorphic whistle in the shape of the An... \n", "722 Ovoid shaped whistle made of tumbaga by lost-w... \n", "723 Rectangular spouted jar with bridge and (broke... \n", "\n", " Culture Production date Production place Materials \\\n", "0 Anasazi 1-1600 (?) NaN stone \n", "1 Middle Woodland Period 200BC - 400AD NaN clay \n", "2 Middle Woodland Period 200BC - 400AD NaN clay \n", "3 Classic Maya 400 - 800 NaN amazonite \n", "4 Early Woodland Period 1000BC - 400AD NaN chert \n", ".. ... ... ... ... \n", "719 Nasca 100BC-600 NaN pottery \n", "720 Nasca 100BC-600 NaN pottery \n", "721 Nasca 100BC-650 NaN pottery \n", "722 Zenu 150BC-1600 (?) NaN tumbaga \n", "723 Nasca 100BC-600 NaN pottery \n", "\n", " Subjects Reg number \\\n", "0 NaN Am1994,09.1 \n", "1 NaN Am,S.818 \n", "2 NaN Am,S.817 \n", "3 NaN Am.9685 \n", "4 NaN Am,S.758.a-c \n", ".. ... ... \n", "719 society/human life Am1954,05.196 \n", "720 animal Am1954,05.669 \n", "721 society/human life; anthropomorphism; amphibia... Am1954,05.194 \n", "722 NaN Am.6877 \n", "723 bird Am1982,Q.944 \n", "\n", " region \n", "0 north_america \n", "1 north_america \n", "2 north_america \n", "3 north_america \n", "4 north_america \n", ".. ... \n", "719 south_america \n", "720 south_america \n", "721 south_america \n", "722 south_america \n", "723 south_america \n", "\n", "[201119 rows x 10 columns]" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "world_df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "ArtifactClassification", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 2 }