« ArtBot » : différence entre les versions
Ligne 54 : | Ligne 54 : | ||
<pre> | <pre> | ||
# Création de la bases de données des Sales Catalogs | # Création de la bases de données des Sales Catalogs | ||
SC_wanted_columns = ["title", | SC_wanted_columns = ["title", | ||
Ligne 91 : | Ligne 90 : | ||
"buy_name_1" : "buyer_name", | "buy_name_1" : "buyer_name", | ||
"sell_name_1" : "seller_name"}) | "sell_name_1" : "seller_name"}) | ||
</pre> | </pre> | ||
Ligne 97 : | Ligne 95 : | ||
<pre> | <pre> | ||
# Création de la bases de données de Knoedler | # Création de la bases de données de Knoedler | ||
K_wanted_columns = ["title", | K_wanted_columns = ["title", | ||
Ligne 128 : | Ligne 125 : | ||
columns_list = df_SC_all.columns | columns_list = df_SC_all.columns | ||
df_K = df_K.reindex(columns = columns_list) | df_K = df_K.reindex(columns = columns_list) | ||
</pre> | </pre> | ||
Ligne 134 : | Ligne 130 : | ||
<pre> | <pre> | ||
# Combinaison des dataframes | # Combinaison des dataframes | ||
df_tot = pd.concat([df_SC_all, df_K]) | df_tot = pd.concat([df_SC_all, df_K]) | ||
Ligne 142 : | Ligne 137 : | ||
df_tot.sale_month = df_tot.sale_month.convert_dtypes(convert_integer = True) | df_tot.sale_month = df_tot.sale_month.convert_dtypes(convert_integer = True) | ||
df_tot.sale_day = df_tot.sale_day.convert_dtypes(convert_integer = True) | df_tot.sale_day = df_tot.sale_day.convert_dtypes(convert_integer = True) | ||
</pre> | </pre> | ||
Version du 22 mai 2021 à 15:54
Langue | Français |
Description
Le but de l'ArtBot est de créer des pages pour des œuvres qui regroupent l'historique de leurs ventes. Il utilise comme base de données les registres de ventes du Getty Provenance Index fourni par le Getty Research Institute [1].
Il a été créé par Vincent Philippoz, Michael Richter et Agatha Duranceau.
Gestion des bases de données
L'ArtBot utilise la bibliothèque pandas pour les fonctions de gestion de bases de données.
import pandas as pd
Récupération des données
Les fichiers .csv ont directement été récupérés sur GitHub [2], mais ne contiennent pas tous les mêmes catégories, ou les mêmes noms pour les mêmes catégories. Les entrées pertinentes ont été sélectionnées et renommées, puis les fichiers concaténés afin de travailler sur une nouvelle base plus facile à lire par l'ArtBot.
Code pour l'importation des registres de vente :
df_SC1 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_1.csv', low_memory=False) df_SC2 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_2.csv', low_memory=False) df_SC3 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_3.csv', low_memory=False) df_SC4 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_4.csv', low_memory=False) df_SC5 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_5.csv', low_memory=False) df_SC6 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_6.csv', low_memory=False) df_SC7 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_7.csv', low_memory=False) df_SC8 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_8.csv', low_memory=False) df_SC9 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_9.csv', low_memory=False) df_SC10 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_10.csv', low_memory=False) df_SC11 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_11.csv', low_memory=False) df_SC12 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_12.csv', low_memory=False) df_SC13 = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/sales_catalogs/sales_contents_13.csv', low_memory=False) df_knoedler = pd.read_csv('https://raw.githubusercontent.com/thegetty/provenance-index-csv/master/knoedler/knoedler.csv', low_memory=False)
Pour chaque base de donnée, les informations pertinentes sont récupérées : Titre de l'œuvre, artiste, nationalité de l'artiste, date de vente, maison de ventes, prix de vente, vendeur, acheteur, et éventuellement type d'œuvre et genre. Les dataframes SC1 à SC13 ont les mêmes colonnes et peuvent donc être traitées ensemble. On extrait d'abord les colonnes importantes de SC1 puis on fait de même avec les autres dataframes qu'on concatène les unes à la suite des autres. Ensuite, on renomme les colonnes avec des noms plus simples.
# Création de la bases de données des Sales Catalogs SC_wanted_columns = ["title", "artist_name_1", "lot_sale_year", "lot_sale_month", "lot_sale_day", "auction_house_1", "nationality_1", "price_amount_1", "price_currency_1", "buy_name_1", "sell_name_1", "object_type", "genre"] df_SC_all = df_SC1.loc[:, SC_wanted_columns] SALES_CATALOGUE = [df_SC2, df_SC3, df_SC4, df_SC5, df_SC6, df_SC7, df_SC8, df_SC9, df_SC10, df_SC11, df_SC12, df_SC13] for dataframe in SALES_CATALOGUE : df_temp = dataframe.loc[:, SC_wanted_columns] df_SC_all = pd.concat([df_SC_all, df_temp]) # Mettre la même convention de noms df_SC_all = df_SC_all.rename(columns = {"artist_name_1" : "artist_name", "lot_sale_year" : "sale_year" , "lot_sale_month" : "sale_month" , "lot_sale_day": "sale_day", "buyer_name_1" : "buyer_name", "seller_name_1" : "seller_name", "auction_house_1" : "auction_house", "nationality_1" : "artist_nationality", "price_amount_1" : "purch_amount", "price_currency_1" : "purch_currency", "buy_name_1" : "buyer_name", "sell_name_1" : "seller_name"})
Ensuite, on fait de même avec la dernière base de donnée qui n'a pas la même structure que les autres :
# Création de la bases de données de Knoedler K_wanted_columns = ["title", "artist_name_1", "nationality_1", "genre", "object_type", "sale_date_year", "sale_date_month", "sale_date_day", "purch_amount", "purch_currency", "seller_name_1", "buyer_name_1"] df_K = df_knoedler.loc[:, K_wanted_columns] df_K = df_K.reindex(columns=list(df_K.columns) + ["auction_house"]) df_K.auction_house = df_K.auction_house.fillna(value='Knoedler') # Mettre la même convention de noms et le même ordre df_K = df_K.rename(columns = {"artist_name_1" : "artist_name", "sale_date_year" : "sale_year" , "sale_date_month" : "sale_month" , "sale_date_day": "sale_day", "nationality_1" : "artist_nationality", "buyer_name_1" : "buyer_name", "seller_name_1" : "seller_name"}) columns_list = df_SC_all.columns df_K = df_K.reindex(columns = columns_list)
Enfin, on concatène la dernière base de données aux autres, et on force les dates à s'écrire comme des nombres entiers pour que l'affichage soit le même que sur Wikipast
# Combinaison des dataframes df_tot = pd.concat([df_SC_all, df_K]) # Mettre les nombre de la date comme des entiers df_tot.sale_year = df_tot.sale_year.convert_dtypes(convert_integer = True) df_tot.sale_month = df_tot.sale_month.convert_dtypes(convert_integer = True) df_tot.sale_day = df_tot.sale_day.convert_dtypes(convert_integer = True)
Il est possible d'afficher les données de la manière suivante :
Le jeu de données complet contient 1288210 entrées, dont 77.83956032013414 % de titres uniques et 15.926673446099626 % d'artistes uniques.
Identifiants Wikidata
Pour le type d'œuvre et le genre, des identifiants wikidata sont utilisés :
Type d'œuvre :
- peinture : Q3305213
- sculpture : Q860861
- photographie : Q125191
- émail : Q79496108
- dessin : Q93184
- tapisserie : Q184296
- broderie : Q28966302
- meuble : Q14745
- fresque : Q134194
- objet d'arts décoratifs : Q631931
- gravure sur pierres précieuses : Q1501187
- médaille : Q131647
- mosaïque : Q133067
- miniature
- dentelle : Q231250
- marqueterie : Q1049923
- aquarelle : Q18761202
- estampe ou lithographie : Q11060274
- pastel : Q12043905
- livre : Q571
- horloge ou montre: Q376
- cartes à jouer : Q47883
- assiette de cuivre
- vêtement : Q11460
- carte : Q4006
- minéraux : Q7946
Genre :
- paysage : Q191163
- portrait : Q134307
- œuvre abstraite : Q128115
- nature morte : Q170571
- représentations d'animaux : Q16875712
- scènes historiques : Q742333
Fonctionnement
L'ArtBot utilise la bibliothèque pywikiapi pour lire et écrire dans les pages de wikipast.
Création/modification d'une page
L'ArtBot vérifie pour chaque œuvre si une page de type Titre de l'œuvre (Auteur) existe déjà. Si non, il crée la page en question et ajoute la description de l'œuvre et une entrée pour l'évènement de vente dans les sections correspondantes. Si oui, il copie le texte de la page, insère la nouvelle entrée au bon endroit et écrase l'ancienne version de la page.
Structure des pages
Titre de la page : Titre de l'œuvre (Artiste)
Description : [[type oeuvre]], [[genre]]
Syntaxe pour un évènement de vente :
- [[Année.Mois.Jour]] / [[lieu]]. [[Vente]] de [[titre œuvre]] de [[artiste]] (de nationalité [[nationalité]]) par [[vendeur]] à [[acheteur]] au prix de [[prix]] [[monnaie]] par la maison [[maison de ventes]]. [Source]
Lorsque certaines données sont absentes, elles sont ignorées et la proposition correspondante n'est pas écrite.
Insertion d'une entrée à une page déjà éxistante
Création de liens entre les pages
Afin de mieux référencer les pages crées par l'ArtBot, elles sont toutes liées entre-elles. Pour cela, une page regroupant l'intégralité des années de ventes est créée, et pour chaque année, une page pour chaque date regroupe l'ensemble des ventes effectuées ce jour-là.
Discussion des performances de l'ArtBot
nombre de page créées, problèmes rencontrés etc.