{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"**Project** **topic**\n",
"\n",
"AI pricing and demand assistant for an online bookstore\n",
"\n",
"**Business** **question**\n",
"\n",
"How can an online bookstore improve pricing decisions using real-world product data plus synthetic sales, reviews, and demand data?\n",
"\n"
],
"metadata": {
"id": "hAhhPQG2ZAdu"
}
},
{
"cell_type": "markdown",
"source": [
"**Real**-**world** **data** **processing** + **synthetic** **dataset** **generation**"
],
"metadata": {
"id": "yve1xjjEZjM0"
}
},
{
"cell_type": "code",
"source": [
"print(\"RUNNING CLEAN datacreation.ipynb\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "gVTst9W7LD0g",
"outputId": "70805438-9245-4cc3-9e1a-d9e8f0a8e6bc"
},
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"RUNNING CLEAN datacreation.ipynb\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# Run this only once if needed\n",
"!pip install pandas numpy matplotlib requests beautifulsoup4 vaderSentiment statsmodels scikit-learn"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "WX-EjZRJX6r_",
"outputId": "88db5746-a058-434b-c71c-a814e857b097"
},
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (2.2.2)\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (2.0.2)\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.12/dist-packages (3.10.0)\n",
"Requirement already satisfied: requests in /usr/local/lib/python3.12/dist-packages (2.32.4)\n",
"Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.12/dist-packages (4.13.5)\n",
"Collecting vaderSentiment\n",
" Downloading vaderSentiment-3.3.2-py2.py3-none-any.whl.metadata (572 bytes)\n",
"Requirement already satisfied: statsmodels in /usr/local/lib/python3.12/dist-packages (0.14.6)\n",
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.12/dist-packages (1.6.1)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas) (2.9.0.post0)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas) (2025.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas) (2026.1)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.3.3)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (4.62.1)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (1.5.0)\n",
"Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (26.1)\n",
"Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (11.3.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib) (3.3.2)\n",
"Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests) (3.4.7)\n",
"Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests) (3.13)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests) (2.5.0)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests) (2026.4.22)\n",
"Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.12/dist-packages (from beautifulsoup4) (2.8.3)\n",
"Requirement already satisfied: typing-extensions>=4.0.0 in /usr/local/lib/python3.12/dist-packages (from beautifulsoup4) (4.15.0)\n",
"Requirement already satisfied: scipy!=1.9.2,>=1.8 in /usr/local/lib/python3.12/dist-packages (from statsmodels) (1.16.3)\n",
"Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.12/dist-packages (from statsmodels) (1.0.2)\n",
"Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (1.5.3)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn) (3.6.0)\n",
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n",
"Downloading vaderSentiment-3.3.2-py2.py3-none-any.whl (125 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m126.0/126.0 kB\u001b[0m \u001b[31m3.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hInstalling collected packages: vaderSentiment\n",
"Successfully installed vaderSentiment-3.3.2\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import random\n",
"import requests\n",
"from bs4 import BeautifulSoup\n",
"from pathlib import Path\n",
"import matplotlib.pyplot as plt\n",
"\n",
"random.seed(42)\n",
"np.random.seed(42)\n",
"\n",
"DATA_DIR = Path(\"data\")\n",
"DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
"\n",
"print(\"Setup complete.\")\n",
"print(\"Data folder:\", DATA_DIR.resolve())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bOeumxOTX9zn",
"outputId": "8eb496d7-5691-4021-f4e9-46cab76e490e"
},
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Setup complete.\n",
"Data folder: /content/data\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"project_name = \"AI Pricing and Demand Assistant for an Online Bookstore\"\n",
"\n",
"business_question = \"\"\"\n",
"How can an online bookstore improve pricing decisions using real-world product data\n",
"plus synthetic sales and review data to better understand demand, customer sentiment,\n",
"and future revenue opportunities?\n",
"\"\"\"\n",
"\n",
"print(project_name)\n",
"print(business_question)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "0UuAlapCYCgv",
"outputId": "f2cecaf6-b01a-46c7-c6ea-d0c9fb2fb209"
},
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"AI Pricing and Demand Assistant for an Online Bookstore\n",
"\n",
"How can an online bookstore improve pricing decisions using real-world product data\n",
"plus synthetic sales and review data to better understand demand, customer sentiment,\n",
"and future revenue opportunities?\n",
"\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"base_url = \"https://books.toscrape.com/catalogue/page-{}.html\"\n",
"\n",
"books = []\n",
"\n",
"for page in range(1, 6): # scrape first 5 pages\n",
" url = base_url.format(page)\n",
" response = requests.get(url, timeout=20)\n",
" soup = BeautifulSoup(response.text, \"html.parser\")\n",
"\n",
" articles = soup.find_all(\"article\", class_=\"product_pod\")\n",
"\n",
" for article in articles:\n",
" title = article.h3.a[\"title\"]\n",
" price_text = article.find(\"p\", class_=\"price_color\").text.strip()\n",
" price = float(price_text.replace(\"£\", \"\").replace(\"Â\", \"\"))\n",
" availability = article.find(\"p\", class_=\"instock availability\").text.strip()\n",
" rating_class = article.find(\"p\")[\"class\"]\n",
" rating = rating_class[1] if len(rating_class) > 1 else \"Unknown\"\n",
"\n",
" books.append({\n",
" \"title\": title,\n",
" \"price_gbp\": price,\n",
" \"availability\": availability,\n",
" \"rating_text\": rating\n",
" })\n",
"\n",
"books_df = pd.DataFrame(books)\n",
"print(\"Books scraped:\", books_df.shape)\n",
"books_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 224
},
"id": "ZbBM86UtYFQX",
"outputId": "38e3e8f0-02bb-432a-ad3d-59e1fb523b4b"
},
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Books scraped: (100, 4)\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
" title price_gbp availability rating_text\n",
"0 A Light in the Attic 51.77 In stock Three\n",
"1 Tipping the Velvet 53.74 In stock One\n",
"2 Soumission 50.10 In stock One\n",
"3 Sharp Objects 47.82 In stock Four\n",
"4 Sapiens: A Brief History of Humankind 54.23 In stock Five"
],
"text/html": [
"\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" title | \n",
" price_gbp | \n",
" availability | \n",
" rating_text | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" A Light in the Attic | \n",
" 51.77 | \n",
" In stock | \n",
" Three | \n",
"
\n",
" \n",
" | 1 | \n",
" Tipping the Velvet | \n",
" 53.74 | \n",
" In stock | \n",
" One | \n",
"
\n",
" \n",
" | 2 | \n",
" Soumission | \n",
" 50.10 | \n",
" In stock | \n",
" One | \n",
"
\n",
" \n",
" | 3 | \n",
" Sharp Objects | \n",
" 47.82 | \n",
" In stock | \n",
" Four | \n",
"
\n",
" \n",
" | 4 | \n",
" Sapiens: A Brief History of Humankind | \n",
" 54.23 | \n",
" In stock | \n",
" Five | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "books_df",
"summary": "{\n \"name\": \"books_df\",\n \"rows\": 100,\n \"fields\": [\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics\",\n \"This One Summer\",\n \"The Art Forger\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_gbp\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 14.638531019680265,\n \"min\": 10.16,\n \"max\": 58.11,\n \"num_unique_values\": 99,\n \"samples\": [\n 23.89,\n 57.31,\n 40.11\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"availability\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"In stock\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rating_text\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"One\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 7
}
]
},
{
"cell_type": "code",
"source": [
"books_df.columns = [c.strip().lower() for c in books_df.columns]\n",
"books_df = books_df.drop_duplicates(subset=[\"title\"]).reset_index(drop=True)\n",
"\n",
"rating_map = {\n",
" \"One\": 1,\n",
" \"Two\": 2,\n",
" \"Three\": 3,\n",
" \"Four\": 4,\n",
" \"Five\": 5\n",
"}\n",
"\n",
"books_df[\"rating\"] = books_df[\"rating_text\"].map(rating_map)\n",
"books_df[\"in_stock\"] = books_df[\"availability\"].str.contains(\"In stock\", case=False, na=False).astype(int)\n",
"\n",
"books_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "1AJLAObcYIg_",
"outputId": "5c1f0b8b-ee13-4e7f-c669-7cb20bf35356"
},
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" title price_gbp availability rating_text \\\n",
"0 A Light in the Attic 51.77 In stock Three \n",
"1 Tipping the Velvet 53.74 In stock One \n",
"2 Soumission 50.10 In stock One \n",
"3 Sharp Objects 47.82 In stock Four \n",
"4 Sapiens: A Brief History of Humankind 54.23 In stock Five \n",
"\n",
" rating in_stock \n",
"0 3 1 \n",
"1 1 1 \n",
"2 1 1 \n",
"3 4 1 \n",
"4 5 1 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" title | \n",
" price_gbp | \n",
" availability | \n",
" rating_text | \n",
" rating | \n",
" in_stock | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" A Light in the Attic | \n",
" 51.77 | \n",
" In stock | \n",
" Three | \n",
" 3 | \n",
" 1 | \n",
"
\n",
" \n",
" | 1 | \n",
" Tipping the Velvet | \n",
" 53.74 | \n",
" In stock | \n",
" One | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" | 2 | \n",
" Soumission | \n",
" 50.10 | \n",
" In stock | \n",
" One | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" | 3 | \n",
" Sharp Objects | \n",
" 47.82 | \n",
" In stock | \n",
" Four | \n",
" 4 | \n",
" 1 | \n",
"
\n",
" \n",
" | 4 | \n",
" Sapiens: A Brief History of Humankind | \n",
" 54.23 | \n",
" In stock | \n",
" Five | \n",
" 5 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "books_df",
"summary": "{\n \"name\": \"books_df\",\n \"rows\": 100,\n \"fields\": [\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics\",\n \"This One Summer\",\n \"The Art Forger\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_gbp\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 14.638531019680265,\n \"min\": 10.16,\n \"max\": 58.11,\n \"num_unique_values\": 99,\n \"samples\": [\n 23.89,\n 57.31,\n 40.11\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"availability\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"In stock\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rating_text\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"One\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rating\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 5,\n \"num_unique_values\": 5,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"in_stock\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 8
}
]
},
{
"cell_type": "code",
"source": [
"print(\"Shape:\", books_df.shape)\n",
"print(\"\\nMissing values:\")\n",
"print(books_df.isnull().sum())\n",
"print(\"\\nDuplicates:\", books_df.duplicated().sum())\n",
"print(\"\\nColumns:\", books_df.columns.tolist())"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4TYidWjrYLGf",
"outputId": "9cb7d180-cb19-41d8-e1c5-523a97b9353f"
},
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Shape: (100, 6)\n",
"\n",
"Missing values:\n",
"title 0\n",
"price_gbp 0\n",
"availability 0\n",
"rating_text 0\n",
"rating 0\n",
"in_stock 0\n",
"dtype: int64\n",
"\n",
"Duplicates: 0\n",
"\n",
"Columns: ['title', 'price_gbp', 'availability', 'rating_text', 'rating', 'in_stock']\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"books_df[\"book_id\"] = [\"BOOK_\" + str(i).zfill(4) for i in range(1, len(books_df) + 1)]\n",
"books_df = books_df[[\"book_id\", \"title\", \"price_gbp\", \"rating\", \"in_stock\"]]\n",
"\n",
"books_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "A-eZUzTzYONG",
"outputId": "395db5e6-a5a9-430e-c1c3-ab353c51d407"
},
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" book_id title price_gbp rating \\\n",
"0 BOOK_0001 A Light in the Attic 51.77 3 \n",
"1 BOOK_0002 Tipping the Velvet 53.74 1 \n",
"2 BOOK_0003 Soumission 50.10 1 \n",
"3 BOOK_0004 Sharp Objects 47.82 4 \n",
"4 BOOK_0005 Sapiens: A Brief History of Humankind 54.23 5 \n",
"\n",
" in_stock \n",
"0 1 \n",
"1 1 \n",
"2 1 \n",
"3 1 \n",
"4 1 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" book_id | \n",
" title | \n",
" price_gbp | \n",
" rating | \n",
" in_stock | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" BOOK_0001 | \n",
" A Light in the Attic | \n",
" 51.77 | \n",
" 3 | \n",
" 1 | \n",
"
\n",
" \n",
" | 1 | \n",
" BOOK_0002 | \n",
" Tipping the Velvet | \n",
" 53.74 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" | 2 | \n",
" BOOK_0003 | \n",
" Soumission | \n",
" 50.10 | \n",
" 1 | \n",
" 1 | \n",
"
\n",
" \n",
" | 3 | \n",
" BOOK_0004 | \n",
" Sharp Objects | \n",
" 47.82 | \n",
" 4 | \n",
" 1 | \n",
"
\n",
" \n",
" | 4 | \n",
" BOOK_0005 | \n",
" Sapiens: A Brief History of Humankind | \n",
" 54.23 | \n",
" 5 | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "books_df",
"summary": "{\n \"name\": \"books_df\",\n \"rows\": 100,\n \"fields\": [\n {\n \"column\": \"book_id\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"BOOK_0084\",\n \"BOOK_0054\",\n \"BOOK_0071\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics\",\n \"This One Summer\",\n \"The Art Forger\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_gbp\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 14.638531019680265,\n \"min\": 10.16,\n \"max\": 58.11,\n \"num_unique_values\": 99,\n \"samples\": [\n 23.89,\n 57.31,\n 40.11\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rating\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 5,\n \"num_unique_values\": 5,\n \"samples\": [\n 1,\n 2,\n 4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"in_stock\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 10
}
]
},
{
"cell_type": "code",
"source": [
"months = pd.date_range(start=\"2024-01-01\", end=\"2024-12-01\", freq=\"MS\")\n",
"\n",
"sales_rows = []\n",
"\n",
"for _, row in books_df.iterrows():\n",
" base_demand = max(5, int(120 - row[\"price_gbp\"] * 2 + row[\"rating\"] * 8))\n",
"\n",
" for month in months:\n",
" seasonality = random.uniform(0.85, 1.20)\n",
" noise = np.random.normal(0, 8)\n",
" units_sold = max(0, int(base_demand * seasonality + noise))\n",
"\n",
" revenue = round(units_sold * row[\"price_gbp\"], 2)\n",
"\n",
" sales_rows.append({\n",
" \"book_id\": row[\"book_id\"],\n",
" \"date\": month,\n",
" \"units_sold\": units_sold,\n",
" \"revenue\": revenue\n",
" })\n",
"\n",
"sales_df = pd.DataFrame(sales_rows)\n",
"sales_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "5zx4VnuhYQJ4",
"outputId": "bb4132ac-97a0-49a8-a092-2faa61861a4b"
},
"execution_count": 11,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" book_id date units_sold revenue\n",
"0 BOOK_0001 2024-01-01 46 2381.42\n",
"1 BOOK_0001 2024-02-01 33 1708.41\n",
"2 BOOK_0001 2024-03-01 43 2226.11\n",
"3 BOOK_0001 2024-04-01 49 2536.73\n",
"4 BOOK_0001 2024-05-01 42 2174.34"
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" book_id | \n",
" date | \n",
" units_sold | \n",
" revenue | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" BOOK_0001 | \n",
" 2024-01-01 | \n",
" 46 | \n",
" 2381.42 | \n",
"
\n",
" \n",
" | 1 | \n",
" BOOK_0001 | \n",
" 2024-02-01 | \n",
" 33 | \n",
" 1708.41 | \n",
"
\n",
" \n",
" | 2 | \n",
" BOOK_0001 | \n",
" 2024-03-01 | \n",
" 43 | \n",
" 2226.11 | \n",
"
\n",
" \n",
" | 3 | \n",
" BOOK_0001 | \n",
" 2024-04-01 | \n",
" 49 | \n",
" 2536.73 | \n",
"
\n",
" \n",
" | 4 | \n",
" BOOK_0001 | \n",
" 2024-05-01 | \n",
" 42 | \n",
" 2174.34 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "sales_df",
"summary": "{\n \"name\": \"sales_df\",\n \"rows\": 1200,\n \"fields\": [\n {\n \"column\": \"book_id\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"BOOK_0084\",\n \"BOOK_0054\",\n \"BOOK_0071\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2024-01-01 00:00:00\",\n \"max\": \"2024-12-01 00:00:00\",\n \"num_unique_values\": 12,\n \"samples\": [\n \"2024-11-01 00:00:00\",\n \"2024-10-01 00:00:00\",\n \"2024-01-01 00:00:00\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"units_sold\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 35,\n \"min\": 0,\n \"max\": 167,\n \"num_unique_values\": 157,\n \"samples\": [\n 141,\n 79,\n 150\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"revenue\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 653.505374680463,\n \"min\": 0.0,\n \"max\": 3952.32,\n \"num_unique_values\": 1044,\n \"samples\": [\n 2157.86,\n 2745.0,\n 1579.16\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 11
}
]
},
{
"cell_type": "code",
"source": [
"positive_reviews = [\n",
" \"Amazing book, very enjoyable and worth the money.\",\n",
" \"Great quality and excellent reading experience.\",\n",
" \"Loved it, would definitely recommend this title.\",\n",
" \"Interesting and engaging from start to finish.\"\n",
"]\n",
"\n",
"neutral_reviews = [\n",
" \"It was okay, average overall experience.\",\n",
" \"Not bad, but not especially memorable.\",\n",
" \"Decent book for the price.\",\n",
" \"Reasonably good, but could be better.\"\n",
"]\n",
"\n",
"negative_reviews = [\n",
" \"Disappointing and not worth the price.\",\n",
" \"I did not enjoy this book very much.\",\n",
" \"Poor experience, would not recommend.\",\n",
" \"The content felt weak and uninteresting.\"\n",
"]\n",
"\n",
"review_rows = []\n",
"\n",
"for _, row in books_df.iterrows():\n",
" n_reviews = random.randint(8, 20)\n",
"\n",
" for _ in range(n_reviews):\n",
" score = max(1, min(5, int(np.random.normal(row[\"rating\"], 1))))\n",
"\n",
" if score >= 4:\n",
" text = random.choice(positive_reviews)\n",
" elif score == 3:\n",
" text = random.choice(neutral_reviews)\n",
" else:\n",
" text = random.choice(negative_reviews)\n",
"\n",
" review_rows.append({\n",
" \"book_id\": row[\"book_id\"],\n",
" \"review_date\": pd.Timestamp(\"2024-01-01\") + pd.Timedelta(days=random.randint(0, 364)),\n",
" \"review_score\": score,\n",
" \"review_text\": text\n",
" })\n",
"\n",
"reviews_df = pd.DataFrame(review_rows)\n",
"reviews_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "N3i6Rd79YVV2",
"outputId": "f7710a2b-24c8-4edc-c273-bd35634429eb"
},
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" book_id review_date review_score \\\n",
"0 BOOK_0001 2024-08-11 3 \n",
"1 BOOK_0001 2024-09-25 2 \n",
"2 BOOK_0001 2024-07-21 3 \n",
"3 BOOK_0001 2024-06-22 3 \n",
"4 BOOK_0001 2024-06-19 3 \n",
"\n",
" review_text \n",
"0 Not bad, but not especially memorable. \n",
"1 The content felt weak and uninteresting. \n",
"2 It was okay, average overall experience. \n",
"3 Decent book for the price. \n",
"4 Not bad, but not especially memorable. "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" book_id | \n",
" review_date | \n",
" review_score | \n",
" review_text | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" BOOK_0001 | \n",
" 2024-08-11 | \n",
" 3 | \n",
" Not bad, but not especially memorable. | \n",
"
\n",
" \n",
" | 1 | \n",
" BOOK_0001 | \n",
" 2024-09-25 | \n",
" 2 | \n",
" The content felt weak and uninteresting. | \n",
"
\n",
" \n",
" | 2 | \n",
" BOOK_0001 | \n",
" 2024-07-21 | \n",
" 3 | \n",
" It was okay, average overall experience. | \n",
"
\n",
" \n",
" | 3 | \n",
" BOOK_0001 | \n",
" 2024-06-22 | \n",
" 3 | \n",
" Decent book for the price. | \n",
"
\n",
" \n",
" | 4 | \n",
" BOOK_0001 | \n",
" 2024-06-19 | \n",
" 3 | \n",
" Not bad, but not especially memorable. | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "reviews_df",
"summary": "{\n \"name\": \"reviews_df\",\n \"rows\": 1355,\n \"fields\": [\n {\n \"column\": \"book_id\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"BOOK_0084\",\n \"BOOK_0054\",\n \"BOOK_0071\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"review_date\",\n \"properties\": {\n \"dtype\": \"date\",\n \"min\": \"2024-01-01 00:00:00\",\n \"max\": \"2024-12-30 00:00:00\",\n \"num_unique_values\": 352,\n \"samples\": [\n \"2024-05-06 00:00:00\",\n \"2024-12-20 00:00:00\",\n \"2024-05-31 00:00:00\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"review_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 5,\n \"num_unique_values\": 5,\n \"samples\": [\n 2,\n 4,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"review_text\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 12,\n \"samples\": [\n \"Amazing book, very enjoyable and worth the money.\",\n \"Loved it, would definitely recommend this title.\",\n \"Not bad, but not especially memorable.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 12
}
]
},
{
"cell_type": "code",
"source": [
"book_features = []\n",
"\n",
"for _, row in books_df.iterrows():\n",
" category = random.choice([\"Fiction\", \"Business\", \"Science\", \"Self-Help\", \"History\"])\n",
" supplier_cost = round(row[\"price_gbp\"] * random.uniform(0.35, 0.65), 2)\n",
" marketing_score = random.randint(20, 100)\n",
"\n",
" book_features.append({\n",
" \"book_id\": row[\"book_id\"],\n",
" \"category\": category,\n",
" \"supplier_cost\": supplier_cost,\n",
" \"marketing_score\": marketing_score\n",
" })\n",
"\n",
"features_df = pd.DataFrame(book_features)\n",
"features_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "NjdHff__YY0m",
"outputId": "240e4b67-7e7b-43ae-a9c6-1a7d85985756"
},
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" book_id category supplier_cost marketing_score\n",
"0 BOOK_0001 History 27.94 45\n",
"1 BOOK_0002 Business 28.87 57\n",
"2 BOOK_0003 Science 31.38 36\n",
"3 BOOK_0004 Business 23.97 61\n",
"4 BOOK_0005 Fiction 31.36 91"
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" book_id | \n",
" category | \n",
" supplier_cost | \n",
" marketing_score | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" BOOK_0001 | \n",
" History | \n",
" 27.94 | \n",
" 45 | \n",
"
\n",
" \n",
" | 1 | \n",
" BOOK_0002 | \n",
" Business | \n",
" 28.87 | \n",
" 57 | \n",
"
\n",
" \n",
" | 2 | \n",
" BOOK_0003 | \n",
" Science | \n",
" 31.38 | \n",
" 36 | \n",
"
\n",
" \n",
" | 3 | \n",
" BOOK_0004 | \n",
" Business | \n",
" 23.97 | \n",
" 61 | \n",
"
\n",
" \n",
" | 4 | \n",
" BOOK_0005 | \n",
" Fiction | \n",
" 31.36 | \n",
" 91 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "features_df",
"summary": "{\n \"name\": \"features_df\",\n \"rows\": 100,\n \"fields\": [\n {\n \"column\": \"book_id\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"BOOK_0084\",\n \"BOOK_0054\",\n \"BOOK_0071\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"category\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Business\",\n \"Self-Help\",\n \"Science\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"supplier_cost\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 8.304760260832277,\n \"min\": 5.31,\n \"max\": 35.23,\n \"num_unique_values\": 96,\n \"samples\": [\n 11.39,\n 28.95,\n 20.26\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"marketing_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 23,\n \"min\": 20,\n \"max\": 100,\n \"num_unique_values\": 56,\n \"samples\": [\n 45,\n 73,\n 64\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 13
}
]
},
{
"cell_type": "code",
"source": [
"monthly_summary = sales_df.groupby(\"book_id\", as_index=False).agg(\n",
" total_units_sold=(\"units_sold\", \"sum\"),\n",
" total_revenue=(\"revenue\", \"sum\"),\n",
" avg_monthly_units=(\"units_sold\", \"mean\")\n",
")\n",
"\n",
"review_summary = reviews_df.groupby(\"book_id\", as_index=False).agg(\n",
" avg_review_score=(\"review_score\", \"mean\"),\n",
" review_count=(\"review_score\", \"count\")\n",
")\n",
"\n",
"master_df = (\n",
" books_df\n",
" .merge(features_df, on=\"book_id\", how=\"left\")\n",
" .merge(monthly_summary, on=\"book_id\", how=\"left\")\n",
" .merge(review_summary, on=\"book_id\", how=\"left\")\n",
")\n",
"\n",
"master_df[\"profit_per_unit\"] = master_df[\"price_gbp\"] - master_df[\"supplier_cost\"]\n",
"master_df[\"estimated_total_profit\"] = master_df[\"profit_per_unit\"] * master_df[\"total_units_sold\"]\n",
"\n",
"master_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 330
},
"id": "AxBdtQEpYbVO",
"outputId": "4abaf6a6-e6db-4dcf-9236-a329f874f118"
},
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" book_id title price_gbp rating \\\n",
"0 BOOK_0001 A Light in the Attic 51.77 3 \n",
"1 BOOK_0002 Tipping the Velvet 53.74 1 \n",
"2 BOOK_0003 Soumission 50.10 1 \n",
"3 BOOK_0004 Sharp Objects 47.82 4 \n",
"4 BOOK_0005 Sapiens: A Brief History of Humankind 54.23 5 \n",
"\n",
" in_stock category supplier_cost marketing_score total_units_sold \\\n",
"0 1 History 27.94 45 498 \n",
"1 1 Business 28.87 57 177 \n",
"2 1 Science 31.38 36 316 \n",
"3 1 Business 23.97 61 628 \n",
"4 1 Fiction 31.36 91 615 \n",
"\n",
" total_revenue avg_monthly_units avg_review_score review_count \\\n",
"0 25781.46 41.500000 2.444444 9 \n",
"1 9511.98 14.750000 1.200000 10 \n",
"2 15831.60 26.333333 1.400000 15 \n",
"3 30030.96 52.333333 3.400000 20 \n",
"4 33351.45 51.250000 4.350000 20 \n",
"\n",
" profit_per_unit estimated_total_profit \n",
"0 23.83 11867.34 \n",
"1 24.87 4401.99 \n",
"2 18.72 5915.52 \n",
"3 23.85 14977.80 \n",
"4 22.87 14065.05 "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" book_id | \n",
" title | \n",
" price_gbp | \n",
" rating | \n",
" in_stock | \n",
" category | \n",
" supplier_cost | \n",
" marketing_score | \n",
" total_units_sold | \n",
" total_revenue | \n",
" avg_monthly_units | \n",
" avg_review_score | \n",
" review_count | \n",
" profit_per_unit | \n",
" estimated_total_profit | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" BOOK_0001 | \n",
" A Light in the Attic | \n",
" 51.77 | \n",
" 3 | \n",
" 1 | \n",
" History | \n",
" 27.94 | \n",
" 45 | \n",
" 498 | \n",
" 25781.46 | \n",
" 41.500000 | \n",
" 2.444444 | \n",
" 9 | \n",
" 23.83 | \n",
" 11867.34 | \n",
"
\n",
" \n",
" | 1 | \n",
" BOOK_0002 | \n",
" Tipping the Velvet | \n",
" 53.74 | \n",
" 1 | \n",
" 1 | \n",
" Business | \n",
" 28.87 | \n",
" 57 | \n",
" 177 | \n",
" 9511.98 | \n",
" 14.750000 | \n",
" 1.200000 | \n",
" 10 | \n",
" 24.87 | \n",
" 4401.99 | \n",
"
\n",
" \n",
" | 2 | \n",
" BOOK_0003 | \n",
" Soumission | \n",
" 50.10 | \n",
" 1 | \n",
" 1 | \n",
" Science | \n",
" 31.38 | \n",
" 36 | \n",
" 316 | \n",
" 15831.60 | \n",
" 26.333333 | \n",
" 1.400000 | \n",
" 15 | \n",
" 18.72 | \n",
" 5915.52 | \n",
"
\n",
" \n",
" | 3 | \n",
" BOOK_0004 | \n",
" Sharp Objects | \n",
" 47.82 | \n",
" 4 | \n",
" 1 | \n",
" Business | \n",
" 23.97 | \n",
" 61 | \n",
" 628 | \n",
" 30030.96 | \n",
" 52.333333 | \n",
" 3.400000 | \n",
" 20 | \n",
" 23.85 | \n",
" 14977.80 | \n",
"
\n",
" \n",
" | 4 | \n",
" BOOK_0005 | \n",
" Sapiens: A Brief History of Humankind | \n",
" 54.23 | \n",
" 5 | \n",
" 1 | \n",
" Fiction | \n",
" 31.36 | \n",
" 91 | \n",
" 615 | \n",
" 33351.45 | \n",
" 51.250000 | \n",
" 4.350000 | \n",
" 20 | \n",
" 22.87 | \n",
" 14065.05 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "master_df",
"summary": "{\n \"name\": \"master_df\",\n \"rows\": 100,\n \"fields\": [\n {\n \"column\": \"book_id\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"BOOK_0084\",\n \"BOOK_0054\",\n \"BOOK_0071\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics\",\n \"This One Summer\",\n \"The Art Forger\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_gbp\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 14.638531019680265,\n \"min\": 10.16,\n \"max\": 58.11,\n \"num_unique_values\": 99,\n \"samples\": [\n 23.89,\n 57.31,\n 40.11\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rating\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 5,\n \"num_unique_values\": 5,\n \"samples\": [\n 1,\n 2,\n 4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"in_stock\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"category\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Business\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"supplier_cost\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 8.304760260832277,\n \"min\": 5.31,\n \"max\": 35.23,\n \"num_unique_values\": 96,\n \"samples\": [\n 11.39\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"marketing_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 23,\n \"min\": 20,\n \"max\": 100,\n \"num_unique_values\": 56,\n \"samples\": [\n 45\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_units_sold\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 402,\n \"min\": 173,\n \"max\": 1645,\n \"num_unique_values\": 94,\n \"samples\": [\n 331\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_revenue\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6640.578142228006,\n \"min\": 9511.98,\n \"max\": 38276.86,\n \"num_unique_values\": 100,\n \"samples\": [\n 29858.440000000002\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_monthly_units\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 33.52650470832519,\n \"min\": 14.416666666666666,\n \"max\": 137.08333333333334,\n \"num_unique_values\": 94,\n \"samples\": [\n 27.583333333333332\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_review_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.1513202357560601,\n \"min\": 1.0,\n \"max\": 4.777777777777778,\n \"num_unique_values\": 79,\n \"samples\": [\n 4.363636363636363\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"review_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3,\n \"min\": 8,\n \"max\": 20,\n \"num_unique_values\": 13,\n \"samples\": [\n 12\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"profit_per_unit\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 7.67557721647438,\n \"min\": 4.01,\n \"max\": 35.239999999999995,\n \"num_unique_values\": 100,\n \"samples\": [\n 21.61\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_total_profit\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4020.371995153114,\n \"min\": 3603.590000000001,\n \"max\": 21636.31,\n \"num_unique_values\": 100,\n \"samples\": [\n 17785.03\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 14
}
]
},
{
"cell_type": "code",
"source": [
"conditions = []\n",
"\n",
"for _, row in master_df.iterrows():\n",
" if row[\"avg_review_score\"] >= 4 and row[\"avg_monthly_units\"] >= 60:\n",
" conditions.append(\"Increase Price Slightly\")\n",
" elif row[\"avg_review_score\"] < 3 and row[\"avg_monthly_units\"] < 40:\n",
" conditions.append(\"Discount / Improve Product\")\n",
" else:\n",
" conditions.append(\"Keep Price Stable\")\n",
"\n",
"master_df[\"pricing_action\"] = conditions\n",
"master_df.head()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 348
},
"id": "qNcYH0hcYfh2",
"outputId": "a2a5531b-a35a-45c0-e116-76db023951fb"
},
"execution_count": 15,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" book_id title price_gbp rating \\\n",
"0 BOOK_0001 A Light in the Attic 51.77 3 \n",
"1 BOOK_0002 Tipping the Velvet 53.74 1 \n",
"2 BOOK_0003 Soumission 50.10 1 \n",
"3 BOOK_0004 Sharp Objects 47.82 4 \n",
"4 BOOK_0005 Sapiens: A Brief History of Humankind 54.23 5 \n",
"\n",
" in_stock category supplier_cost marketing_score total_units_sold \\\n",
"0 1 History 27.94 45 498 \n",
"1 1 Business 28.87 57 177 \n",
"2 1 Science 31.38 36 316 \n",
"3 1 Business 23.97 61 628 \n",
"4 1 Fiction 31.36 91 615 \n",
"\n",
" total_revenue avg_monthly_units avg_review_score review_count \\\n",
"0 25781.46 41.500000 2.444444 9 \n",
"1 9511.98 14.750000 1.200000 10 \n",
"2 15831.60 26.333333 1.400000 15 \n",
"3 30030.96 52.333333 3.400000 20 \n",
"4 33351.45 51.250000 4.350000 20 \n",
"\n",
" profit_per_unit estimated_total_profit pricing_action \n",
"0 23.83 11867.34 Keep Price Stable \n",
"1 24.87 4401.99 Discount / Improve Product \n",
"2 18.72 5915.52 Discount / Improve Product \n",
"3 23.85 14977.80 Keep Price Stable \n",
"4 22.87 14065.05 Keep Price Stable "
],
"text/html": [
"\n",
" \n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" book_id | \n",
" title | \n",
" price_gbp | \n",
" rating | \n",
" in_stock | \n",
" category | \n",
" supplier_cost | \n",
" marketing_score | \n",
" total_units_sold | \n",
" total_revenue | \n",
" avg_monthly_units | \n",
" avg_review_score | \n",
" review_count | \n",
" profit_per_unit | \n",
" estimated_total_profit | \n",
" pricing_action | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" BOOK_0001 | \n",
" A Light in the Attic | \n",
" 51.77 | \n",
" 3 | \n",
" 1 | \n",
" History | \n",
" 27.94 | \n",
" 45 | \n",
" 498 | \n",
" 25781.46 | \n",
" 41.500000 | \n",
" 2.444444 | \n",
" 9 | \n",
" 23.83 | \n",
" 11867.34 | \n",
" Keep Price Stable | \n",
"
\n",
" \n",
" | 1 | \n",
" BOOK_0002 | \n",
" Tipping the Velvet | \n",
" 53.74 | \n",
" 1 | \n",
" 1 | \n",
" Business | \n",
" 28.87 | \n",
" 57 | \n",
" 177 | \n",
" 9511.98 | \n",
" 14.750000 | \n",
" 1.200000 | \n",
" 10 | \n",
" 24.87 | \n",
" 4401.99 | \n",
" Discount / Improve Product | \n",
"
\n",
" \n",
" | 2 | \n",
" BOOK_0003 | \n",
" Soumission | \n",
" 50.10 | \n",
" 1 | \n",
" 1 | \n",
" Science | \n",
" 31.38 | \n",
" 36 | \n",
" 316 | \n",
" 15831.60 | \n",
" 26.333333 | \n",
" 1.400000 | \n",
" 15 | \n",
" 18.72 | \n",
" 5915.52 | \n",
" Discount / Improve Product | \n",
"
\n",
" \n",
" | 3 | \n",
" BOOK_0004 | \n",
" Sharp Objects | \n",
" 47.82 | \n",
" 4 | \n",
" 1 | \n",
" Business | \n",
" 23.97 | \n",
" 61 | \n",
" 628 | \n",
" 30030.96 | \n",
" 52.333333 | \n",
" 3.400000 | \n",
" 20 | \n",
" 23.85 | \n",
" 14977.80 | \n",
" Keep Price Stable | \n",
"
\n",
" \n",
" | 4 | \n",
" BOOK_0005 | \n",
" Sapiens: A Brief History of Humankind | \n",
" 54.23 | \n",
" 5 | \n",
" 1 | \n",
" Fiction | \n",
" 31.36 | \n",
" 91 | \n",
" 615 | \n",
" 33351.45 | \n",
" 51.250000 | \n",
" 4.350000 | \n",
" 20 | \n",
" 22.87 | \n",
" 14065.05 | \n",
" Keep Price Stable | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "master_df",
"summary": "{\n \"name\": \"master_df\",\n \"rows\": 100,\n \"fields\": [\n {\n \"column\": \"book_id\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"BOOK_0084\",\n \"BOOK_0054\",\n \"BOOK_0071\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"title\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 100,\n \"samples\": [\n \"Political Suicide: Missteps, Peccadilloes, Bad Calls, Backroom Hijinx, Sordid Pasts, Rotten Breaks, and Just Plain Dumb Mistakes in the Annals of American Politics\",\n \"This One Summer\",\n \"The Art Forger\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"price_gbp\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 14.638531019680265,\n \"min\": 10.16,\n \"max\": 58.11,\n \"num_unique_values\": 99,\n \"samples\": [\n 23.89,\n 57.31,\n 40.11\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"rating\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 5,\n \"num_unique_values\": 5,\n \"samples\": [\n 1,\n 2,\n 4\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"in_stock\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 1,\n \"max\": 1,\n \"num_unique_values\": 1,\n \"samples\": [\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"category\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 5,\n \"samples\": [\n \"Business\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"supplier_cost\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 8.304760260832277,\n \"min\": 5.31,\n \"max\": 35.23,\n \"num_unique_values\": 96,\n \"samples\": [\n 11.39\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"marketing_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 23,\n \"min\": 20,\n \"max\": 100,\n \"num_unique_values\": 56,\n \"samples\": [\n 45\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_units_sold\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 402,\n \"min\": 173,\n \"max\": 1645,\n \"num_unique_values\": 94,\n \"samples\": [\n 331\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"total_revenue\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6640.578142228006,\n \"min\": 9511.98,\n \"max\": 38276.86,\n \"num_unique_values\": 100,\n \"samples\": [\n 29858.440000000002\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_monthly_units\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 33.52650470832519,\n \"min\": 14.416666666666666,\n \"max\": 137.08333333333334,\n \"num_unique_values\": 94,\n \"samples\": [\n 27.583333333333332\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"avg_review_score\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1.1513202357560601,\n \"min\": 1.0,\n \"max\": 4.777777777777778,\n \"num_unique_values\": 79,\n \"samples\": [\n 4.363636363636363\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"review_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 3,\n \"min\": 8,\n \"max\": 20,\n \"num_unique_values\": 13,\n \"samples\": [\n 12\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"profit_per_unit\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 7.67557721647438,\n \"min\": 4.01,\n \"max\": 35.239999999999995,\n \"num_unique_values\": 100,\n \"samples\": [\n 21.61\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"estimated_total_profit\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 4020.371995153114,\n \"min\": 3603.590000000001,\n \"max\": 21636.31,\n \"num_unique_values\": 100,\n \"samples\": [\n 17785.03\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"pricing_action\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"Keep Price Stable\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 15
}
]
},
{
"cell_type": "code",
"source": [
"plt.figure(figsize=(8, 5))\n",
"plt.hist(master_df[\"price_gbp\"], bins=15)\n",
"plt.title(\"Distribution of Book Prices\")\n",
"plt.xlabel(\"Price (GBP)\")\n",
"plt.ylabel(\"Count\")\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 487
},
"id": "P6-NHeG0Yg7-",
"outputId": "934e00ec-7676-470e-a402-d90d74fdbcc8"
},
"execution_count": 16,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArEAAAHWCAYAAABgw9FSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAANYRJREFUeJzt3XlcVdX+//H3UeSICIgTQyrgkDlrVzPDMUmvoWnlveq1HG5ltxyy/N2SbppahjaYWV5s+JbezMbvdUjTRFG8NqpoppZTDqQilQqKigTr94cPztcTg0BHDsv7ej4e+/Fwr7323p/DAn27WGcfhzHGCAAAALBIJW8XAAAAAJQWIRYAAADWIcQCAADAOoRYAAAAWIcQCwAAAOsQYgEAAGAdQiwAAACsQ4gFAACAdQixAAAAsA4hFkCZTJkyRQ6Ho1zu1b17d3Xv3t21v379ejkcDn300Uflcv8RI0YoMjKyXO5VVmfOnNG9996r0NBQORwOjR8/3tslFWr+/PlyOBzavHmzV+5fnt+3AK4sQiwAV7DI36pWrarw8HD17t1bc+bM0enTpz1yn6NHj2rKlCnatm2bR67nSRW5tpJ45plnNH/+fD3wwAN6++23dffddxfZNzIyssB4N2nSRH//+9914sSJcqy6dPL/85K/ValSRQ0bNtSwYcP0ww8/eLs8AOXMx9sFAKg4pk2bpqioKOXk5CgtLU3r16/X+PHjNWvWLC1btkytW7d29X3iiSc0ceLEUl3/6NGjmjp1qiIjI9W2bdsSn7d69epS3acsiqvt9ddfV15e3hWv4fdISkrSjTfeqCeffLJE/du2basJEyZIks6fP68tW7Zo9uzZSk5O1tdff30lS/3dxo0bpw4dOignJ0cpKSl67bXXtGLFCn377bcKDw8v9tyyfN8CqJgIsQBc+vTpo/bt27v24+LilJSUpL59++q2227Td999Jz8/P0mSj4+PfHyu7F8hZ8+eVbVq1eTr63tF73M5VapU8er9SyI9PV3Nmzcvcf9rrrlGd911l2v/3nvvVfXq1fX8889r7969atKkyZUo0yO6dOmigQMHSpJGjhypa6+9VuPGjdOCBQsUFxdX6DlZWVny9/cvl+9bAOWD5QQAinXzzTdr0qRJOnTokBYuXOhqL2xtYWJiojp37qwaNWqoevXqatq0qR5//HFJF38V3KFDB0kXg0f+r4Tnz58v6eK615YtW2rLli3q2rWrqlWr5jr3t2ti8+Xm5urxxx9XaGio/P39ddtttyk1NdWtT2RkpEaMGFHg3EuvebnaClsTm5WVpQkTJqh+/fpyOp1q2rSpnn/+eRlj3Po5HA6NGTNGS5YsUcuWLeV0OtWiRQutWrWq8C/4b6Snp+uee+5RSEiIqlatqjZt2mjBggWu4/m/Yj9w4IBWrFjhqv3gwYMluv6lQkNDJalAyEtKSlKXLl3k7++vGjVqqH///vruu+8KnL9161b16dNHgYGBql69unr27Kkvv/zysvc9efKkbrjhBtWrV0+7d+8udd0333yzJOnAgQOS/u97c9euXfrLX/6i4OBgde7c2e3Yby1cuFA33HCDqlWrpuDgYHXt2rXAbwBWrlzp+joEBAQoNjZWO3fudOuTlpamkSNHql69enI6nQoLC1P//v3LNB4Aisd/RwFc1t13363HH39cq1ev1n333Vdon507d6pv375q3bq1pk2bJqfTqX379umzzz6TJDVr1kzTpk3T5MmTNWrUKHXp0kWSdNNNN7mu8csvv6hPnz4aPHiw7rrrLoWEhBRb1/Tp0+VwOPTYY48pPT1ds2fPVkxMjLZt2+aaMS6JktR2KWOMbrvtNq1bt0733HOP2rZtq08//VR///vfdeTIEb344otu/Tdu3Kh///vfevDBBxUQEKA5c+bozjvv1OHDh1WrVq0i6zp37py6d++uffv2acyYMYqKitKHH36oESNG6NSpU3rooYfUrFkzvf3223r44YdVr1491xKBOnXqFPuac3Jy9PPPP0u6uJxg69atmjVrlrp27aqoqChXvzVr1qhPnz5q2LChpkyZonPnzunll19WdHS0UlJSXOF+586d6tKliwIDA/Xoo4+qSpUqevXVV9W9e3clJyerY8eOhdbx888/65ZbbtGJEyeUnJysRo0aFVt3Yfbv3y9JBb6Wf/rTn9SkSRM988wzBf5zcampU6dqypQpuummmzRt2jT5+vrqq6++UlJSknr16iVJevvttzV8+HD17t1bM2fO1NmzZ5WQkKDOnTtr69atrq/DnXfeqZ07d2rs2LGKjIxUenq6EhMTdfjw4Qr/5kDAOgbAf7233nrLSDKbNm0qsk9QUJBp166da//JJ580l/4V8uKLLxpJ5qeffiryGps2bTKSzFtvvVXgWLdu3YwkM2/evEKPdevWzbW/bt06I8lcc801JjMz09X+wQcfGEnmpZdecrVFRESY4cOHX/aaxdU2fPhwExER4dpfsmSJkWSefvppt34DBw40DofD7Nu3z9Umyfj6+rq1ffPNN0aSefnllwvc61KzZ882kszChQtdbRcuXDCdOnUy1atXd3vtERERJjY2ttjrXdpXUoEtOjra/Pzzz25927Zta+rWrWt++eUXt/orVapkhg0b5mobMGCA8fX1Nfv373e1HT161AQEBJiuXbu62i79Xjt27Jhp0aKFadiwoTl48OBl684f9zfffNP89NNP5ujRo2bFihUmMjLSOBwO1/dv/vfmkCFDClzjt9+3e/fuNZUqVTK33367yc3Ndeubl5dnjDHm9OnTpkaNGua+++5zO56WlmaCgoJc7SdPnjSSzHPPPXfZ1wLg92M5AYASqV69erFPKahRo4YkaenSpWV+E5TT6dTIkSNL3H/YsGEKCAhw7Q8cOFBhYWH65JNPynT/kvrkk09UuXJljRs3zq19woQJMsZo5cqVbu0xMTFuM4ytW7dWYGDgZd9R/8knnyg0NFRDhgxxtVWpUkXjxo3TmTNnlJycXObX0LFjRyUmJioxMVHLly/X9OnTtXPnTt122206d+6cJOnYsWPatm2bRowYoZo1a7rVf8stt7i+zrm5uVq9erUGDBighg0buvqFhYXpL3/5izZu3KjMzEy3+//444/q1q2bcnJytGHDBkVERJS49r/+9a+qU6eOwsPDFRsbq6ysLC1YsMBtPbck/e1vf7vstZYsWaK8vDxNnjxZlSq5/5OYv+wgMTFRp06d0pAhQ/Tzzz+7tsqVK6tjx45at26dJMnPz0++vr5av369Tp48WeLXA6BsWE4AoETOnDmjunXrFnl80KBBeuONN3Tvvfdq4sSJ6tmzp+644w4NHDiwQDgoyjXXXFOqN3H99s1HDodDjRs3vuLrDw8dOqTw8HC3AC1dXJaQf/xSDRo0KHCN4ODgywadQ4cOqUmTJgW+fkXdpzRq166tmJgY135sbKyaNm2qgQMH6o033tDYsWNd12/atGmB85s1a6ZPP/1UWVlZOn36tM6ePVtkv7y8PKWmpqpFixau9rvvvls+Pj767rvvXGtxS2ry5Mnq0qWLKleurNq1a6tZs2aFvlnr0mURRdm/f78qVapU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CgoKcrtOrVq1XK9t6NChio6OVkpKilsfHx8fhYaGql69eho0aJCGDh3qev2SdMstt+jEiRNKTk4u/RcXAMqIEAsApeTn5+eacZWktWvXavfu3UpMTHQLpvny8vLUp08fffbZZ1q4cKF27dqlGTNmqHLlypKk/fv3649//KPuvPNObd++Xe+//742btyoMWPGFFnDxo0bVa1aNTVr1szVtnr1av3yyy969NFHizzP4XAUeWzz5s3asmWLOnbsWKrX7+vrq7Zt2+o///lPsecBgCf5eLsAALCFMUZr167Vp59+qrFjx7ra/f399cYbb8jX17fQ89asWaOvv/5a3333na699lpJUsOGDV3H4+PjNXToUI0fP16S1KRJE82ZM0fdunVTQkKCqlatWuCahw4dUkhIiNtSgj179kiSazZYurg2t0ePHq799957T3379nXt33TTTapUqZIuXLignJwcjRo1SsOGDSvya7BlyxYtWrRIN998s1t7eHi4Dh06VOR5AOBphFgAuIzly5erevXqysnJUV5env7yl79oypQpruOtWrUqMsBK0rZt21SvXj1XgP2tb775Rtu3b9c777zjajPGKC8vTwcOHHCbbc137ty5QsPtb7Vu3Vrbtm2TdDEc/3bd6vvvv69mzZopJydHO3bs0NixYxUcHKwZM2a4+nz77beqXr26cnNzdeHCBcXGxuqVV15xu46fn5/Onj172XoAwFMIsQBwGT169FBCQoJ8fX0VHh4uHx/3vzr9/f2LPd/Pz6/Y42fOnNH999+vcePGFTjWoEGDQs+pXbu2Tp486dbWpEkTSdLu3bt14403Srq4nrdx48ZF3rt+/fqu482aNdP+/fs1adIkTZkyxRWSmzZtqmXLlsnHx0fh4eGFBvYTJ06oUaNGxb5OAPAkQiwAXIa/v3+xQfByWrdurR9//FF79uwpdDb2+uuv165du0p1j3bt2iktLU0nT55UcHCwJKlXr16qWbOmZs6cqcWLF5ep1sqVK+vXX3/VhQsXXCE2//FbxdmxY4cGDhxYpnsCQFnwxi4AuMK6deumrl276s4771RiYqIOHDiglStXatWqVZKkxx57TJ9//rnGjBmjbdu2ae/evVq6dGmxb+xq166dateurc8++8zVVr16db3xxhtasWKFYmNj9emnn+qHH37Q9u3b9eyzz0qS681k+X755RelpaXpxx9/1MqVK/XSSy+pR48eCgwMLPHrO3jwoI4cOaKYmJjSfFkA4HchxAJAOfjf//1fdejQQUOGDFHz5s316KOPKjc3V9LFmdrk5GTt2bNHXbp0Ubt27TR58mSFh4cXeb3KlStr5MiRbutoJen222/X559/rmrVqmnYsGFq2rSpbr75ZiUlJRV4U5ckxcTEKCwsTJGRkRo1apRuvfVWvf/++6V6be+++6569eqliIiIUp0HAL+Hw1z60SwAAGukpaWpRYsWSklJ8VqAvHDhgpo0aaJFixYpOjraKzUA+O/ETCwAWCo0NFT/8z//o8OHD3uthsOHD+vxxx8nwAIod8zEAgAAwDrMxAIAAMA6hFgAAABYhxALAAAA6xBiAQAAYB1CLAAAAKxDiAUAAIB1CLEAAACwDiEWAAAA1iHEAgAAwDr/H0gpVdHdY4GBAAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"plt.figure(figsize=(8, 5))\n",
"plt.scatter(master_df[\"price_gbp\"], master_df[\"total_units_sold\"])\n",
"plt.title(\"Price vs Total Units Sold\")\n",
"plt.xlabel(\"Price (GBP)\")\n",
"plt.ylabel(\"Total Units Sold\")\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 487
},
"id": "8OeND3a9YkI-",
"outputId": "dc9977ad-066a-47b1-f40f-cdd5ea073985"
},
"execution_count": 17,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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arvuBw4cEAAIBw4cUG+r3lpNEARhz549QnBwsODk5KRus3b58mXhpZdeEtq1aye4ubkJ3t7ewpAhQ4RffvmlznFXVFQIn332mTBu3DihdevWgqurq9CoUSOhZ8+ewjvvvCOUlZVpHK/re1/9vRQEQUhNTVVfj7Zt2wqbNm0Sli5dytZqRCIgEQQD71YgIiIiIrJyrBkmIiIiIrvFMExEREREdothmIiIiIjsFsMwEREREdkthmEiIiIislsMw0RERERkt7joho6USiVu3ryJJk2a1LskKBERERGZnyAIuHfvHgIDA+HgoNucL8Owjm7evImWLVtaehhEREREVI9r166hRYsWOh3LMKwj1VKb165dg6enp4VHQ0RERETVlZSUoGXLlnUukV4dw7COVKURnp6eDMNEREREIqZPSStvoCMiIiIiu8UwTERERER2i2GYiIiIiOwWwzARERER2S2GYSIiIiKyWwzDRERERGS3GIaJiIiIyG4xDBMRERGR3WIYJiIiIiK7xRXoSG8KpYDjOYUouFcKvyZueCLIG44Ouq/0QkRERCQWDMOkl6SsPMQnZiOvuFS9LUDqhqVjghEREmDBkRERERHpj2USpLOkrDzEbs3QCMIAIC8uRezWDCRl5VloZERERESGYRgmnSiUAuITsyHUsk+1LT4xGwplbUcQERERiRPDMOnkeE5hjRnhRwkA8opLcTyn0HyDIiIiImoghmHSScE97UHYkOOIiIiIxIBhmHTi18TNqMcRERERiQHDMOnkiSBvBEjdoK2BmgRVXSWeCPI257CIiIiIGoRhmHTi6CDB0jHBAFAjEKt+XzommP2GiYiIyKowDJPOIkICsHFyL8ikmqUQMqkbNk7uxT7DREREZHW46AbpJSIkAMODZVyBjoiIiGwCwzDpzdFBgtB2PpYeBhEREVGDWbRM4tChQxgzZgwCAwMhkUiwe/fuGsecO3cOTz/9NKRSKTw8PPD4448jNzdXvb+0tBQzZsyAj48PGjdujKioKOTn52s8R25uLiIjI9GoUSP4+flh/vz5qKysNPXpEREREZHIWTQMP3jwAN27d8eGDRtq3X/p0iUMGDAAnTp1wsGDB3H69GksXrwYbm5/1azOmTMHiYmJ+Oabb5CamoqbN29iwoQJ6v0KhQKRkZEoLy/Hb7/9hi1btmDz5s1YsmSJyc+PiIiI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OHbsGEJDQy04MqqLIAiIi4vDrl27kJKSgqCgII39vXv3hrOzs8Z1PX/+PHJzc3ldrYhSqURZWRmvp5UaNmwYzpw5g8zMTPVPnz59MGnSJPU/87pav/v37+PSpUsICAjgv6tWrH///jValF64cAGtW7cGYMS81JC7/Mhw9+7dE06dOiWcOnVKACC8//77wqlTp4SrV68KgiAIq1evFry8vIQ9e/YIp0+fFsaOHSsEBQUJf/75p4VHTtrExsYKUqlUOHjwoJCXl6f+efjwofqYf/zjH0KrVq2ElJQU4eTJk0JoaKgQGhpqwVFTXRYuXCikpqYKOTk5wunTp4WFCxcKEolE+PnnnwVB4PW0FY92kxAEXldrNG/ePOHgwYNCTk6OcOTIESEsLExo1qyZUFBQIAgCr6m1On78uODk5CSsXLlSuHjxorBt2zahUaNGwtatW9XHGCMvMQxbyIEDBwQANX5iYmIEQahqF7J48WLB399fcHV1FYYNGyacP3/esoOmOtV2PQEIX375pfqYP//8U3j11VeFpk2bCo0aNRLGjx8v5OXlWW7QVKeXXnpJaN26teDi4iL4+voKw4YNUwdhQeD1tBXVwzCvq/V57rnnhICAAMHFxUVo3ry58Nxzzwl//PGHej+vqfVKTEwUQkJCBFdXV6FTp07Cp59+qrHfGHlJIgiCYPD8NRERERGRFWPNMBERERHZLYZhIiIiIrJbDMNEREREZLcYhomIiIjIbjEMExEREZHdYhgmIiIiIrvFMExEREREdothmIiIiIjsFsMwEZGItWnTBuvWrTP56wwaNAjbt283+etok52djRYtWuDBgwcWGwMR2SeGYSIiM5gyZQokEgkkEglcXFzw2GOPYfny5aisrKzzcSdOnMD06dNNOrbvv/8e+fn5iI6O1th+6tQpPPfccwgICICrqytat26N0aNHIzExEarFS69cuaI+r0fPbcWKFXh0gdNly5apj3FyckKbNm0wZ84c3L9/HwAQHByMfv364f333zfpuRIRVccwTERkJhEREcjLy8PFixcxb948LFu2DO+8806tx5aXlwMAfH190ahRI5OOKyEhAVOnToWDw1//S9izZw/69euH+/fvY8uWLTh37hySkpIwfvx4vPnmmyguLtZ4jl9++UV9bvHx8Vi5ciW++OILjWO6dOmCvLw8XLlyBWvWrMGnn36KefPmqfdPnToVGzdurPcDAhGRMTEMExGZiaurK2QyGVq3bo3Y2FiEhYXh+++/B1A1czxu3DisXLkSgYGB6NixI4CaZRJFRUX4+9//Dn9/f7i5uSEkJAQ//PCDev/hw4cxcOBAuLu7o2XLlpg1a1adpQe3bt1CSkoKxowZo9724MEDTJs2DZGRkfjxxx8xYsQItG3bFp07d8a0adPwv//9D1KpVON5fHx81Oc2adIk9O/fHxkZGRrHODk5QSaToUWLFnjuuecwadIk9fkDwPDhw1FYWIjU1FT931wiIgMxDBMRWYi7u7t6BhgA9u/fj/PnzyM5OVkj4KoolUqMHDkSR44cwdatW5GdnY3Vq1fD0dERAHDp0iVEREQgKioKp0+fxs6dO3H48GHExcVpHcPhw4fRqFEjdO7cWb3t559/xp07d/DPf/5T6+MkEonWfSdPnkR6ejr69u2r1/m7uLigR48e+PXXX+t8HBGRMTlZegBERPZGEATs378f+/btw8yZM9XbPTw88Pnnn8PFxaXWx/3yyy84fvw4zp07hw4dOgAA2rZtq96/atUqTJo0CbNnzwYAtG/fHgkJCRg8eDA2btwINze3Gs959epV+Pv7a5RIXLhwAQDUs9NAVe3ykCFD1L/v2LEDo0ePVv/+5JNPwsHBAeXl5aioqMD06dPx4osvan0P0tPTsX37dgwdOlRje2BgIK5evar1cURExsYwTERkJj/88AMaN26MiooKKJVKPP/881i2bJl6f9euXbUGYQDIzMxEixYt1EG4uv/97384ffo0tm3bpt4mCAKUSiVycnI0Zn9V/vzzz1pDcnXdunVDZmYmgKqQXb2ud+fOnejcuTMqKiqQlZWFmTNnomnTpli9erX6mDNnzqBx48ZQKBQoLy9HZGQkPvroI43ncXd3x8OHD+sdDxGRsTAMExGZyZAhQ7Bx40a4uLggMDAQTk6a/wn28PCo8/Hu7u517r9//z7+/ve/Y9asWTX2tWrVqtbHNGvWDHfv3tXY1r59ewDA+fPn0a9fPwBV9c6PPfaY1tdu2bKlen/nzp1x6dIlLF68GMuWLVOH7Y4dO+L777+Hk5MTAgMDaw3+hYWFaNeuXZ3nSURkTAzDRERm4uHhUWegrE+3bt1w/fp1XLhwodbZ4V69eiE7O1uv1+jZsyfkcjnu3r2Lpk2bAgBGjBgBb29vrFmzBrt27TJorI6OjqisrER5ebk6DKvartUlKysLzzzzjEGvSURkCN5AR0RkJQYPHoxBgwYhKioKycnJyMnJwd69e5GUlAQAWLBgAX777TfExcUhMzMTFy9exJ49e+q8ga5nz55o1qwZjhw5ot7WuHFjfP755/jxxx8RGRmJffv24fLlyzh9+jTWrl0LAOqb9lTu3LkDuVyO69evY+/evVi/fj2GDBkCT09Pnc/vypUruHHjBsLCwvR5W4iIGoRhmIjIivz3v//F448/jokTJyI4OBj//Oc/oVAoAFTNHKempuLChQsYOHAgevbsiSVLliAwMFDr8zk6OmLq1KkadcYAMH78ePz2229o1KgRXnzxRXTs2BFDhw5FSkpKjZvnACAsLAwBAQFo06YNpk+fjlGjRmHnzp16ndtXX32FESNGoHXr1no9joioISTCo0sEERGR3ZHL5ejSpQsyMjIsFkTLy8vRvn17bN++Hf3797fIGIjIPnFmmIjIzslkMvz73/9Gbm6uxcaQm5uLf/3rXwzCRGR2nBkmIiIiIrvFmWEiIiIislsMw0RERERktxiGiYiIiMhuMQwTERERkd1iGCYiIiIiu8UwTERERER2i2GYiIiIiOwWwzARERER2S2GYSIiIiKyW/8fNOZSBxRh89YAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"books_df.to_csv(DATA_DIR / \"books_real_world.csv\", index=False)\n",
"sales_df.to_csv(DATA_DIR / \"books_sales.csv\", index=False)\n",
"reviews_df.to_csv(DATA_DIR / \"books_reviews.csv\", index=False)\n",
"features_df.to_csv(DATA_DIR / \"books_features.csv\", index=False)\n",
"master_df.to_csv(DATA_DIR / \"books_master.csv\", index=False)\n",
"\n",
"print(\"Notebook 1 files saved successfully.\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "spz8vTBnYvQG",
"outputId": "39e219ab-2b25-4545-c1a9-335c6d7f616c"
},
"execution_count": 18,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Notebook 1 files saved successfully.\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"category_revenue = master_df.groupby(\"category\")[\"total_revenue\"].sum().sort_values()\n",
"\n",
"plt.figure(figsize=(8, 5))\n",
"category_revenue.plot(kind=\"barh\")\n",
"plt.title(\"Revenue by Category\")\n",
"plt.xlabel(\"Total Revenue\")\n",
"plt.ylabel(\"Category\")\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 487
},
"id": "RGmMxwzIYrWu",
"outputId": "15f5973a-7991-492d-d4ee-4f3ef3d9263c"
},
"execution_count": 19,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAukAAAHWCAYAAADKABfuAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASgBJREFUeJzt3Xt8z/X///H7e6f3TrY5D82MTSbnYyiH6GNOITmlnBXxkYqiEit9HCpEkihTlGP5SISPEBNFNpSch2rObOYwbM/fH77eP+/mMDO9X7bb9XJ5Xy57P5/P1/P1eL9eLff3a8/3620zxhgBAAAAsAw3VxcAAAAAwBkhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQCQZfXr11e5cuVcXQYA5DiEdACQFBMTI5vN5nh4eHioWLFi6tq1q/78809XlwdJFy5c0Lhx41SzZk0FBgbK29tbpUuXVr9+/bRr167bnm/9+vUaPny4Tp8+nf3FAsAd8nB1AQBgJW+++abCwsJ04cIFbdiwQTExMVq3bp22b98ub29vV5eXax0/flxRUVHavHmzmjdvrieffFL+/v7auXOnZs+erY8//lgXL168rTnXr1+v6Ohode3aVUFBQXencADIIkI6AFyjSZMmqlatmiSpZ8+eKlCggEaPHq1FixapXbt2Lq4u9+ratau2bNmi+fPnq02bNk59b731ll577TUXVXb3Xb58Wenp6fLy8nJ1KQD+QSx3AYCbePjhhyVJe/fudWr//fff9cQTTyhfvnzy9vZWtWrVtGjRIkf/pk2bZLPZNGPGjAxzLlu2TDabTYsXL3a0/fnnn+revbsKFy4su92uBx54QJ9++qnTdqtXr5bNZtPcuXP19ttv67777pO3t7caNmyoPXv2OI0tUaKEunbtmmHf9evXV/369Z3aUlNTNWzYMIWHh8tutyskJEQvv/yyUlNTM3WMJGnz5s2qXbu2fHx8FBYWpo8++sjRl5KSIj8/Pz3//PMZtvvjjz/k7u6ukSNH3nDujRs36ttvv1WPHj0yBHRJstvtevfddx3Pt27dqq5du6pkyZLy9vZWcHCwunfvrhMnTjjGDB8+XIMGDZIkhYWFOZY5JSQkOMbMnDlTVatWlY+Pj/Lly6cOHTro0KFDGfY/adIklSxZUj4+PqpRo4bWrl173eN89OhR9ejRQ4ULF5a3t7cqVqyY4b+PhIQE2Ww2vfvuuxo/frxKlSolu92un3766Y6OIYB7D1fSAeAmroa2vHnzOtp+/fVX1alTR8WKFdPgwYPl5+enuXPnqlWrVlqwYIFat26tatWqqWTJkpo7d666dOniNOecOXOUN29eNW7cWJJ05MgRPfjgg7LZbOrXr58KFiyopUuXqkePHkpOTtaAAQOcth81apTc3Nw0cOBAJSUlacyYMerUqZM2btx4268vPT1djz32mNatW6dnnnlGkZGR2rZtm8aNG6ddu3Zp4cKFt5zj1KlTatq0qdq1a6eOHTtq7ty56tOnj7y8vNS9e3f5+/urdevWmjNnjsaOHSt3d3fHtl9++aWMMerUqdMN57/65ufpp5/O1GtasWKF9u3bp27duik4OFi//vqrPv74Y/3666/asGGDbDabHn/8ce3atUtffvmlxo0bpwIFCkiSChYsKEl6++23NXToULVr1049e/bUsWPHNHHiRNWtW1dbtmxxLI+ZPHmy+vXrp4cfflgvvPCCEhIS1KpVK+XNm1f33Xefo6bz58+rfv362rNnj/r166ewsDDNmzdPXbt21enTpzOE7+nTp+vChQt65plnZLfbVbx48Ts6hgDuQQYAYKZPn24kmf/973/m2LFj5tChQ2b+/PmmYMGCxm63m0OHDjnGNmzY0JQvX95cuHDB0Zaenm5q165tIiIiHG1Dhgwxnp6e5uTJk4621NRUExQUZLp37+5o69GjhylSpIg5fvy4U00dOnQwgYGB5ty5c8YYY1atWmUkmcjISJOamuoY9/777xtJZtu2bY620NBQ06VLlwyvs169eqZevXqO559//rlxc3Mza9eudRr30UcfGUkmNjb2psetXr16RpJ57733nF5jpUqVTKFChczFixeNMcYsW7bMSDJLly512r5ChQpO9VxP69atjSRz6tSpm4676urxutaXX35pJJkffvjB0fbOO+8YSWb//v1OYxMSEoy7u7t5++23ndq3bdtmPDw8HO2pqakmf/78pnr16ubSpUuOcTExMUaS0+saP368kWRmzpzpaLt48aKpVauW8ff3N8nJycYYY/bv328kmYCAAHP06FGn/d/JMQRw72G5CwBco1GjRipYsKBCQkL0xBNPyM/PT4sWLXJcFT158qS+//57tWvXTmfOnNHx48d1/PhxnThxQo0bN9bu3bsdd4Np3769Ll26pK+++sox//Lly3X69Gm1b99ekmSM0YIFC9SiRQsZYxzzHT9+XI0bN1ZSUpJ++eUXpxq7devmtD756pKcffv23fbrnTdvniIjI1WmTBmnfT/yyCOSpFWrVt1yDg8PDz377LOO515eXnr22Wd19OhRbd682XFcixYtqlmzZjnGbd++XVu3btVTTz110/mTk5MlSXny5MnUa/Lx8XH8fOHCBR0/flwPPvigJGU4ltfz1VdfKT09Xe3atXM6JsHBwYqIiHAck02bNunEiRPq1auXPDz+/x+mO3Xq5PSXF0lasmSJgoOD1bFjR0ebp6en+vfvr5SUFK1Zs8ZpfJs2bRxX9a+6k2MI4N7DchcAuMakSZNUunRpJSUl6dNPP9UPP/wgu93u6N+zZ4+MMRo6dKiGDh163TmOHj2qYsWKqWLFiipTpozmzJmjHj16SLqy1KVAgQKOEHzs2DGdPn1aH3/8sT7++OMbznet4sWLOz2/GghPnTp126939+7d2rFjR4ZAeKN9X0/RokXl5+fn1Fa6dGlJV5YLPfjgg3Jzc1OnTp00efJknTt3Tr6+vpo1a5a8vb3Vtm3bm84fEBAgSTpz5kym7sJy8uRJRUdHa/bs2RnqT0pKuuX2u3fvljFGERER1+339PSUJB04cECSFB4e7tTv4eGhEiVKOLUdOHBAERERcnNzvjYWGRnpNNdVYWFhGfZ7J8cQwL2HkA4A16hRo4bj7i6tWrXSQw89pCeffFI7d+6Uv7+/0tPTJUkDBw50rCn/u2tDW/v27fX222/r+PHjypMnjxYtWqSOHTs6rrxene+pp57KsHb9qgoVKjg9v3Y98rWMMY6fbTbbdcekpaU5bZ+enq7y5ctr7Nix1x0fEhJy3fas6Ny5s9555x0tXLhQHTt21BdffKHmzZsrMDDwptuVKVNGkrRt2zbHXw1upl27dlq/fr0GDRqkSpUqOc5bVFSU43jfTHp6umw2m5YuXXrdY+3v73/LOe7UtX8NuFZWjyGAew8hHQBu4OodMxo0aKAPPvhAgwcPVsmSJSVduZraqFGjW87Rvn17RUdHa8GCBSpcuLCSk5PVoUMHR3/BggWVJ08epaWlZWq+zMqbN+91v6TnwIEDjtcgSaVKlVJ8fLwaNmx4w2B/K3/99ZfOnj3rdDX96pcLXXtFuVy5cqpcubJmzZql++67TwcPHtTEiRNvOX+LFi00cuRIzZw585Yh/dSpU1q5cqWio6P1xhtvONp3796dYeyNXm+pUqVkjFFYWJjjLwLXExoaKunKX1caNGjgaL98+bISEhKc3lyFhoZq69atSk9Pd7qa/vvvvzvNdStZPYYA7j2sSQeAm6hfv75q1Kih8ePH68KFCypUqJDq16+vKVOmKDExMcP4Y8eOOT2PjIxU+fLlNWfOHM2ZM0dFihRR3bp1Hf3u7u5q06aNFixYoO3bt99yvswqVaqUNmzY4PQFP4sXL85wC8F27drpzz//1NSpUzPMcf78eZ09e/aW+7p8+bKmTJnieH7x4kVNmTJFBQsWVNWqVZ3GPv3001q+fLnGjx+v/Pnzq0mTJrecv1atWoqKitK0adOue7eZixcvauDAgZL+/18Zrv2rgiSNHz8+w3ZX31T8/c3M448/Lnd3d0VHR2eYxxjjuJVjtWrVlD9/fk2dOlWXL192jJk1a1aGpUdNmzbV4cOHNWfOHEfb5cuXNXHiRPn7+6tevXo3OQLOsnIMAdx7uJIOALcwaNAgtW3bVjExMerdu7cmTZqkhx56SOXLl1evXr1UsmRJHTlyRD/++KP++OMPxcfHO23fvn17vfHGG/L29laPHj0yrEseNWqUVq1apZo1a6pXr14qW7asTp48qV9++UX/+9//dPLkyduuuWfPnpo/f76ioqLUrl077d27VzNnzlSpUqWcxj399NOaO3euevfurVWrVqlOnTpKS0vT77//rrlz52rZsmWO5T83UrRoUY0ePVoJCQkqXbq05syZo7i4OH388ceO9dtXPfnkk3r55Zf19ddfq0+fPhn6b+Szzz7Tv/71Lz3++ONq0aKFGjZsKD8/P+3evVuzZ89WYmKi3n33XQUEBKhu3boaM2aMLl26pGLFimn58uXav39/hjmvvoF47bXX1KFDB3l6eqpFixYqVaqURowYoSFDhjhuqZgnTx7t379fX3/9tZ555hkNHDhQXl5eGj58uP7973/rkUceUbt27ZSQkKCYmBiVKlXK6Ur9M888oylTpqhr167avHmzSpQoofnz5ys2Nlbjx4/P9Idi7+QYArjHuOy+MgBgIVdvwfjzzz9n6EtLSzOlSpUypUqVMpcvXzbGGLN3717TuXNnExwcbDw9PU2xYsVM8+bNzfz58zNsv3v3biPJSDLr1q277v6PHDli+vbta0JCQoynp6cJDg42DRs2NB9//LFjzNVbMM6bN89p26u37Zs+fbpT+3vvvWeKFStm7Ha7qVOnjtm0aVOGWzAac+VWgKNHjzYPPPCAsdvtJm/evKZq1aomOjraJCUl3fS41atXzzzwwANm06ZNplatWsbb29uEhoaaDz744IbbNG3a1Egy69evv+ncf3fu3Dnz7rvvmurVqxt/f3/j5eVlIiIizL///W+zZ88ex7g//vjDtG7d2gQFBZnAwEDTtm1b89dffxlJZtiwYU5zvvXWW6ZYsWLGzc0tw+0YFyxYYB566CHj5+dn/Pz8TJkyZUzfvn3Nzp07neaYMGGCCQ0NNXa73dSoUcPExsaaqlWrmqioKKdxR44cMd26dTMFChQwXl5epnz58hnO2dVz+c4779z0WGT1GAK4d9iM+dvf8gAAuItat26tbdu2ZfiW1JwiPT1dBQsW1OOPP37dZUTZIacfQwCsSQcA/IMSExP17bffZvrbQ63uwoULGdatf/bZZzp58qTq169/V/aZ044hgOvjSjoA4K7bv3+/YmNjNW3aNP3888/au3evgoODXV3WHVu9erVeeOEFtW3bVvnz59cvv/yiTz75RJGRkdq8ebPTl07dqZx6DAFcHx8cBQDcdWvWrFG3bt1UvHhxzZgxI8eEyxIlSigkJEQTJkzQyZMnlS9fPnXu3FmjRo3K1oAu5dxjCOD6uJIOAAAAWAxr0gEAAACLIaQDAAAAFsOadItJT0/XX3/9pTx58mT5K7oBAABw9xhjdObMGRUtWjTDF9RlF0K6xfz1118KCQlxdRkAAAC4hUOHDum+++67K3MT0i3m6ldDHzp0SAEBAS6uBgAAAH+XnJyskJAQR267GwjpFnN1iUtAQAAhHQAAwMLu5tJkPjgKAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAsxsPVBeD6yg1bJje7r6vLAAAAsLyEUc1cXUK240o6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWk+ND+urVq2Wz2XT69GlXlwIAAABkistDeteuXWWz2RyP/PnzKyoqSlu3bs2W+WvXrq3ExEQFBgZmy3wAAADA3ebykC5JUVFRSkxMVGJiolauXCkPDw81b948W+b28vJScHCwbDZbtswHAAAA3G2WCOl2u13BwcEKDg5WpUqVNHjwYB06dEjHjh277nKVuLg42Ww2JSQkSJIOHDigFi1aKG/evPLz89MDDzygJUuWSMq43CUmJkZBQUFatmyZIiMj5e/v73iTcK1p06YpMjJS3t7eKlOmjD788ENH38WLF9WvXz8VKVJE3t7eCg0N1ciRIyVJxhgNHz5cxYsXl91uV9GiRdW/f/+7d/AAAACQ43i4uoC/S0lJ0cyZMxUeHq78+fNnapu+ffvq4sWL+uGHH+Tn56fffvtN/v7+Nxx/7tw5vfvuu/r888/l5uamp556SgMHDtSsWbMkSbNmzdIbb7yhDz74QJUrV9aWLVvUq1cv+fn5qUuXLpowYYIWLVqkuXPnqnjx4jp06JAOHTokSVqwYIHGjRun2bNn64EHHtDhw4cVHx9/w1pSU1OVmprqeJ6cnJyp1wwAAICcyxIhffHixY5QffbsWRUpUkSLFy+Wm1vmLvQfPHhQbdq0Ufny5SVJJUuWvOn4S5cu6aOPPlKpUqUkSf369dObb77p6B82bJjee+89Pf7445KksLAw/fbbb5oyZYq6dOmigwcPKiIiQg899JBsNptCQ0OdagkODlajRo3k6emp4sWLq0aNGjesZeTIkYqOjs7U6wQAAEDuYInlLg0aNFBcXJzi4uL0008/qXHjxmrSpIkOHDiQqe379++vESNGqE6dOho2bNgtP3Tq6+vrCOiSVKRIER09elTSlTcJe/fuVY8ePeTv7+94jBgxQnv37pV05cOucXFxuv/++9W/f38tX77cMVfbtm11/vx5lSxZUr169dLXX3+ty5cv37CWIUOGKCkpyfG4ekUeAAAAuZclQrqfn5/Cw8MVHh6u6tWra9q0aTp79qymTp3quJpujHGMv3TpktP2PXv21L59+/T0009r27ZtqlatmiZOnHjD/Xl6ejo9t9lsjvlTUlIkSVOnTnW8cYiLi9P27du1YcMGSVKVKlW0f/9+vfXWWzp//rzatWunJ554QpIUEhKinTt36sMPP5SPj4+ee+451a1bN0PNV9ntdgUEBDg9AAAAkLtZIqT/nc1mk5ubm86fP6+CBQtKktMHO+Pi4jJsExISot69e+urr77SSy+9pKlTp2Zp34ULF1bRokW1b98+xxuHq4+wsDDHuICAALVv315Tp07VnDlztGDBAp08eVKS5OPjoxYtWmjChAlavXq1fvzxR23bti1L9QAAACD3scSa9NTUVB0+fFiSdOrUKX3wwQdKSUlRixYtFB4erpCQEA0fPlxvv/22du3apffee89p+wEDBqhJkyYqXbq0Tp06pVWrVikyMjLL9URHR6t///4KDAxUVFSUUlNTtWnTJp06dUovvviixo4dqyJFiqhy5cpyc3PTvHnzFBwcrKCgIMXExCgtLU01a9aUr6+vZs6cKR8fH6d16wAAAMDNWCKkf/fddypSpIgkKU+ePCpTpozmzZun+vXrS5K+/PJL9enTRxUqVFD16tU1YsQItW3b1rF9Wlqa+vbtqz/++EMBAQGKiorSuHHjslxPz5495evrq3feeUeDBg2Sn5+fypcvrwEDBjhqHDNmjHbv3i13d3dVr15dS5YskZubm4KCgjRq1Ci9+OKLSktLU/ny5fXNN99k+k41AAAAgM1cu9gbLpecnKzAwECFDJgrN7uvq8sBAACwvIRRzf7R/V3Na0lJSXft84SWXJMOAAAA5GaEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIvxcHUBuL7t0Y0VEBDg6jIAAADgAlxJBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMUQ0gEAAACLIaQDAAAAFkNIBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMUQ0gEAAACLIaQDAAAAFkNIBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMUQ0gEAAACLIaQDAAAAFkNIBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMUQ0gEAAACLIaQDAAAAFkNIBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMV4uLoAXF+5YcvkZvd1dRkAACAXSxjVzNUl5FpcSQcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGJybEivX7++BgwY4PI5AAAAgNvl4eoC7lTXrl01Y8aMDO0bN25UZGRkpuZYvXq1GjRooFOnTikoKMjR/tVXX8nT0zO7SgUAAAAy5Z4P6ZIUFRWl6dOnO7UVLFhQ7u7udzRvvnz57mh7AAAAICtyxHIXu92u4OBgp0fDhg2dlqqkpqbqlVdeUUhIiOx2u8LDw/XJJ58oISFBDRo0kCTlzZtXNptNXbt2lZRxucupU6fUuXNn5c2bV76+vmrSpIl2797t6I+JiVFQUJCWLVumyMhI+fv7KyoqSomJif/EYQAAAEAOkSNCemZ07txZX375pSZMmKAdO3ZoypQp8vf3V0hIiBYsWCBJ2rlzpxITE/X+++9fd46uXbtq06ZNWrRokX788UcZY9S0aVNdunTJMebcuXN699139fnnn+uHH37QwYMHNXDgwBvWlZqaquTkZKcHAAAAcrccsdxl8eLF8vf3dzxv0qSJU/+uXbs0d+5crVixQo0aNZIklSxZ0tF/dVlLoUKFnNakX2v37t1atGiRYmNjVbt2bUnSrFmzFBISooULF6pt27aSpEuXLumjjz5SqVKlJEn9+vXTm2++ecPaR44cqejo6Nt8xQAAAMjJcsSV9AYNGiguLs7xmDBhglN/XFyc3N3dVa9evSzvY8eOHfLw8FDNmjUdbfnz59f999+vHTt2ONp8fX0dAV2SihQpoqNHj95w3iFDhigpKcnxOHToUJZrBAAAQM6QI66k+/n5KTw8/Ib9Pj4+/1gtf78bjM1mkzHmhuPtdrvsdvvdLgsAAAD3kBxxJf1Wypcvr/T0dK1Zs+a6/V5eXpKktLS0G84RGRmpy5cva+PGjY62EydOaOfOnSpbtmz2FgwAAIBcLVeE9BIlSqhLly7q3r27Fi5cqP3792v16tWaO3euJCk0NFQ2m02LFy/WsWPHlJKSkmGOiIgItWzZUr169dK6desUHx+vp556SsWKFVPLli3/6ZcEAACAHCxXhHRJmjx5sp544gk999xzKlOmjHr16qWzZ89KkooVK6bo6GgNHjxYhQsXVr9+/a47x/Tp01W1alU1b95ctWrVkjFGS5Ys4QuPAAAAkK1s5mYLpvGPS05OVmBgoEIGzJWb3dfV5QAAgFwsYVQzV5dgSVfzWlJSkgICAu7KPnLNlXQAAADgXkFIBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMUQ0gEAAACLIaQDAAAAFkNIBwAAACyGkA4AAABYDCEdAAAAsBgPVxeA69se3VgBAQGuLgMAAAAuwJV0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABaTpZC+b9++7K4DAAAAwP/JUkgPDw9XgwYNNHPmTF24cCG7awIAAABytSyF9F9++UUVKlTQiy++qODgYD377LP66aefsrs2AAAAIFfKUkivVKmS3n//ff3111/69NNPlZiYqIceekjlypXT2LFjdezYseyuEwAAAMg17uiDox4eHnr88cc1b948jR49Wnv27NHAgQMVEhKizp07KzExMbvqBAAAAHKNOwrpmzZt0nPPPaciRYpo7NixGjhwoPbu3asVK1bor7/+UsuWLbOrTgAAACDX8MjKRmPHjtX06dO1c+dONW3aVJ999pmaNm0qN7crmT8sLEwxMTEqUaJEdtYKAAAA5ApZCumTJ09W9+7d1bVrVxUpUuS6YwoVKqRPPvnkjooDAAAAcqPbXu5y+fJlderUSU8//fQNA7okeXl5qUuXLndUHAAAAJAb3XZI9/Dw0HvvvafLly/fjXoAAACAXC9Ly10eeeQRrVmzhjXnd1G5YcvkZvd1dRkAAOAekzCqmatLQDbIUkhv0qSJBg8erG3btqlq1ary8/Nz6n/ssceypTgAAAAgN8pSSH/uueckXbnLy9/ZbDalpaXdWVUAAABALpalkJ6enp7ddQAAAAD4P3f0ZUYAAAAAsl+WQ/qaNWvUokULhYeHKzw8XI899pjWrl2bnbUBAAAAuVKWQvrMmTPVqFEj+fr6qn///urfv798fHzUsGFDffHFF9ldIwAAAJCr2Iwx5nY3ioyM1DPPPKMXXnjBqX3s2LGaOnWqduzYkW0F5jbJyckKDAxUyIC53IIRAADcNm7BePddzWtJSUkKCAi4K/vI0pX0ffv2qUWLFhnaH3vsMe3fv/+OiwIAAABysyyF9JCQEK1cuTJD+//+9z+FhITccVEAAABAbpalWzC+9NJL6t+/v+Li4lS7dm1JUmxsrGJiYvT+++9na4EAAABAbpOlkN6nTx8FBwfrvffe09y5cyVdWac+Z84ctWzZMlsLBAAAAHKbLIV0SWrdurVat26dnbUAAAAAEF9mBAAAAFhOlkJ63rx5lS9fvgyP/Pnzq1ixYqpXr56mT5+e3bVmSkxMjIKCglyybwAAACA7ZCmkv/HGG3Jzc1OzZs0UHR2t6OhoNWvWTG5uburbt69Kly6tPn36aOrUqdlabNeuXdWqVasM7atXr5bNZtPp06fVvn177dq1K1PzEegBAABgRVlak75u3TqNGDFCvXv3dmqfMmWKli9frgULFqhChQqaMGGCevXqlS2FZpaPj498fHz+0X2mpaXJZrPJzY3VQwAAALhzWUqVy5YtU6NGjTK0N2zYUMuWLZMkNW3aVPv27buz6rLg71fH4+Pj1aBBA+XJk0cBAQGqWrWqNm3apNWrV6tbt25KSkqSzWaTzWbT8OHDJUmnTp1S586dlTdvXvn6+qpJkybavXt3hn0sWrRIZcuWld1u17p16+Tp6anDhw871TNgwAA9/PDD/8RLBwAAQA6RpZCeL18+ffPNNxnav/nmG+XLl0+SdPbsWeXJk+fOqssGnTp10n333aeff/5Zmzdv1uDBg+Xp6anatWtr/PjxCggIUGJiohITEzVw4EBJV5bVbNq0SYsWLdKPP/4oY4yaNm2qS5cuOeY9d+6cRo8erWnTpunXX39VtWrVVLJkSX3++eeOMZcuXdKsWbPUvXv3G9aXmpqq5ORkpwcAAABytywtdxk6dKj69OmjVatWqUaNGpKkn3/+WUuWLNFHH30kSVqxYoXq1auXfZX+n8WLF8vf39+pLS0t7YbjDx48qEGDBqlMmTKSpIiICEdfYGCgbDabgoODHW27d+/WokWLFBsb6/iiplmzZikkJEQLFy5U27ZtJV0J4B9++KEqVqzo2LZHjx6aPn26Bg0aJOnKm5YLFy6oXbt2N6xv5MiRio6OzuzLBwAAQC6QpSvpvXr10po1a+Tn56evvvpKX331lXx9fbVmzRr16NFD0pVvJZ0zZ062FitJDRo0UFxcnNNj2rRpNxz/4osvqmfPnmrUqJFGjRqlvXv33nT+HTt2yMPDQzVr1nS05c+fX/fff7927NjhaPPy8lKFChWctu3atav27NmjDRs2SLqyLKZdu3by8/O74f6GDBmipKQkx+PQoUM3rQ8AAAA5X5a/zKhOnTqqU6dOdtaSKX5+fgoPD3dq++OPP244fvjw4XryySf17bffaunSpRo2bJhmz559x1/E5OPjI5vN5tRWqFAhtWjRQtOnT1dYWJiWLl2q1atX33Qeu90uu91+R7UAAAAgZ8ny7Uj27t2r119/XU8++aSOHj0qSVq6dKl+/fXXbCsuu5QuXVovvPCCli9frscff9xxD3cvL68MS2UiIyN1+fJlbdy40dF24sQJ7dy5U2XLlr3lvnr27Kk5c+bo448/VqlSpVzyRgYAAAD3tiyF9DVr1qh8+fLauHGjFixYoJSUFElX7qQybNiwbC3wTpw/f179+vXT6tWrdeDAAcXGxurnn39WZGSkJKlEiRJKSUnRypUrdfz4cZ07d04RERFq2bKlevXqpXXr1ik+Pl5PPfWUihUrppYtW95yn40bN1ZAQIBGjBihbt263e2XCAAAgBwoSyF98ODBGjFihFasWCEvLy9H+yOPPOJYj20F7u7uOnHihDp37qzSpUurXbt2atKkieODmrVr11bv3r3Vvn17FSxYUGPGjJEkTZ8+XVWrVlXz5s1Vq1YtGWO0ZMkSeXp63nKfbm5u6tq1q9LS0tS5c+e7+voAAACQM9mMMeZ2N/L399e2bdsUFhamPHnyKD4+XiVLllRCQoLKlCmjCxcu3I1a7xk9evTQsWPHtGjRotveNjk5WYGBgQoZMFdudt+7UB0AAMjJEkY1c3UJOd7VvJaUlKSAgIC7so8sfXA0KChIiYmJCgsLc2rfsmWLihUrli2F3YuSkpK0bds2ffHFF1kK6AAAAICUxeUuHTp00CuvvKLDhw/LZrMpPT1dsbGxGjhwYK5e4tGyZUv961//Uu/evfXoo4+6uhwAAADco7J0Jf0///mP+vbtq5CQEKWlpals2bJKS0vTk08+qddffz27a7xn3Op2iwAAAEBmZCmke3l5aerUqXrjjTe0bds2paSkqHLlyk7f5gkAAAAga7K03OXNN9/UuXPnFBISoqZNm6pdu3aKiIjQ+fPn9eabb2Z3jQAAAECukqWQHh0d7bg3+rXOnTvnuL0hAAAAgKzJUkg3xshms2Voj4+PV758+e64KAAAACA3u6016Xnz5pXNZpPNZlPp0qWdgnpaWppSUlLUu3fvbC8SAAAAyE1uK6SPHz9exhh1795d0dHRCgwMdPR5eXmpRIkSqlWrVrYXCQAAAOQmtxXSu3TpIkkKCwtT7dq15enpeVeKAgAAAHKzLN2CsV69eo6fL1y4oIsXLzr1362vRwUAAABygyx9cPTcuXPq16+fChUqJD8/P+XNm9fpAQAAACDrsnQlfdCgQVq1apUmT56sp59+WpMmTdKff/6pKVOmaNSoUdldY660Pboxf5EAAADIpbIU0r/55ht99tlnql+/vrp166aHH35Y4eHhCg0N1axZs9SpU6fsrhMAAADINbK03OXkyZMqWbKkpCvrz0+ePClJeuihh/TDDz9kX3UAAABALpSlkF6yZEnt379fklSmTBnNnTtX0pUr7EFBQdlWHAAAAJAbZSmkd+vWTfHx8ZKkwYMHa9KkSfL29taAAQM0aNCgbC0QAAAAyG1sxhhzp5McOHBAmzdvVkREhMqXL58ddeVaycnJCgwMVFJSEh8cBQAAsKB/Iq/d1pX077//XmXLllVycrJTe2hoqBo2bKgOHTpo7dq12VogAAAAkNvcVkgfP368evXqdd13DIGBgXr22Wc1duzYbCsOAAAAyI1uK6THx8crKirqhv3/+te/tHnz5jsuCgAAAMjNbiukHzlyRJ6enjfs9/Dw0LFjx+64KAAAACA3u62QXqxYMW3fvv2G/Vu3blWRIkXuuCgAAAAgN7utkN60aVMNHTpUFy5cyNB3/vx5DRs2TM2bN8+24gAAAIDc6LZuwXjkyBFVqVJF7u7u6tevn+6//35J0u+//65JkyYpLS1Nv/zyiwoXLnzXCs7puAUjAACAtf0Tec3jdgYXLlxY69evV58+fTRkyBBdzfc2m02NGzfWpEmTCOgAAADAHbqtkC5duSf6kiVLdOrUKe3Zs0fGGEVERChv3rx3oz4AAAAg17ntkH5V3rx5Vb169eysBQAAAIBu84OjAAAAAO4+QjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAsxsPVBeD6yg1bJje7r6vLAAAAkhJGNXN1CchluJIOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDF5OiQHhMTo6CgIFeXAQAAANwWy4f0Y8eOqU+fPipevLjsdruCg4PVuHFjxcbG3nLb9u3ba9euXf9AlQAAAED28XB1AbfSpk0bXbx4UTNmzFDJkiV15MgRrVy5UidOnLjltj4+PvLx8fkHqgQAAACyj6WvpJ8+fVpr167V6NGj1aBBA4WGhqpGjRoaMmSIHnvsMceYZ599VoULF5a3t7fKlSunxYsXS7r+cpf//ve/qlKliry9vVWyZElFR0fr8uXLjn6bzaZp06apdevW8vX1VUREhBYtWuQ0x6+//qrmzZsrICBAefLk0cMPP6y9e/c6+qdNm6bIyEh5e3urTJky+vDDD+/SEQIAAEBOZOkr6f7+/vL399fChQv14IMPym63O/Wnp6erSZMmOnPmjGbOnKlSpUrpt99+k7u7+3XnW7t2rTp37qwJEyY4gvUzzzwjSRo2bJhjXHR0tMaMGaN33nlHEydOVKdOnXTgwAHly5dPf/75p+rWrav69evr+++/V0BAgGJjYx1Bf9asWXrjjTf0wQcfqHLlytqyZYt69eolPz8/denSJUNNqampSk1NdTxPTk6+4+MGAACAe5vNGGNcXcTNLFiwQL169dL58+dVpUoV1atXTx06dFCFChW0fPlyNWnSRDt27FDp0qUzbBsTE6MBAwbo9OnTkqRGjRqpYcOGGjJkiGPMzJkz9fLLL+uvv/6SdOVK+uuvv6633npLknT27Fn5+/tr6dKlioqK0quvvqrZs2dr586d8vT0zLDP8PBwvfXWW+rYsaOjbcSIEVqyZInWr1+fYfzw4cMVHR2doT1kwFy52X1v72ABAIC7ImFUM1eXAAtJTk5WYGCgkpKSFBAQcFf2Yekr6dKVNenNmjXT2rVrtWHDBi1dulRjxozRtGnTdPToUd13333XDejXEx8fr9jYWL399tuOtrS0NF24cEHnzp2Tr++VUFyhQgVHv5+fnwICAnT06FFJUlxcnB5++OHrBvSzZ89q79696tGjh3r16uVov3z5sgIDA69b05AhQ/Tiiy86nicnJyskJCRTrwcAAAA5k+VDuiR5e3vr0Ucf1aOPPqqhQ4eqZ8+eGjZsmAYOHHhb86SkpCg6OlqPP/74dfdx1d8DuM1mU3p6uiTd9IOoKSkpkqSpU6eqZs2aTn03WoJjt9szLOMBAABA7nZPhPS/K1u2rBYuXKgKFSrojz/+0K5duzJ1Nb1KlSrauXOnwsPDs7zvChUqaMaMGbp06VKGMF+4cGEVLVpU+/btU6dOnbK8DwAAAORulg7pJ06cUNu2bdW9e3dVqFBBefLk0aZNmzRmzBi1bNlS9erVU926ddWmTRuNHTtW4eHh+v3332Wz2RQVFZVhvjfeeEPNmzdX8eLF9cQTT8jNzU3x8fHavn27RowYkama+vXrp4kTJ6pDhw4aMmSIAgMDtWHDBtWoUUP333+/oqOj1b9/fwUGBioqKkqpqanatGmTTp065bSsBQAAALgRS9+C0d/fXzVr1tS4ceNUt25dlStXTkOHDlWvXr30wQcfSLrywdLq1aurY8eOKlu2rF5++WWlpaVdd77GjRtr8eLFWr58uapXr64HH3xQ48aNU2hoaKZryp8/v77//nulpKSoXr16qlq1qqZOneq4qt6zZ09NmzZN06dPV/ny5VWvXj3FxMQoLCzszg8IAAAAcgXL390lt7n6aWHu7gIAgHVwdxdc65+4u4ulr6QDAAAAuREhHQAAALAYQjoAAABgMYR0AAAAwGII6QAAAIDFENIBAAAAiyGkAwAAABZDSAcAAAAshpAOAAAAWAwhHQAAALAYQjoAAABgMYR0AAAAwGI8XF0Arm97dGMFBAS4ugwAAAC4AFfSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDEeri4A11du2DK52X1dXQYAAPekhFHNXF0CcEe4kg4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMUQ0gEAAACLIaQDAAAAFkNIBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMXc0yF9+PDhqlSpUoa2woULy2azaeHChXd1/127dlWrVq3u6j4AAACQ+7g0pB87dkx9+vRR8eLFZbfbFRwcrMaNGys2NjZL8+3YsUPR0dGaMmWKEhMT1aRJkwxjYmJiFBQUdN3t/4lgDwAAANyKhyt33qZNG128eFEzZsxQyZIldeTIEa1cuVInTpzI0nx79+6VJLVs2VI2my07SwUAAAD+MS67kn769GmtXbtWo0ePVoMGDRQaGqoaNWpoyJAheuyxxxxjevbsqYIFCyogIECPPPKI4uPjrzvf8OHD1aJFC0mSm5tbtoT0Q4cOqV27dgoKClK+fPnUsmVLJSQk3HB8/fr11a9fP/Xr10+BgYEqUKCAhg4dKmPMHdcCAACA3MNlId3f31/+/v5auHChUlNTrzumbdu2Onr0qJYuXarNmzerSpUqatiwoU6ePJlh7MCBAzV9+nRJUmJiohITE++ovkuXLqlx48bKkyeP1q5dq9jYWPn7+ysqKkoXL1684XYzZsyQh4eHfvrpJ73//vsaO3aspk2bdsPxqampSk5OdnoAAAAgd3NZSPfw8FBMTIxmzJihoKAg1alTR6+++qq2bt0qSVq3bp1++uknzZs3T9WqVVNERITeffddBQUFaf78+Rnm8/f3d6w1Dw4OVnBw8A33nZSU5HiTcO3jWnPmzFF6erqmTZum8uXLKzIyUtOnT9fBgwe1evXqG84dEhKicePG6f7771enTp3073//W+PGjbvh+JEjRyowMNDxCAkJuclRAwAAQG7g0g+OtmnTRn/99ZcWLVqkqKgorV69WlWqVFFMTIzi4+OVkpKi/PnzOwXp/fv3O9ae38q12/Xu3dvRnidPHsXFxWV4XCs+Pl579uxRnjx5HHPky5dPFy5cuOn+H3zwQaelNrVq1dLu3buVlpZ23fFDhgxRUlKS43Ho0KFMvTYAAADkXC794KgkeXt769FHH9Wjjz6qoUOHqmfPnho2bJiee+45FSlS5LpXrW90d5a/uzZ4BwQEOH52c3NTeHj4TbdNSUlR1apVNWvWrAx9BQsWzNT+M8Nut8tut2fbfAAAALj3uTyk/13ZsmW1cOFCValSRYcPH5aHh4dKlCiRpbluFcRvpkqVKpozZ44KFSrkFPBvZePGjU7PN2zYoIiICLm7u2e5FgAAAOQuLlvucuLECT3yyCOaOXOmtm7dqv3792vevHkaM2aMWrZsqUaNGqlWrVpq1aqVli9froSEBK1fv16vvfaaNm3adNfr69SpkwoUKKCWLVtq7dq12r9/v1avXq3+/fvrjz/+uOF2Bw8e1IsvvqidO3fqyy+/1MSJE/X888/f9XoBAACQc7jsSrq/v79q1qypcePGae/evbp06ZJCQkLUq1cvvfrqq7LZbFqyZIlee+01devWTceOHVNwcLDq1q2rwoUL3/X6fH199cMPP+iVV17R448/rjNnzqhYsWJq2LDhTa+sd+7cWefPn1eNGjXk7u6u559/Xs8888xdrxcAAAA5h81wE+9sU79+fVWqVEnjx4/P8hzJyclX7vIyYK7c7L7ZVxwAALlIwqhmri4BOdjVvJaUlHRby6Jvh0vv7gIAAAAgI0I6AAAAYDGWu7vLvexmX3IEAAAAZBZX0gEAAACLIaQDAAAAFkNIBwAAACyGkA4AAABYDCEdAAAAsBhCOgAAAGAxhHQAAADAYgjpAAAAgMUQ0gEAAACL4RtHLWp7dGMFBAS4ugwAAAC4AFfSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAWQ0gHAAAALIaQDgAAAFgMIR0AAACwGEI6AAAAYDGEdAAAAMBiCOkAAACAxRDSAQAAAIshpAMAAAAW4+HqAuDMGCNJSk5OdnElAAAAuJ6rOe1qbrsbCOkWc+LECUlSSEiIiysBAADAzZw5c0aBgYF3ZW5CusXky5dPknTw4MG7dtJx+5KTkxUSEqJDhw4pICDA1eVAnBMr4pxYE+fFejgn1nO758QYozNnzqho0aJ3rSZCusW4uV35mEBgYCC/uBYUEBDAebEYzon1cE6sifNiPZwT67mdc3K3L6bywVEAAADAYgjpAAAAgMUQ0i3Gbrdr2LBhstvtri4F1+C8WA/nxHo4J9bEebEezon1WPGc2MzdvHcMAAAAgNvGlXQAAADAYgjpAAAAgMUQ0gEAAACLIaQDAAAAFkNIt5hJkyapRIkS8vb2Vs2aNfXTTz+5uqR7wg8//KAWLVqoaNGistlsWrhwoVO/MUZvvPGGihQpIh8fHzVq1Ei7d+92GnPy5El16tRJAQEBCgoKUo8ePZSSkuI0ZuvWrXr44Yfl7e2tkJAQjRkzJkMt8+bNU5kyZeTt7a3y5ctryZIlt11LTjBy5EhVr15defLkUaFChdSqVSvt3LnTacyFCxfUt29f5c+fX/7+/mrTpo2OHDniNObgwYNq1qyZfH19VahQIQ0aNEiXL192GrN69WpVqVJFdrtd4eHhiomJyVDPrX63MlPLvW7y5MmqUKGC48s6atWqpaVLlzr6OR+uN2rUKNlsNg0YMMDRxnn55w0fPlw2m83pUaZMGUc/58Q1/vzzTz311FPKnz+/fHx8VL58eW3atMnRn+P+rTewjNmzZxsvLy/z6aefml9//dX06tXLBAUFmSNHjri6NMtbsmSJee2118xXX31lJJmvv/7aqX/UqFEmMDDQLFy40MTHx5vHHnvMhIWFmfPnzzvGREVFmYoVK5oNGzaYtWvXmvDwcNOxY0dHf1JSkilcuLDp1KmT2b59u/nyyy+Nj4+PmTJlimNMbGyscXd3N2PGjDG//fabef31142np6fZtm3bbdWSEzRu3NhMnz7dbN++3cTFxZmmTZua4sWLm5SUFMeY3r17m5CQELNy5UqzadMm8+CDD5ratWs7+i9fvmzKlStnGjVqZLZs2WKWLFliChQoYIYMGeIYs2/fPuPr62tefPFF89tvv5mJEycad3d389133znGZOZ361a15ASLFi0y3377rdm1a5fZuXOnefXVV42np6fZvn27MYbz4Wo//fSTKVGihKlQoYJ5/vnnHe2cl3/esGHDzAMPPGASExMdj2PHjjn6OSf/vJMnT5rQ0FDTtWtXs3HjRrNv3z6zbNkys2fPHseYnPZvPSHdQmrUqGH69u3reJ6WlmaKFi1qRo4c6cKq7j1/D+np6ekmODjYvPPOO46206dPG7vdbr788ktjjDG//fabkWR+/vlnx5ilS5cam81m/vzzT2OMMR9++KHJmzevSU1NdYx55ZVXzP333+943q5dO9OsWTOnemrWrGmeffbZTNeSUx09etRIMmvWrDHGXHndnp6eZt68eY4xO3bsMJLMjz/+aIy58ubLzc3NHD582DFm8uTJJiAgwHEeXn75ZfPAAw847at9+/amcePGjue3+t3KTC05Vd68ec20adM4Hy525swZExERYVasWGHq1avnCOmcF9cYNmyYqVix4nX7OCeu8corr5iHHnrohv058d96lrtYxMWLF7V582Y1atTI0ebm5qZGjRrpxx9/dGFl9779+/fr8OHDTsc2MDBQNWvWdBzbH3/8UUFBQapWrZpjTKNGjeTm5qaNGzc6xtStW1deXl6OMY0bN9bOnTt16tQpx5hr93N1zNX9ZKaWnCopKUmSlC9fPknS5s2bdenSJadjUaZMGRUvXtzpvJQvX16FCxd2jGncuLGSk5P166+/Osbc7Jhn5ncrM7XkNGlpaZo9e7bOnj2rWrVqcT5crG/fvmrWrFmGY8d5cZ3du3eraNGiKlmypDp16qSDBw9K4py4yqJFi1StWjW1bdtWhQoVUuXKlTV16lRHf078t56QbhHHjx9XWlqa0y+0JBUuXFiHDx92UVU5w9Xjd7Nje/jwYRUqVMip38PDQ/ny5XMac705rt3HjcZc23+rWnKi9PR0DRgwQHXq1FG5cuUkXTkWXl5eCgoKchr79+OV1WOenJys8+fPZ+p3KzO15BTbtm2Tv7+/7Ha7evfura+//lply5blfLjQ7Nmz9csvv2jkyJEZ+jgvrlGzZk3FxMTou+++0+TJk7V//349/PDDOnPmDOfERfbt26fJkycrIiJCy5YtU58+fdS/f3/NmDFDUs78t94j0yMBIIv69u2r7du3a926da4uJde7//77FRcXp6SkJM2fP19dunTRmjVrXF1WrnXo0CE9//zzWrFihby9vV1dDv5PkyZNHD9XqFBBNWvWVGhoqObOnSsfHx8XVpZ7paenq1q1avrPf/4jSapcubK2b9+ujz76SF26dHFxdXcHV9ItokCBAnJ3d8/wiewjR44oODjYRVXlDFeP382O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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"from pathlib import Path\n",
"\n",
"DATA_DIR = Path(\"data\")\n",
"print(list(DATA_DIR.glob(\"*\")))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ovCtdT56abMz",
"outputId": "c9be829b-ca2a-4323-9630-5eb31be6be44"
},
"execution_count": 20,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[PosixPath('data/books_real_world.csv'), PosixPath('data/books_sales.csv'), PosixPath('data/books_features.csv'), PosixPath('data/books_master.csv'), PosixPath('data/books_reviews.csv')]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"books_df.to_csv(DATA_DIR / \"books_real_world.csv\", index=False)\n",
"sales_df.to_csv(DATA_DIR / \"books_sales.csv\", index=False)\n",
"reviews_df.to_csv(DATA_DIR / \"books_reviews.csv\", index=False)\n",
"features_df.to_csv(DATA_DIR / \"books_features.csv\", index=False)\n",
"master_df.to_csv(DATA_DIR / \"books_master.csv\", index=False)\n",
"\n",
"print(\"Notebook 1 files saved successfully.\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "M_tYUaq3Jl6S",
"outputId": "cb18efe5-5316-48aa-d363-f3c825c91b2a"
},
"execution_count": 21,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Notebook 1 files saved successfully.\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"from pathlib import Path\n",
"\n",
"DATA_DIR = Path(\"data\")\n",
"DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
"\n",
"books_df.to_csv(DATA_DIR / \"books_real_world.csv\", index=False)\n",
"sales_df.to_csv(DATA_DIR / \"books_sales.csv\", index=False)\n",
"reviews_df.to_csv(DATA_DIR / \"books_reviews.csv\", index=False)\n",
"features_df.to_csv(DATA_DIR / \"books_features.csv\", index=False)\n",
"master_df.to_csv(DATA_DIR / \"books_master.csv\", index=False)\n",
"\n",
"print(\"Data saved successfully\")"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "P0ZIAQGug9lu",
"outputId": "9769b498-1428-44b3-c00e-7395d52e26b9"
},
"execution_count": 24,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Data saved successfully\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"from pathlib import Path\n",
"\n",
"DATA_DIR = Path(\"data\")\n",
"DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
"\n",
"books_df.to_csv(DATA_DIR / \"books_real_world.csv\", index=False)\n",
"sales_df.to_csv(DATA_DIR / \"books_sales.csv\", index=False)\n",
"reviews_df.to_csv(DATA_DIR / \"books_reviews.csv\", index=False)\n",
"features_df.to_csv(DATA_DIR / \"books_features.csv\", index=False)\n",
"master_df.to_csv(DATA_DIR / \"books_master.csv\", index=False)\n",
"\n",
"print(\"CSV files saved successfully.\")\n",
"print(\"Files:\", list(DATA_DIR.glob(\"*\")))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Ocnww2TohLD6",
"outputId": "ac117ed7-a090-472f-f3dd-1d376a5f2f2e"
},
"execution_count": 25,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"CSV files saved successfully.\n",
"Files: [PosixPath('data/books_real_world.csv'), PosixPath('data/books_sales.csv'), PosixPath('data/books_features.csv'), PosixPath('data/books_master.csv'), PosixPath('data/books_reviews.csv')]\n"
]
}
]
}
]
}