added merlin additional data, paper description of data sources

pull/1/head
Roman Schöne 2026-04-25 12:34:01 +02:00
parent 16a3c3e480
commit ca8f1f55a6
7 changed files with 9364 additions and 85 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,119 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "ad994162",
"metadata": {},
"outputs": [],
"source": [
"import csv\n",
"import json\n",
"import requests as rq\n",
"import bs4\n",
"import pandas as pd\n",
"import time\n",
"import random"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b5536e8c",
"metadata": {},
"outputs": [],
"source": [
"producers = [\"bluebrixx\", \"cada\", \"cobi\", \"mouldking\", \"pantasy\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a5daea73",
"metadata": {},
"outputs": [],
"source": [
"with open(\"./data/merlin/others.csv\", mode=\"w+\", encoding=\"utf8\", newline=\"\") as producerfile:\n",
" writer = csv.writer(producerfile)\n",
" writer.writerow([\"id\", \"producer\", \"name\", \"size\", \"parts\", \"year\"])\n",
" for producer in producers:\n",
" with open(f\"data/merlin/{producer}.json\", mode=\"r\", encoding=\"utf8\") as sourcefile:\n",
" data = json.loads(sourcefile.read())\n",
" for row in data[\"data\"]:\n",
" _, id, _, name, rating, _, _, size, parts, year, _ = row\n",
"\n",
" writer.writerow([id, producer, name, size, parts, year])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "ab997198",
"metadata": {},
"outputs": [],
"source": [
"# uvp preise bestimmen :(\n",
"def get_all_ids() -> list[str]:\n",
" df = pd.read_csv(\"./data/merlin/others.csv\")\n",
" return df[\"id\"].to_list()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "32b1fa46",
"metadata": {},
"outputs": [],
"source": [
"with open(\"./data/merlin/prices.csv\", mode=\"a+\", encoding=\"utf8\", newline=\"\") as pricefile:\n",
" for idx, id in enumerate(get_all_ids()[3663:]):\n",
" try:\n",
" small_id = id.lower()\n",
"\n",
" response = rq.get(f\"https://www.merlinssteine.de/sets/{small_id}\")\n",
" soup = bs4.BeautifulSoup(response.text)\n",
"\n",
" # Prices\n",
" price_eur = soup.find(id=\"listprice_eur\")\n",
" price_usd = soup.find(id=\"listprice_usd\")\n",
" price_cn = soup.find(id=\"listprice_cn\")\n",
" bestprice_eur = soup.find(id=\"bestprice_eur\")\n",
" bestprice_usd = soup.find(id=\"bestprice_usd\")\n",
" bestprice_cn = soup.find(id=\"bestprice_cn\")\n",
"\n",
" all_prices = [price_eur, price_cn, price_usd, bestprice_eur, bestprice_cn, bestprice_usd]\n",
" \n",
" #categories\n",
" other_dump = [description.text.replace(\"\\n\", \"\") for description in soup.find_all(class_=\"setpage_ct\")]\n",
" writer = csv.writer(pricefile)\n",
" \n",
" all_prices = [p.text if p != None else \"_\" for p in all_prices]\n",
" writer.writerow([id, *all_prices, *other_dump])\n",
" time.sleep(random.randint(2, 3))\n",
" except Exception as e:\n",
" print(e)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "venv (3.14.4)",
"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.14.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -1,85 +0,0 @@
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{helvet}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{multicol}[]
\usepackage{blindtext}
\usepackage{float}
\usepackage{booktabs}
\usepackage{makecell}
\usepackage{fancyhdr}
\usepackage{geometry}
\usepackage{abstract}
\usepackage{graphicx}
\usepackage{acronym}
\usepackage{hyperref}
\usepackage{amsmath}
\usepackage{biblatex}
\graphicspath{ {./bilder/} }
\geometry{
a4paper,margin=25mm
}
\title{\huge{Knowledgegraphen - Lego}}
\date{\today}
\author{
\begin{tabular}{ccc}
\textbf{Roman Schöne} & \textbf{Falko Piwinger}\\
2211275 & 2112107\\
roman.schoene@stud.th-mannheim.de & falko.piwinger@stud.th-mannheim.de
\end{tabular}\\\\
Technische Hochschule Mannheim
}
\addbibresource{literatur/dms.bib}
\renewcommand\familydefault{\sfdefault} % Helvetica
\begin{document}
\pagestyle{fancy}
%... then configure it.
\fancyhead{} % clear all header fields
\fancyhead[L]{Leog}
\fancyhead[R]{KGR - Knowledgegraphen}
\fancyfoot{} % clear all footer fields
\fancyfoot[LE,RO]{\thepage}
\maketitle
\begin{abstract}
\blindtext
\end{abstract}
\section{Motivation}
\subsection{Datenquellen}
\subsection{Auswahlprozess}
\subsection{Integrationsprozess}
\subsection{Beschreibung}
\section{Implementierung}
\section{Evaluation}
\section{Ausblick}
\begin{multicols}{2}
\tableofcontents
\section*{Abkürzungsverzeichnis}
\begin{acronym}[Abkürzungsverzeichnis]
\end{acronym}
\printbibliography
\end{multicols}
\end{document}

View File

@ -0,0 +1,188 @@
\documentclass{article}
\usepackage{helvet}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{multicol}[]
\usepackage{blindtext}
\usepackage{tabularx}
\usepackage{float}
\usepackage{booktabs}
\usepackage{makecell}
\usepackage{enumitem}
\usepackage{fancyhdr}
\usepackage{geometry}
\usepackage{abstract}
\usepackage{graphicx}
\usepackage{acronym}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{amsmath}
\usepackage[utf8]{inputenc}
\usepackage{biblatex}
\graphicspath{ {./bilder/} }
\geometry{
a4paper,margin=25mm
}
\title{\huge{Knowledgegraphen - Lego}}
\date{\today}
\author{
\begin{tabular}{ccc}
\textbf{Roman Schöne} & \textbf{Falko Piwinger}\\
2211275 & 2112107\\
roman.schoene@stud.th-mannheim.de & falko.piwinger@stud.th-mannheim.de
\end{tabular}\\\\
Technische Hochschule Mannheim
}
\addbibresource{literatur/lego.bib}
\renewcommand\familydefault{\sfdefault} % Helvetica
\begin{document}
\pagestyle{fancy}
%... then configure it.
\fancyhead{} % clear all header fields
\fancyhead[L]{Lego}
\fancyhead[R]{KGR - Knowledgegraphen}
\fancyfoot{} % clear all footer fields
\fancyfoot[LE,RO]{\thepage}
\maketitle
\begin{abstract}
\end{abstract}
\begin{multicols}{2}
\tableofcontents
\section{Motivation}
\subsection{Einleitung}
Der bekannteste Hersteller von Klemmbausteinen ist Lego. Mittlerweile hat sich der Name des Klemmbausteins als Gattungsbegriff etabliert. Seit seiner Gründung brachte der Spielwarenhersteller mehr als 20000 Sets auf den Markt. Neben Lego werden in dieser Arbeit die weiteren Marken: Bluebrixx, Pantasy, Cada, Mouldking und Cobi behandelt.
\subsection{Fragestellungen}
\begin{enumerate}
\item \label{item:min_set_count} Was ist die minimale Anzahl an Sets, die benötigt wird um ein anderes Set zusammenzubauen?
\item \label{item:min_set_price} Was ist der geringste Preis einer Auswahl an Sets um ein anderes Set zusammenzubauen?
\item Sind Sets von anderen Herstellern im Vergleich zu Lego Sets, auf den durchschnittlichen Teilepreis betrachtet billiger?
\item Haben neuere Sets im Vergleich zu älteren Sets eine geringere Teileanzahl, da auf eine grössere Anzahl an speziell angefertigten Teilen zugegriffen werden kann?
\item Haben Sets mit höherer Teileanzahl eine höhere Anzahl an Minifiguren?
\item \label{item:set_span} Welche anderen Sets, können mit Sets, die sich schon im eigenen Besitz befinden zusammengebaut werden?
\item \label{item:equivalent_part} Welche Lego-Teile besitzen äquivalente Teile von anderen Marken?
\end{enumerate}
\subsection{Nutzen}
Wird ein Set an Klemmbausteinen nicht mehr vertrieben und man möchte das Set dennoch haben, so ergeben sich mehrere Möglichkeiten:
\begin{itemize}
\item Man kauft das Set von einem Zweitanbieter
\item Man stellt sich die benötigten Teile des Sets selbst zusammen. Dies geschieht entweder indem die Teile einzeln von Zweitanbietern gekauft werden oder durch den Erwerb von anderen Sets, welche die benötigten Teile enthalten. Siehe Fragen: \ref{item:min_set_count} und \ref{item:min_set_price}.
\end{itemize}
Falls eine Teil eines Sets verloren geht, stellt sich die Frage von welcher Marke ein äquivalentes, billigstes Ersatzteil erworben werden kann \ref{item:equivalent_part}.
\section{Datenquellen}
\subsection{Rebrickable}
\textit{Rebrickable} ist eine Website, die es ermöglicht seine eigenen Sets zu registrieren, um herauszufinden welche \ac{MOC}, bzw. von Fans entworfenen Sets, mit der eigenen Auswahl an Teilen erstellt werden kann \ref{item:set_span} \cite{FreeLEGOCatalog}.\\
\textit{Rebrickable} wurde als Datenquelle ausgewählt aufgrund der einfachen Bereitstellung, guter Dokumentation des Datenmodells und der freien Verfügung über die Daten.\\
Der Datensatz von \textit{Rebrickable} gibt primär Auskunft über Sets, Themen und Inventaren von Sets, bestehend aus Minifiguren, Einzelteilen und Ersatzteilen.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Rebrickable \\ \midrule
URL & \url{https://rebrickable.com}\\
Beschaffung & Datenbankdownload als .csv \\
Lizenz & Freie Verfügung \\
Erhalt & 23.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
\subsection{Brickset}
\textit{Brickset} ist primär eine Datenbank von Lego-Sets. Dazu dient die Seite als News-Portal, Tracking-Möglichkeit und Review-Seite über Lego-Sets. \textit{Brickset} finanziert sich über Affiliate Marketing \cite{BricksetHomePage2026}. Die Seite wurde ausgewählt, um den von \textit{Rebrickable} erhaltenen Datensatz über Sets anzureichern, um bspw. Verpackungsdimensionen, Modelldimensionen, \ac{UVP} und die \ac{EAN}.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Brickset \\ \midrule
URL & \url{https://brickset.com/}\\
Beschaffung & Webscraping/CSV-Download \\
Lizenz & nicht spezifiziert \\
Erhalt & 23.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
\subsection{Bricklink}
\textit{Bricklink} ist eine Website, die als Marktplatz zum Kauf und Verkauf von einzelnen Lego-Teilen fungiert. \textit{Bricklink} ist ebenso Anbieter der Software \textit{Bricklink Studio}, einer Anwendung zum Entwurf, Rendern und Erstellen von Anleitungen für Lego-Sets. Die Teileliste, eines in \textit{Bricklink Studio} kann zu \textit{Bricklink} übertragen werden, um Lego Sets in die Realität zu bringen \cite{BrickLinkBuySell}.\\ Der Datensatz enthält grundlegende Daten über Minifiguren, Einzelteile und Sets von Lego.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Bricklink \\ \midrule
URL & \url{https://www.bricklink.com/}\\
Beschaffung & Webscraping \\
Lizenz & nicht spezifiziert \\
Erhalt & 24.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
\subsection{Merlins Steine}
\textit{Merlins Steine} ist eine Website, die sich auf die Berichterstattung von Reviews zu Klemmbausteinen spezifiziert. Um auf entsprechende Sets zu referenzieren beinhaltet \textit{Merlins Steine} eine Datenbank an Klemmbausteinen, die über 30000 Sets unterschiedlicher Marken enthält. Merlins Steine finanziert sich über Affiliate Marketing. \cite{SetDatenbankSetDB}.\\
\textit{Merlins Steine} wurde ausgewählt, da Sets von anderen Marken im Vergleich zu vorherig genannten Quellen aufgelistet werden.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Merlins Steine \\ \midrule
URL & \url{https://www.merlinssteine.de/}\\
Beschaffung & Webscraping/JSON-Download \\
Lizenz & nicht spezifiziert \\
Erhalt & 24.04.2026-26.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
\section{Implementierung}
\subsection{Integrationsprozess}
\subsection{Pipeline}
\section{Evaluation}
\subsection{Ergebnis}
\subsection{Beispiel-Queries}
\subsection{Abdeckung}
\subsection{Konsistenz}
\subsection{Qualität}
\section{Ausblick}
\section*{Abkürzungsverzeichnis}
\begin{acronym}[Abkürzungsverzeichnis]
\acro{MOC}{My Own Creation}
\acro{UVP}{Unverbindliche Preisempfehlung}
\acro{EAN}{European Article Number}
\end{acronym}
\printbibliography
\end{multicols}
\end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

View File

@ -0,0 +1,38 @@
@misc{BrickLinkBuySell,
title = {{{BrickLink}} - {{Buy}} and Sell {{LEGO Parts}}, {{Sets}} and {{Minifigures}}},
urldate = {2026-04-24},
howpublished = {https://www.bricklink.com/v2/main.page},
file = {C:\Users\Roman\Zotero\storage\AIARFPYW\main.html}
}
@misc{BricksetHomePage2026,
title = {Brickset Home Page: {{LEGO}} Database, News and Reviews},
shorttitle = {Brickset Home Page},
year = 2026,
month = apr,
journal = {Brickset.com},
urldate = {2026-04-24},
abstract = {Brickset is a database of LEGO sets and an online community of LEGO fans.},
howpublished = {https://brickset.com/Default.aspx},
langid = {english},
file = {C:\Users\Roman\Zotero\storage\AL4NJN3X\Default.html}
}
@misc{FreeLEGOCatalog,
title = {Free {{LEGO Catalog Database Downloads}} \textbar{} {{Rebrickable}} - {{Build}} with {{LEGO}}},
urldate = {2026-04-24},
abstract = {Rebrickable - Build with LEGO},
howpublished = {https://rebrickable.com/downloads/},
langid = {english},
file = {C:\Users\Roman\Zotero\storage\WBUKXYH3\downloads.html}
}
@misc{SetDatenbankSetDB,
title = {{Set Datenbank SetDB {$\bullet$} Merlins Steine}},
journal = {Merlins Steine},
urldate = {2026-04-24},
abstract = {Die Set Datenbank (SetDB) bietet eine allgemeine \"Ubersicht mit Informationen zu mehr als 36000 Sets von 88 verschiedenen Herstellern in 93 Kategorien. Reviews, Preise, Bilder und mehr.},
howpublished = {https://www.merlinssteine.de/setdb/},
langid = {ngerman},
file = {C:\Users\Roman\Zotero\storage\ZTU6JUZ3\setdb.html}
}