Spaces:
Sleeping
Sleeping
File size: 127,189 Bytes
ad7eafd |
1 |
{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"mount_file_id":"1z2Tq7dKp7YLHVFK8dXL2EZn0hBclc6dQ","authorship_tag":"ABX9TyNCgalS8m4obOk+v6xZ1zQQ"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# Initial instructions"],"metadata":{"id":"Do8-wzEtQiVu"}},{"cell_type":"code","execution_count":1,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"6NUxzlPDIej5","executionInfo":{"status":"ok","timestamp":1688570661655,"user_tz":-210,"elapsed":3937,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"e8d93915-58f9-4b3c-8688-08e8c3c5ce91"},"outputs":[{"output_type":"stream","name":"stdout","text":["Requirement already satisfied: kaggle in /usr/local/lib/python3.10/dist-packages (1.5.13)\n","Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.10/dist-packages (from kaggle) (1.16.0)\n","Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from kaggle) (2023.5.7)\n","Requirement already satisfied: python-dateutil in /usr/local/lib/python3.10/dist-packages (from kaggle) (2.8.2)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from kaggle) (2.27.1)\n","Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from kaggle) (4.65.0)\n","Requirement already satisfied: python-slugify in /usr/local/lib/python3.10/dist-packages (from kaggle) (8.0.1)\n","Requirement already satisfied: urllib3 in /usr/local/lib/python3.10/dist-packages (from kaggle) (1.26.16)\n","Requirement already satisfied: text-unidecode>=1.3 in /usr/local/lib/python3.10/dist-packages (from python-slugify->kaggle) (1.3)\n","Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->kaggle) (2.0.12)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->kaggle) (3.4)\n"]}],"source":["! pip install kaggle"]},{"cell_type":"code","source":["from google.colab import files"],"metadata":{"id":"9gjOv_WUJBzz","executionInfo":{"status":"ok","timestamp":1688570665466,"user_tz":-210,"elapsed":8,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":2,"outputs":[]},{"cell_type":"code","source":["files.upload()\n","! mkdir ~/.kaggle\n","! cp kaggle.json ~/.kaggle/\n","! chmod 600 ~/.kaggle/kaggle.json\n","! kaggle datasets download -d rounakbanik/the-movies-dataset"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":125},"id":"cQoNEnDDJOvf","executionInfo":{"status":"ok","timestamp":1688570709193,"user_tz":-210,"elapsed":40889,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"3c8e5f7b-618d-4109-950c-30be7e04569b"},"execution_count":3,"outputs":[{"output_type":"display_data","data":{"text/plain":["<IPython.core.display.HTML object>"],"text/html":["\n"," <input type=\"file\" id=\"files-6731ac4b-bf13-403a-91ee-a79038f4c5ce\" name=\"files[]\" multiple disabled\n"," style=\"border:none\" />\n"," <output id=\"result-6731ac4b-bf13-403a-91ee-a79038f4c5ce\">\n"," Upload widget is only available when the cell has been executed in the\n"," current browser session. Please rerun this cell to enable.\n"," </output>\n"," <script>// Copyright 2017 Google LLC\n","//\n","// Licensed under the Apache License, Version 2.0 (the \"License\");\n","// you may not use this file except in compliance with the License.\n","// You may obtain a copy of the License at\n","//\n","// http://www.apache.org/licenses/LICENSE-2.0\n","//\n","// Unless required by applicable law or agreed to in writing, software\n","// distributed under the License is distributed on an \"AS IS\" BASIS,\n","// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n","// See the License for the specific language governing permissions and\n","// limitations under the License.\n","\n","/**\n"," * @fileoverview Helpers for google.colab Python module.\n"," */\n","(function(scope) {\n","function span(text, styleAttributes = {}) {\n"," const element = document.createElement('span');\n"," element.textContent = text;\n"," for (const key of Object.keys(styleAttributes)) {\n"," element.style[key] = styleAttributes[key];\n"," }\n"," return element;\n","}\n","\n","// Max number of bytes which will be uploaded at a time.\n","const MAX_PAYLOAD_SIZE = 100 * 1024;\n","\n","function _uploadFiles(inputId, outputId) {\n"," const steps = uploadFilesStep(inputId, outputId);\n"," const outputElement = document.getElementById(outputId);\n"," // Cache steps on the outputElement to make it available for the next call\n"," // to uploadFilesContinue from Python.\n"," outputElement.steps = steps;\n","\n"," return _uploadFilesContinue(outputId);\n","}\n","\n","// This is roughly an async generator (not supported in the browser yet),\n","// where there are multiple asynchronous steps and the Python side is going\n","// to poll for completion of each step.\n","// This uses a Promise to block the python side on completion of each step,\n","// then passes the result of the previous step as the input to the next step.\n","function _uploadFilesContinue(outputId) {\n"," const outputElement = document.getElementById(outputId);\n"," const steps = outputElement.steps;\n","\n"," const next = steps.next(outputElement.lastPromiseValue);\n"," return Promise.resolve(next.value.promise).then((value) => {\n"," // Cache the last promise value to make it available to the next\n"," // step of the generator.\n"," outputElement.lastPromiseValue = value;\n"," return next.value.response;\n"," });\n","}\n","\n","/**\n"," * Generator function which is called between each async step of the upload\n"," * process.\n"," * @param {string} inputId Element ID of the input file picker element.\n"," * @param {string} outputId Element ID of the output display.\n"," * @return {!Iterable<!Object>} Iterable of next steps.\n"," */\n","function* uploadFilesStep(inputId, outputId) {\n"," const inputElement = document.getElementById(inputId);\n"," inputElement.disabled = false;\n","\n"," const outputElement = document.getElementById(outputId);\n"," outputElement.innerHTML = '';\n","\n"," const pickedPromise = new Promise((resolve) => {\n"," inputElement.addEventListener('change', (e) => {\n"," resolve(e.target.files);\n"," });\n"," });\n","\n"," const cancel = document.createElement('button');\n"," inputElement.parentElement.appendChild(cancel);\n"," cancel.textContent = 'Cancel upload';\n"," const cancelPromise = new Promise((resolve) => {\n"," cancel.onclick = () => {\n"," resolve(null);\n"," };\n"," });\n","\n"," // Wait for the user to pick the files.\n"," const files = yield {\n"," promise: Promise.race([pickedPromise, cancelPromise]),\n"," response: {\n"," action: 'starting',\n"," }\n"," };\n","\n"," cancel.remove();\n","\n"," // Disable the input element since further picks are not allowed.\n"," inputElement.disabled = true;\n","\n"," if (!files) {\n"," return {\n"," response: {\n"," action: 'complete',\n"," }\n"," };\n"," }\n","\n"," for (const file of files) {\n"," const li = document.createElement('li');\n"," li.append(span(file.name, {fontWeight: 'bold'}));\n"," li.append(span(\n"," `(${file.type || 'n/a'}) - ${file.size} bytes, ` +\n"," `last modified: ${\n"," file.lastModifiedDate ? file.lastModifiedDate.toLocaleDateString() :\n"," 'n/a'} - `));\n"," const percent = span('0% done');\n"," li.appendChild(percent);\n","\n"," outputElement.appendChild(li);\n","\n"," const fileDataPromise = new Promise((resolve) => {\n"," const reader = new FileReader();\n"," reader.onload = (e) => {\n"," resolve(e.target.result);\n"," };\n"," reader.readAsArrayBuffer(file);\n"," });\n"," // Wait for the data to be ready.\n"," let fileData = yield {\n"," promise: fileDataPromise,\n"," response: {\n"," action: 'continue',\n"," }\n"," };\n","\n"," // Use a chunked sending to avoid message size limits. See b/62115660.\n"," let position = 0;\n"," do {\n"," const length = Math.min(fileData.byteLength - position, MAX_PAYLOAD_SIZE);\n"," const chunk = new Uint8Array(fileData, position, length);\n"," position += length;\n","\n"," const base64 = btoa(String.fromCharCode.apply(null, chunk));\n"," yield {\n"," response: {\n"," action: 'append',\n"," file: file.name,\n"," data: base64,\n"," },\n"," };\n","\n"," let percentDone = fileData.byteLength === 0 ?\n"," 100 :\n"," Math.round((position / fileData.byteLength) * 100);\n"," percent.textContent = `${percentDone}% done`;\n","\n"," } while (position < fileData.byteLength);\n"," }\n","\n"," // All done.\n"," yield {\n"," response: {\n"," action: 'complete',\n"," }\n"," };\n","}\n","\n","scope.google = scope.google || {};\n","scope.google.colab = scope.google.colab || {};\n","scope.google.colab._files = {\n"," _uploadFiles,\n"," _uploadFilesContinue,\n","};\n","})(self);\n","</script> "]},"metadata":{}},{"output_type":"stream","name":"stdout","text":["Saving kaggle.json to kaggle.json\n","Downloading the-movies-dataset.zip to /content\n"," 96% 219M/228M [00:02<00:00, 121MB/s]\n","100% 228M/228M [00:02<00:00, 102MB/s]\n"]}]},{"cell_type":"code","source":["import os"],"metadata":{"id":"ArIWM5DHqXYZ","executionInfo":{"status":"ok","timestamp":1688570797771,"user_tz":-210,"elapsed":371,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":5,"outputs":[]},{"cell_type":"code","source":["if not os.path.isdir('/content/drive/MyDrive/Rec/data/raw') :\n"," os.mkdir('/content/drive/MyDrive/Rec/data/raw')"],"metadata":{"id":"HaEx9oF3Li7f"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["! unzip '/content/the-movies-dataset.zip' -d '/content/drive/MyDrive/Rec/data/raw'"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pLeGJcfvLwwJ","executionInfo":{"status":"ok","timestamp":1688565261896,"user_tz":-210,"elapsed":11516,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"449b2179-ff5a-4ac8-f9c5-07efc6a7e7c6"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Archive: /content/the-movies-dataset.zip\n"," inflating: /content/drive/MyDrive/Rec/data/raw/credits.csv \n"," inflating: /content/drive/MyDrive/Rec/data/raw/keywords.csv \n"," inflating: /content/drive/MyDrive/Rec/data/raw/links.csv \n"," inflating: /content/drive/MyDrive/Rec/data/raw/links_small.csv \n"," inflating: /content/drive/MyDrive/Rec/data/raw/movies_metadata.csv \n"," inflating: /content/drive/MyDrive/Rec/data/raw/ratings.csv \n"," inflating: /content/drive/MyDrive/Rec/data/raw/ratings_small.csv \n"]}]},{"cell_type":"code","source":["raw_dir = '/content/drive/MyDrive/Rec/data/raw'"],"metadata":{"id":"PAWyXXGxMVIX","executionInfo":{"status":"ok","timestamp":1688570776985,"user_tz":-210,"elapsed":496,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":4,"outputs":[]},{"cell_type":"markdown","source":["# Needed imports"],"metadata":{"id":"6rPjGeurQdnV"}},{"cell_type":"code","source":["import numpy as np\n","import pandas as pd\n","import json\n","import csv\n","import matplotlib.pyplot as plt\n","from ast import literal_eval"],"metadata":{"id":"tx4gvgqgMxgo","executionInfo":{"status":"ok","timestamp":1688570807449,"user_tz":-210,"elapsed":390,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":6,"outputs":[]},{"cell_type":"markdown","source":["# Credits dataset"],"metadata":{"id":"GA6noW_jSjRc"}},{"cell_type":"code","source":["credits = pd.read_csv(os.path.join(raw_dir, 'credits.csv'))\n","print('shape of credits dataset: {}'.format(credits.shape))\n","credits.head(3)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":161},"id":"ZaOZPI1NQcg5","executionInfo":{"status":"ok","timestamp":1688547894409,"user_tz":-210,"elapsed":3235,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"1bc46c8b-c287-49bb-bc9c-b832e85b1e8f"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["shape of credits dataset: (45476, 3)\n"]},{"output_type":"execute_result","data":{"text/plain":[" cast \\\n","0 [{'cast_id': 14, 'character': 'Woody (voice)',... \n","1 [{'cast_id': 1, 'character': 'Alan Parrish', '... \n","2 [{'cast_id': 2, 'character': 'Max Goldman', 'c... \n","\n"," crew id \n","0 [{'credit_id': '52fe4284c3a36847f8024f49', 'de... 862 \n","1 [{'credit_id': '52fe44bfc3a36847f80a7cd1', 'de... 8844 \n","2 [{'credit_id': '52fe466a9251416c75077a89', 'de... 15602 "],"text/html":["\n"," <div id=\"df-af558189-001b-41a5-a507-f131b8c3ab89\">\n"," <div class=\"colab-df-container\">\n"," <div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>cast</th>\n"," <th>crew</th>\n"," <th>id</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>[{'cast_id': 14, 'character': 'Woody (voice)',...</td>\n"," <td>[{'credit_id': '52fe4284c3a36847f8024f49', 'de...</td>\n"," <td>862</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>[{'cast_id': 1, 'character': 'Alan Parrish', '...</td>\n"," <td>[{'credit_id': '52fe44bfc3a36847f80a7cd1', 'de...</td>\n"," <td>8844</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>[{'cast_id': 2, 'character': 'Max Goldman', 'c...</td>\n"," <td>[{'credit_id': '52fe466a9251416c75077a89', 'de...</td>\n"," <td>15602</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>\n"," <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-af558189-001b-41a5-a507-f131b8c3ab89')\"\n"," title=\"Convert this dataframe to an interactive table.\"\n"," style=\"display:none;\">\n"," \n"," <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n"," width=\"24px\">\n"," <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n"," <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n"," </svg>\n"," </button>\n"," \n"," <style>\n"," .colab-df-container {\n"," display:flex;\n"," flex-wrap:wrap;\n"," gap: 12px;\n"," }\n","\n"," .colab-df-convert {\n"," background-color: #E8F0FE;\n"," border: none;\n"," border-radius: 50%;\n"," cursor: pointer;\n"," display: none;\n"," fill: #1967D2;\n"," height: 32px;\n"," padding: 0 0 0 0;\n"," width: 32px;\n"," }\n","\n"," .colab-df-convert:hover {\n"," background-color: #E2EBFA;\n"," box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n"," fill: #174EA6;\n"," }\n","\n"," [theme=dark] .colab-df-convert {\n"," background-color: #3B4455;\n"," fill: #D2E3FC;\n"," }\n","\n"," [theme=dark] .colab-df-convert:hover {\n"," background-color: #434B5C;\n"," box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n"," filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n"," fill: #FFFFFF;\n"," }\n"," </style>\n","\n"," <script>\n"," const buttonEl =\n"," document.querySelector('#df-af558189-001b-41a5-a507-f131b8c3ab89 button.colab-df-convert');\n"," buttonEl.style.display =\n"," google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n"," async function convertToInteractive(key) {\n"," const element = document.querySelector('#df-af558189-001b-41a5-a507-f131b8c3ab89');\n"," const dataTable =\n"," await google.colab.kernel.invokeFunction('convertToInteractive',\n"," [key], {});\n"," if (!dataTable) return;\n","\n"," const docLinkHtml = 'Like what you see? Visit the ' +\n"," '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n"," + ' to learn more about interactive tables.';\n"," element.innerHTML = '';\n"," dataTable['output_type'] = 'display_data';\n"," await google.colab.output.renderOutput(dataTable, element);\n"," const docLink = document.createElement('div');\n"," docLink.innerHTML = docLinkHtml;\n"," element.appendChild(docLink);\n"," }\n"," </script>\n"," </div>\n"," </div>\n"," "]},"metadata":{},"execution_count":10}]},{"cell_type":"code","source":["credits.isnull().sum()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"6of-O22CTBD7","executionInfo":{"status":"ok","timestamp":1688547995732,"user_tz":-210,"elapsed":473,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"6da185d8-74eb-4701-c341-8304a241aa94"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["cast 0\n","crew 0\n","id 0\n","dtype: int64"]},"metadata":{},"execution_count":11}]},{"cell_type":"code","source":["credits.isna().sum()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tfhS7WLITas6","executionInfo":{"status":"ok","timestamp":1688548005437,"user_tz":-210,"elapsed":27,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"aa448602-e8af-456a-c269-6dcc16337a5e"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["cast 0\n","crew 0\n","id 0\n","dtype: int64"]},"metadata":{},"execution_count":12}]},{"cell_type":"code","source":["credits.nunique()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"8gj4gQr2Tc_H","executionInfo":{"status":"ok","timestamp":1688548048490,"user_tz":-210,"elapsed":1036,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"2911f641-04bd-4573-8260-65327de68818"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["cast 43019\n","crew 44669\n","id 45432\n","dtype: int64"]},"metadata":{},"execution_count":14}]},{"cell_type":"code","source":["credits.drop_duplicates(inplace=True)"],"metadata":{"id":"shIqe3YbTiCw"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Extracting information from json strings"],"metadata":{"id":"XvobXUNzVxFf"}},{"cell_type":"code","source":["def get_text(text, obj='name'):\n"," text = literal_eval(text)\n"," if len(text) == 1:\n"," for i in text:\n"," return i[obj]\n"," else:\n"," s = []\n"," for i in text:\n"," s.append(str(i[obj]))\n"," return ', '.join(s)"],"metadata":{"id":"wmybX3cqTsrm","executionInfo":{"status":"ok","timestamp":1688571301495,"user_tz":-210,"elapsed":495,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":28,"outputs":[]},{"cell_type":"code","source":["credits['name_crew'] = credits['crew'].apply(get_text, obj = \"name\")\n","credits['department_crew'] = credits['crew'].apply(get_text, obj = \"department\")\n","credits['gender_crew'] = credits['crew'].apply(get_text, obj = \"gender\")\n","credits['job_crew'] = credits['crew'].apply(get_text, obj = \"job\")\n","credits['profile_path_crew'] = credits['crew'].apply(get_text, obj = \"profile_path\")\n","credits['id_crew'] = credits['crew'].apply(get_text, obj = \"id\")"],"metadata":{"id":"NIfflprHV4mT"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["credits['name_cast'] = credits['cast'].apply(get_text, obj = \"name\")\n","credits['order_cast'] = credits['cast'].apply(get_text, obj = \"order\")\n","credits['gender_cast'] = credits['cast'].apply(get_text, obj = \"gender\")\n","credits['credit_id_cast'] = credits['cast'].apply(get_text, obj = \"credit_id\")\n","credits['profile_path_cast'] = credits['cast'].apply(get_text, obj = \"profile_path\")\n","credits['id_cast'] = credits['cast'].apply(get_text, obj = \"id\")\n","credits['character_cast'] = credits['cast'].apply(get_text, obj = \"character\")"],"metadata":{"id":"6mVD2jb9V9Gy"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Constructing the new dataframe and saving that"],"metadata":{"id":"lDgPbPtyYJrG"}},{"cell_type":"code","source":["clean_credits = credits.drop([\"crew\", \"cast\"], axis=1)"],"metadata":{"id":"zGjkFiWEWicR"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Checking the new dataframe"],"metadata":{"id":"QeO-YhWTYUvz"}},{"cell_type":"code","source":["print ('shape of the cleaned Credits dataset: {}'.format(clean_credits.shape))\n","clean_credits.head(3)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":572},"id":"k9Iqhry2Xsyt","executionInfo":{"status":"ok","timestamp":1688549213175,"user_tz":-210,"elapsed":473,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"65d54e2b-4828-4937-dada-233a2dd45011"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["shape of the cleaned Credits dataset: (45439, 14)\n"]},{"output_type":"execute_result","data":{"text/plain":[" id name_crew \\\n","0 862 John Lasseter, Joss Whedon, Andrew Stanton, Jo... \n","1 8844 Larry J. Franco, Jonathan Hensleigh, James Hor... \n","2 15602 Howard Deutch, Mark Steven Johnson, Mark Steve... \n","\n"," department_crew \\\n","0 Directing, Writing, Writing, Writing, Writing,... \n","1 Production, Writing, Sound, Directing, Editing... \n","2 Directing, Writing, Writing, Crew \n","\n"," gender_crew \\\n","0 2, 2, 2, 2, 0, 1, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2... \n","1 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2 \n","2 2, 2, 2, 2 \n","\n"," job_crew \\\n","0 Director, Screenplay, Screenplay, Screenplay, ... \n","1 Executive Producer, Screenplay, Original Music... \n","2 Director, Characters, Writer, Sound Recordist \n","\n"," profile_path_crew \\\n","0 /7EdqiNbr4FRjIhKHyPPdFfEEEFG.jpg, /dTiVsuaTVTe... \n","1 None, /l1c4UFD3g0HVWj5f0CxXAvMAGiT.jpg, /oLOtX... \n","2 /68Vae1HkU1NxQZ6KEmuxIpno7c9.jpg, /6trChNn3o2b... \n","\n"," id_crew \\\n","0 7879, 12891, 7, 12892, 12893, 12894, 12895, 12... \n","1 511, 876, 1729, 4945, 4951, 4952, 8023, 9967, ... \n","2 26502, 16837, 16837, 1551320 \n","\n"," name_cast \\\n","0 Tom Hanks, Tim Allen, Don Rickles, Jim Varney,... \n","1 Robin Williams, Jonathan Hyde, Kirsten Dunst, ... \n","2 Walter Matthau, Jack Lemmon, Ann-Margret, Soph... \n","\n"," order_cast \\\n","0 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 \n","1 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ... \n","2 0, 1, 2, 3, 4, 5, 6 \n","\n"," gender_cast \\\n","0 2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 2, 1, 2 \n","1 2, 2, 1, 0, 1, 1, 2, 1, 0, 1, 2, 1, 2, 0, 0, 0... \n","2 2, 2, 1, 1, 1, 2, 2 \n","\n"," credit_id_cast \\\n","0 52fe4284c3a36847f8024f95, 52fe4284c3a36847f802... \n","1 52fe44bfc3a36847f80a7c73, 52fe44bfc3a36847f80a... \n","2 52fe466a9251416c75077a8d, 52fe466a9251416c7507... \n","\n"," profile_path_cast \\\n","0 /pQFoyx7rp09CJTAb932F2g8Nlho.jpg, /uX2xVf6pMmP... \n","1 /sojtJyIV3lkUeThD7A2oHNm8183.jpg, /7il5D76vx6Q... \n","2 /xJVkvprOnzP5Zdh5y63y8HHniDZ.jpg, /chZmNRYMtqk... \n","\n"," id_cast \\\n","0 31, 12898, 7167, 12899, 12900, 7907, 8873, 111... \n","1 2157, 8537, 205, 145151, 5149, 10739, 58563, 1... \n","2 6837, 3151, 13567, 16757, 589, 16523, 7166 \n","\n"," character_cast \n","0 Woody (voice), Buzz Lightyear (voice), Mr. Pot... \n","1 Alan Parrish, Samuel Alan Parrish / Van Pelt, ... \n","2 Max Goldman, John Gustafson, Ariel Gustafson, ... "],"text/html":["\n"," <div id=\"df-b061b4ac-c086-4304-9e17-fe2a649fdb5f\">\n"," <div class=\"colab-df-container\">\n"," <div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>id</th>\n"," <th>name_crew</th>\n"," <th>department_crew</th>\n"," <th>gender_crew</th>\n"," <th>job_crew</th>\n"," <th>profile_path_crew</th>\n"," <th>id_crew</th>\n"," <th>name_cast</th>\n"," <th>order_cast</th>\n"," <th>gender_cast</th>\n"," <th>credit_id_cast</th>\n"," <th>profile_path_cast</th>\n"," <th>id_cast</th>\n"," <th>character_cast</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>862</td>\n"," <td>John Lasseter, Joss Whedon, Andrew Stanton, Jo...</td>\n"," <td>Directing, Writing, Writing, Writing, Writing,...</td>\n"," <td>2, 2, 2, 2, 0, 1, 0, 2, 2, 2, 2, 2, 0, 0, 0, 2...</td>\n"," <td>Director, Screenplay, Screenplay, Screenplay, ...</td>\n"," <td>/7EdqiNbr4FRjIhKHyPPdFfEEEFG.jpg, /dTiVsuaTVTe...</td>\n"," <td>7879, 12891, 7, 12892, 12893, 12894, 12895, 12...</td>\n"," <td>Tom Hanks, Tim Allen, Don Rickles, Jim Varney,...</td>\n"," <td>0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12</td>\n"," <td>2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 2, 1, 2</td>\n"," <td>52fe4284c3a36847f8024f95, 52fe4284c3a36847f802...</td>\n"," <td>/pQFoyx7rp09CJTAb932F2g8Nlho.jpg, /uX2xVf6pMmP...</td>\n"," <td>31, 12898, 7167, 12899, 12900, 7907, 8873, 111...</td>\n"," <td>Woody (voice), Buzz Lightyear (voice), Mr. Pot...</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>8844</td>\n"," <td>Larry J. Franco, Jonathan Hensleigh, James Hor...</td>\n"," <td>Production, Writing, Sound, Directing, Editing...</td>\n"," <td>2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2</td>\n"," <td>Executive Producer, Screenplay, Original Music...</td>\n"," <td>None, /l1c4UFD3g0HVWj5f0CxXAvMAGiT.jpg, /oLOtX...</td>\n"," <td>511, 876, 1729, 4945, 4951, 4952, 8023, 9967, ...</td>\n"," <td>Robin Williams, Jonathan Hyde, Kirsten Dunst, ...</td>\n"," <td>0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, ...</td>\n"," <td>2, 2, 1, 0, 1, 1, 2, 1, 0, 1, 2, 1, 2, 0, 0, 0...</td>\n"," <td>52fe44bfc3a36847f80a7c73, 52fe44bfc3a36847f80a...</td>\n"," <td>/sojtJyIV3lkUeThD7A2oHNm8183.jpg, /7il5D76vx6Q...</td>\n"," <td>2157, 8537, 205, 145151, 5149, 10739, 58563, 1...</td>\n"," <td>Alan Parrish, Samuel Alan Parrish / Van Pelt, ...</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>15602</td>\n"," <td>Howard Deutch, Mark Steven Johnson, Mark Steve...</td>\n"," <td>Directing, Writing, Writing, Crew</td>\n"," <td>2, 2, 2, 2</td>\n"," <td>Director, Characters, Writer, Sound Recordist</td>\n"," <td>/68Vae1HkU1NxQZ6KEmuxIpno7c9.jpg, /6trChNn3o2b...</td>\n"," <td>26502, 16837, 16837, 1551320</td>\n"," <td>Walter Matthau, Jack Lemmon, Ann-Margret, Soph...</td>\n"," <td>0, 1, 2, 3, 4, 5, 6</td>\n"," <td>2, 2, 1, 1, 1, 2, 2</td>\n"," <td>52fe466a9251416c75077a8d, 52fe466a9251416c7507...</td>\n"," <td>/xJVkvprOnzP5Zdh5y63y8HHniDZ.jpg, /chZmNRYMtqk...</td>\n"," <td>6837, 3151, 13567, 16757, 589, 16523, 7166</td>\n"," <td>Max Goldman, John Gustafson, Ariel Gustafson, ...</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>\n"," <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-b061b4ac-c086-4304-9e17-fe2a649fdb5f')\"\n"," title=\"Convert this dataframe to an interactive table.\"\n"," style=\"display:none;\">\n"," \n"," <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n"," width=\"24px\">\n"," <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n"," <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n"," </svg>\n"," </button>\n"," \n"," <style>\n"," .colab-df-container {\n"," display:flex;\n"," flex-wrap:wrap;\n"," gap: 12px;\n"," }\n","\n"," .colab-df-convert {\n"," background-color: #E8F0FE;\n"," border: none;\n"," border-radius: 50%;\n"," cursor: pointer;\n"," display: none;\n"," fill: #1967D2;\n"," height: 32px;\n"," padding: 0 0 0 0;\n"," width: 32px;\n"," }\n","\n"," .colab-df-convert:hover {\n"," background-color: #E2EBFA;\n"," box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n"," fill: #174EA6;\n"," }\n","\n"," [theme=dark] .colab-df-convert {\n"," background-color: #3B4455;\n"," fill: #D2E3FC;\n"," }\n","\n"," [theme=dark] .colab-df-convert:hover {\n"," background-color: #434B5C;\n"," box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n"," filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n"," fill: #FFFFFF;\n"," }\n"," </style>\n","\n"," <script>\n"," const buttonEl =\n"," document.querySelector('#df-b061b4ac-c086-4304-9e17-fe2a649fdb5f button.colab-df-convert');\n"," buttonEl.style.display =\n"," google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n"," async function convertToInteractive(key) {\n"," const element = document.querySelector('#df-b061b4ac-c086-4304-9e17-fe2a649fdb5f');\n"," const dataTable =\n"," await google.colab.kernel.invokeFunction('convertToInteractive',\n"," [key], {});\n"," if (!dataTable) return;\n","\n"," const docLinkHtml = 'Like what you see? Visit the ' +\n"," '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n"," + ' to learn more about interactive tables.';\n"," element.innerHTML = '';\n"," dataTable['output_type'] = 'display_data';\n"," await google.colab.output.renderOutput(dataTable, element);\n"," const docLink = document.createElement('div');\n"," docLink.innerHTML = docLinkHtml;\n"," element.appendChild(docLink);\n"," }\n"," </script>\n"," </div>\n"," </div>\n"," "]},"metadata":{},"execution_count":20}]},{"cell_type":"markdown","source":["Saving the new .csv dataset"],"metadata":{"id":"CR5anOZZYlBe"}},{"cell_type":"code","source":["clean_credits.to_csv('/content/drive/MyDrive/Rec/data/cleaned/clean_credits.csv', index=False)"],"metadata":{"id":"yto7-njpYD7U"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# Keywords dataset"],"metadata":{"id":"emyNitcyZPCr"}},{"cell_type":"code","source":["keywords = pd.read_csv(os.path.join(raw_dir, \"keywords.csv\"))\n","print('shape of raw Keywores dataset: {}'.format(keywords.shape))\n","keywords.head(3)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":161},"id":"4JqG86_-ZKHn","executionInfo":{"status":"ok","timestamp":1688549658847,"user_tz":-210,"elapsed":511,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"7a279461-cc46-4f3b-f211-2a02492658f2"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["shape of raw Keywores dataset: (46419, 2)\n"]},{"output_type":"execute_result","data":{"text/plain":[" id keywords\n","0 862 [{'id': 931, 'name': 'jealousy'}, {'id': 4290,...\n","1 8844 [{'id': 10090, 'name': 'board game'}, {'id': 1...\n","2 15602 [{'id': 1495, 'name': 'fishing'}, {'id': 12392..."],"text/html":["\n"," <div id=\"df-8ece7329-852a-47fe-8d22-9752d988430f\">\n"," <div class=\"colab-df-container\">\n"," <div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>id</th>\n"," <th>keywords</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>862</td>\n"," <td>[{'id': 931, 'name': 'jealousy'}, {'id': 4290,...</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>8844</td>\n"," <td>[{'id': 10090, 'name': 'board game'}, {'id': 1...</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>15602</td>\n"," <td>[{'id': 1495, 'name': 'fishing'}, {'id': 12392...</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>\n"," <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-8ece7329-852a-47fe-8d22-9752d988430f')\"\n"," title=\"Convert this dataframe to an interactive table.\"\n"," style=\"display:none;\">\n"," \n"," <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n"," width=\"24px\">\n"," <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n"," <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n"," </svg>\n"," </button>\n"," \n"," <style>\n"," .colab-df-container {\n"," display:flex;\n"," flex-wrap:wrap;\n"," gap: 12px;\n"," }\n","\n"," .colab-df-convert {\n"," background-color: #E8F0FE;\n"," border: none;\n"," border-radius: 50%;\n"," cursor: pointer;\n"," display: none;\n"," fill: #1967D2;\n"," height: 32px;\n"," padding: 0 0 0 0;\n"," width: 32px;\n"," }\n","\n"," .colab-df-convert:hover {\n"," background-color: #E2EBFA;\n"," box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n"," fill: #174EA6;\n"," }\n","\n"," [theme=dark] .colab-df-convert {\n"," background-color: #3B4455;\n"," fill: #D2E3FC;\n"," }\n","\n"," [theme=dark] .colab-df-convert:hover {\n"," background-color: #434B5C;\n"," box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n"," filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n"," fill: #FFFFFF;\n"," }\n"," </style>\n","\n"," <script>\n"," const buttonEl =\n"," document.querySelector('#df-8ece7329-852a-47fe-8d22-9752d988430f button.colab-df-convert');\n"," buttonEl.style.display =\n"," google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n"," async function convertToInteractive(key) {\n"," const element = document.querySelector('#df-8ece7329-852a-47fe-8d22-9752d988430f');\n"," const dataTable =\n"," await google.colab.kernel.invokeFunction('convertToInteractive',\n"," [key], {});\n"," if (!dataTable) return;\n","\n"," const docLinkHtml = 'Like what you see? Visit the ' +\n"," '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n"," + ' to learn more about interactive tables.';\n"," element.innerHTML = '';\n"," dataTable['output_type'] = 'display_data';\n"," await google.colab.output.renderOutput(dataTable, element);\n"," const docLink = document.createElement('div');\n"," docLink.innerHTML = docLinkHtml;\n"," element.appendChild(docLink);\n"," }\n"," </script>\n"," </div>\n"," </div>\n"," "]},"metadata":{},"execution_count":24}]},{"cell_type":"code","source":["keywords.isna().sum()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"tLkNXoSJZmDE","executionInfo":{"status":"ok","timestamp":1688549694116,"user_tz":-210,"elapsed":486,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"fb4852d3-563a-4833-8674-eeaab7c29bbf"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["id 0\n","keywords 0\n","dtype: int64"]},"metadata":{},"execution_count":25}]},{"cell_type":"code","source":["keywords.isnull().sum()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9tyQTNKPZ5V0","executionInfo":{"status":"ok","timestamp":1688549730364,"user_tz":-210,"elapsed":963,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"9d0fcf3b-3aad-46e8-f36e-2c77038f5b3f"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["id 0\n","keywords 0\n","dtype: int64"]},"metadata":{},"execution_count":26}]},{"cell_type":"code","source":["keywords.nunique()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"u2jgxSs_aB9x","executionInfo":{"status":"ok","timestamp":1688549740316,"user_tz":-210,"elapsed":604,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"ba5dbee0-d701-46c0-d2e8-341d806794ad"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["id 45432\n","keywords 25989\n","dtype: int64"]},"metadata":{},"execution_count":27}]},{"cell_type":"code","source":["keywords.drop_duplicates(inplace=True)\n","print('shape of dataset after dropping duplicates: {}'.format(keywords.shape))"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"BqPLBOeyaEif","executionInfo":{"status":"ok","timestamp":1688549823949,"user_tz":-210,"elapsed":429,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"d7a7d607-69cd-4367-f302-d384bb90bdcd"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["shape of dataset after dropping duplicates: (45432, 2)\n"]}]},{"cell_type":"markdown","source":["## Extracting information from json strings"],"metadata":{"id":"CEea-KSLaqI2"}},{"cell_type":"code","source":["keywords['name_keywords'] = keywords['keywords'].apply(get_text, obj = \"name\")\n","keywords['id_keywords'] = keywords['keywords'].apply(get_text, obj = \"id\")"],"metadata":{"id":"_W1h0U4-aWYX"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Constructing new dataframe and saving that"],"metadata":{"id":"KMGfBLW7a4wi"}},{"cell_type":"code","source":["clean_keywords = keywords.drop([\"keywords\"], axis=1)"],"metadata":{"id":"JUuH5tmxazAW"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Checking the new dataset"],"metadata":{"id":"hwYzBGyjbZMN"}},{"cell_type":"code","source":["print('shape of the cleaned data: {}'.format(clean_keywords.shape))\n","clean_keywords.head(3)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":161},"id":"QsOVt41MbLCz","executionInfo":{"status":"ok","timestamp":1688550078229,"user_tz":-210,"elapsed":575,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"6a400dc8-6ea3-4dca-f034-6ca0f1643fc0"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["shape of the cleaned data: (45432, 3)\n"]},{"output_type":"execute_result","data":{"text/plain":[" id name_keywords \\\n","0 862 jealousy, toy, boy, friendship, friends, rival... \n","1 8844 board game, disappearance, based on children's... \n","2 15602 fishing, best friend, duringcreditsstinger, ol... \n","\n"," id_keywords \n","0 931, 4290, 5202, 6054, 9713, 9823, 165503, 170... \n","1 10090, 10941, 15101, 33467, 158086, 158091 \n","2 1495, 12392, 179431, 208510 "],"text/html":["\n"," <div id=\"df-66979cc2-b808-444f-bd2b-bd46f8759b8c\">\n"," <div class=\"colab-df-container\">\n"," <div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>id</th>\n"," <th>name_keywords</th>\n"," <th>id_keywords</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>862</td>\n"," <td>jealousy, toy, boy, friendship, friends, rival...</td>\n"," <td>931, 4290, 5202, 6054, 9713, 9823, 165503, 170...</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>8844</td>\n"," <td>board game, disappearance, based on children's...</td>\n"," <td>10090, 10941, 15101, 33467, 158086, 158091</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>15602</td>\n"," <td>fishing, best friend, duringcreditsstinger, ol...</td>\n"," <td>1495, 12392, 179431, 208510</td>\n"," </tr>\n"," </tbody>\n","</table>\n","</div>\n"," <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-66979cc2-b808-444f-bd2b-bd46f8759b8c')\"\n"," title=\"Convert this dataframe to an interactive table.\"\n"," style=\"display:none;\">\n"," \n"," <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n"," width=\"24px\">\n"," <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n"," <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n"," </svg>\n"," </button>\n"," \n"," <style>\n"," .colab-df-container {\n"," display:flex;\n"," flex-wrap:wrap;\n"," gap: 12px;\n"," }\n","\n"," .colab-df-convert {\n"," background-color: #E8F0FE;\n"," border: none;\n"," border-radius: 50%;\n"," cursor: pointer;\n"," display: none;\n"," fill: #1967D2;\n"," height: 32px;\n"," padding: 0 0 0 0;\n"," width: 32px;\n"," }\n","\n"," .colab-df-convert:hover {\n"," background-color: #E2EBFA;\n"," box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n"," fill: #174EA6;\n"," }\n","\n"," [theme=dark] .colab-df-convert {\n"," background-color: #3B4455;\n"," fill: #D2E3FC;\n"," }\n","\n"," [theme=dark] .colab-df-convert:hover {\n"," background-color: #434B5C;\n"," box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n"," filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n"," fill: #FFFFFF;\n"," }\n"," </style>\n","\n"," <script>\n"," const buttonEl =\n"," document.querySelector('#df-66979cc2-b808-444f-bd2b-bd46f8759b8c button.colab-df-convert');\n"," buttonEl.style.display =\n"," google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n"," async function convertToInteractive(key) {\n"," const element = document.querySelector('#df-66979cc2-b808-444f-bd2b-bd46f8759b8c');\n"," const dataTable =\n"," await google.colab.kernel.invokeFunction('convertToInteractive',\n"," [key], {});\n"," if (!dataTable) return;\n","\n"," const docLinkHtml = 'Like what you see? Visit the ' +\n"," '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n"," + ' to learn more about interactive tables.';\n"," element.innerHTML = '';\n"," dataTable['output_type'] = 'display_data';\n"," await google.colab.output.renderOutput(dataTable, element);\n"," const docLink = document.createElement('div');\n"," docLink.innerHTML = docLinkHtml;\n"," element.appendChild(docLink);\n"," }\n"," </script>\n"," </div>\n"," </div>\n"," "]},"metadata":{},"execution_count":32}]},{"cell_type":"markdown","source":["Saving the cleaned dataset as a .csv file"],"metadata":{"id":"W0YT8YV3bcf_"}},{"cell_type":"code","source":["clean_keywords.to_csv('/content/drive/MyDrive/Rec/data/cleaned/clean_keywords.csv', index=False)\n"],"metadata":{"id":"M9f5_VeibXC-"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["# Metadata dataset"],"metadata":{"id":"SKlrgI-Ub1SP"}},{"cell_type":"code","source":["metadata = pd.read_csv(os.path.join(raw_dir, 'movies_metadata.csv'))\n","print('shape of the raw metadata dataset: {}'.format(metadata.shape))\n","metadata.head(3)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":567},"id":"MwDtrtVJbvM5","executionInfo":{"status":"ok","timestamp":1688571617483,"user_tz":-210,"elapsed":1283,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"3b0db80d-e8e3-4bdf-dce4-edbfd4addabe"},"execution_count":35,"outputs":[{"output_type":"stream","name":"stdout","text":["shape of the raw metadata dataset: (45466, 24)\n"]},{"output_type":"stream","name":"stderr","text":["<ipython-input-35-d8520c3ee68a>:1: DtypeWarning: Columns (10) have mixed types. Specify dtype option on import or set low_memory=False.\n"," metadata = pd.read_csv(os.path.join(raw_dir, 'movies_metadata.csv'))\n"]},{"output_type":"execute_result","data":{"text/plain":[" adult belongs_to_collection budget \\\n","0 False {'id': 10194, 'name': 'Toy Story Collection', ... 30000000 \n","1 False NaN 65000000 \n","2 False {'id': 119050, 'name': 'Grumpy Old Men Collect... 0 \n","\n"," genres \\\n","0 [{'id': 16, 'name': 'Animation'}, {'id': 35, '... \n","1 [{'id': 12, 'name': 'Adventure'}, {'id': 14, '... \n","2 [{'id': 10749, 'name': 'Romance'}, {'id': 35, ... \n","\n"," homepage id imdb_id original_language \\\n","0 http://toystory.disney.com/toy-story 862 tt0114709 en \n","1 NaN 8844 tt0113497 en \n","2 NaN 15602 tt0113228 en \n","\n"," original_title overview ... \\\n","0 Toy Story Led by Woody, Andy's toys live happily in his ... ... \n","1 Jumanji When siblings Judy and Peter discover an encha... ... \n","2 Grumpier Old Men A family wedding reignites the ancient feud be... ... \n","\n"," release_date revenue runtime \\\n","0 1995-10-30 373554033.0 81.0 \n","1 1995-12-15 262797249.0 104.0 \n","2 1995-12-22 0.0 101.0 \n","\n"," spoken_languages status \\\n","0 [{'iso_639_1': 'en', 'name': 'English'}] Released \n","1 [{'iso_639_1': 'en', 'name': 'English'}, {'iso... Released \n","2 [{'iso_639_1': 'en', 'name': 'English'}] Released \n","\n"," tagline title video \\\n","0 NaN Toy Story False \n","1 Roll the dice and unleash the excitement! Jumanji False \n","2 Still Yelling. Still Fighting. Still Ready for... Grumpier Old Men False \n","\n"," vote_average vote_count \n","0 7.7 5415.0 \n","1 6.9 2413.0 \n","2 6.5 92.0 \n","\n","[3 rows x 24 columns]"],"text/html":["\n"," <div id=\"df-1f24f91a-2b29-4c28-b1e3-65fcc0c08c84\">\n"," <div class=\"colab-df-container\">\n"," <div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>adult</th>\n"," <th>belongs_to_collection</th>\n"," <th>budget</th>\n"," <th>genres</th>\n"," <th>homepage</th>\n"," <th>id</th>\n"," <th>imdb_id</th>\n"," <th>original_language</th>\n"," <th>original_title</th>\n"," <th>overview</th>\n"," <th>...</th>\n"," <th>release_date</th>\n"," <th>revenue</th>\n"," <th>runtime</th>\n"," <th>spoken_languages</th>\n"," <th>status</th>\n"," <th>tagline</th>\n"," <th>title</th>\n"," <th>video</th>\n"," <th>vote_average</th>\n"," <th>vote_count</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>False</td>\n"," <td>{'id': 10194, 'name': 'Toy Story Collection', ...</td>\n"," <td>30000000</td>\n"," <td>[{'id': 16, 'name': 'Animation'}, {'id': 35, '...</td>\n"," <td>http://toystory.disney.com/toy-story</td>\n"," <td>862</td>\n"," <td>tt0114709</td>\n"," <td>en</td>\n"," <td>Toy Story</td>\n"," <td>Led by Woody, Andy's toys live happily in his ...</td>\n"," <td>...</td>\n"," <td>1995-10-30</td>\n"," <td>373554033.0</td>\n"," <td>81.0</td>\n"," <td>[{'iso_639_1': 'en', 'name': 'English'}]</td>\n"," <td>Released</td>\n"," <td>NaN</td>\n"," <td>Toy Story</td>\n"," <td>False</td>\n"," <td>7.7</td>\n"," <td>5415.0</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>False</td>\n"," <td>NaN</td>\n"," <td>65000000</td>\n"," <td>[{'id': 12, 'name': 'Adventure'}, {'id': 14, '...</td>\n"," <td>NaN</td>\n"," <td>8844</td>\n"," <td>tt0113497</td>\n"," <td>en</td>\n"," <td>Jumanji</td>\n"," <td>When siblings Judy and Peter discover an encha...</td>\n"," <td>...</td>\n"," <td>1995-12-15</td>\n"," <td>262797249.0</td>\n"," <td>104.0</td>\n"," <td>[{'iso_639_1': 'en', 'name': 'English'}, {'iso...</td>\n"," <td>Released</td>\n"," <td>Roll the dice and unleash the excitement!</td>\n"," <td>Jumanji</td>\n"," <td>False</td>\n"," <td>6.9</td>\n"," <td>2413.0</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>False</td>\n"," <td>{'id': 119050, 'name': 'Grumpy Old Men Collect...</td>\n"," <td>0</td>\n"," <td>[{'id': 10749, 'name': 'Romance'}, {'id': 35, ...</td>\n"," <td>NaN</td>\n"," <td>15602</td>\n"," <td>tt0113228</td>\n"," <td>en</td>\n"," <td>Grumpier Old Men</td>\n"," <td>A family wedding reignites the ancient feud be...</td>\n"," <td>...</td>\n"," <td>1995-12-22</td>\n"," <td>0.0</td>\n"," <td>101.0</td>\n"," <td>[{'iso_639_1': 'en', 'name': 'English'}]</td>\n"," <td>Released</td>\n"," <td>Still Yelling. Still Fighting. Still Ready for...</td>\n"," <td>Grumpier Old Men</td>\n"," <td>False</td>\n"," <td>6.5</td>\n"," <td>92.0</td>\n"," </tr>\n"," </tbody>\n","</table>\n","<p>3 rows × 24 columns</p>\n","</div>\n"," <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-1f24f91a-2b29-4c28-b1e3-65fcc0c08c84')\"\n"," title=\"Convert this dataframe to an interactive table.\"\n"," style=\"display:none;\">\n"," \n"," <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n"," width=\"24px\">\n"," <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n"," <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n"," </svg>\n"," </button>\n"," \n"," <style>\n"," .colab-df-container {\n"," display:flex;\n"," flex-wrap:wrap;\n"," gap: 12px;\n"," }\n","\n"," .colab-df-convert {\n"," background-color: #E8F0FE;\n"," border: none;\n"," border-radius: 50%;\n"," cursor: pointer;\n"," display: none;\n"," fill: #1967D2;\n"," height: 32px;\n"," padding: 0 0 0 0;\n"," width: 32px;\n"," }\n","\n"," .colab-df-convert:hover {\n"," background-color: #E2EBFA;\n"," box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n"," fill: #174EA6;\n"," }\n","\n"," [theme=dark] .colab-df-convert {\n"," background-color: #3B4455;\n"," fill: #D2E3FC;\n"," }\n","\n"," [theme=dark] .colab-df-convert:hover {\n"," background-color: #434B5C;\n"," box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n"," filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n"," fill: #FFFFFF;\n"," }\n"," </style>\n","\n"," <script>\n"," const buttonEl =\n"," document.querySelector('#df-1f24f91a-2b29-4c28-b1e3-65fcc0c08c84 button.colab-df-convert');\n"," buttonEl.style.display =\n"," google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n"," async function convertToInteractive(key) {\n"," const element = document.querySelector('#df-1f24f91a-2b29-4c28-b1e3-65fcc0c08c84');\n"," const dataTable =\n"," await google.colab.kernel.invokeFunction('convertToInteractive',\n"," [key], {});\n"," if (!dataTable) return;\n","\n"," const docLinkHtml = 'Like what you see? Visit the ' +\n"," '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n"," + ' to learn more about interactive tables.';\n"," element.innerHTML = '';\n"," dataTable['output_type'] = 'display_data';\n"," await google.colab.output.renderOutput(dataTable, element);\n"," const docLink = document.createElement('div');\n"," docLink.innerHTML = docLinkHtml;\n"," element.appendChild(docLink);\n"," }\n"," </script>\n"," </div>\n"," </div>\n"," "]},"metadata":{},"execution_count":35}]},{"cell_type":"code","source":["metadata.isna().sum()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Kt9tI1iydiXd","executionInfo":{"status":"ok","timestamp":1688571624293,"user_tz":-210,"elapsed":398,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"41a87985-be28-49d6-86c1-d86fbe49b2f5"},"execution_count":36,"outputs":[{"output_type":"execute_result","data":{"text/plain":["adult 0\n","belongs_to_collection 40972\n","budget 0\n","genres 0\n","homepage 37684\n","id 0\n","imdb_id 17\n","original_language 11\n","original_title 0\n","overview 954\n","popularity 5\n","poster_path 386\n","production_companies 3\n","production_countries 3\n","release_date 87\n","revenue 6\n","runtime 263\n","spoken_languages 6\n","status 87\n","tagline 25054\n","title 6\n","video 6\n","vote_average 6\n","vote_count 6\n","dtype: int64"]},"metadata":{},"execution_count":36}]},{"cell_type":"code","source":["metadata.isnull().sum()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9ASDp8eTkg4h","executionInfo":{"status":"ok","timestamp":1688571627733,"user_tz":-210,"elapsed":685,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"2751d9b1-f910-4de2-de33-6ff6bee31bd5"},"execution_count":37,"outputs":[{"output_type":"execute_result","data":{"text/plain":["adult 0\n","belongs_to_collection 40972\n","budget 0\n","genres 0\n","homepage 37684\n","id 0\n","imdb_id 17\n","original_language 11\n","original_title 0\n","overview 954\n","popularity 5\n","poster_path 386\n","production_companies 3\n","production_countries 3\n","release_date 87\n","revenue 6\n","runtime 263\n","spoken_languages 6\n","status 87\n","tagline 25054\n","title 6\n","video 6\n","vote_average 6\n","vote_count 6\n","dtype: int64"]},"metadata":{},"execution_count":37}]},{"cell_type":"code","source":["metadata.nunique()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"yYM0Ud3Tlpjw","executionInfo":{"status":"ok","timestamp":1688571629398,"user_tz":-210,"elapsed":363,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"b1aa8de1-0749-466c-8dd9-7a2dae7dcdeb"},"execution_count":38,"outputs":[{"output_type":"execute_result","data":{"text/plain":["adult 5\n","belongs_to_collection 1698\n","budget 1226\n","genres 4069\n","homepage 7673\n","id 45436\n","imdb_id 45417\n","original_language 92\n","original_title 43373\n","overview 44307\n","popularity 44176\n","poster_path 45024\n","production_companies 22708\n","production_countries 2393\n","release_date 17336\n","revenue 6863\n","runtime 353\n","spoken_languages 1931\n","status 6\n","tagline 20283\n","title 42277\n","video 2\n","vote_average 92\n","vote_count 1820\n","dtype: int64"]},"metadata":{},"execution_count":38}]},{"cell_type":"markdown","source":["Histogram of the dataset"],"metadata":{"id":"m7T_-wt1mFvu"}},{"cell_type":"code","source":["metadata.hist(bins=50, figsize=(10, 7))\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":622},"id":"rLGE24QNl17Y","executionInfo":{"status":"ok","timestamp":1688571633442,"user_tz":-210,"elapsed":1657,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"de36782e-7d6f-4664-f10f-36d695f7675c"},"execution_count":39,"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 1000x700 with 4 Axes>"],"image/png":"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97/69ddfVa9ePUlXbgVy+vRppaWlKTw8XJK0ceNG5efnKyIiwuzz4osvKjc31/zjIDk5WXfccYdq165t9klJSdGoUaPM57r6liJFKY/7LzrjnmnX3r/x6mNXBFe879u1XD0HV49fIoeqoiJzsPI8lu9TBQCAKzt37pzS09OVnp4uSTp06JDS09N15MgRnTt3TmPGjNH27dt1+PBhpaSk6JFHHlGzZs3MVWlbtmypBx98UMOHD9fOnTv1xRdfKD4+XgMGDFD9+vUlSU888YS8vLw0bNgw7du3T8uWLdO8efMczjI9++yzWrdunWbNmqUDBw5o8uTJ2rVrF4syAYALoKgCAFRru3btUocOHdShQwdJV+6F2KFDB02cOFEeHh765ptv9Nvf/la33367hg0bpvDwcP3rX/9yOEP04YcfqkWLFurRo4ceeughde3a1eEeVAEBAdqwYYMOHTqk8PBw/elPf9LEiRMd7mV19913a8mSJXrnnXfUrl07ffTRR1q1apVat25dcS8GAKBMmP4HAKjWunfvLsMoerU6SVq/vujrg64WFBSkJUuWlNinbdu2+te//lVin379+qlfv37XfT4AQNXCmSoAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKIKAAAAACygqAIAAAAACyiqAAAAAMACiioAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKIKAAAAACyoUdkBAACA6qHJC2uK3XZ4RnQFRgIAzsWZKgAAAACwgKIKAAAAACygqAIAAAAACyiqAAAAAMACiioAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALChVUTV9+nTdddddqlWrloKDgxUTE6ODBw869Ll06ZLi4uJUp04d+fv7q2/fvsrMzHToc+TIEUVHR8vPz0/BwcEaM2aMLl++7NBn8+bN6tixo7y9vdWsWTMtWrSoUDyJiYlq0qSJfHx8FBERoZ07d5YmHQAAAACwrFRF1ZYtWxQXF6ft27crOTlZubm56tWrl86fP2/2GT16tD799FOtWLFCW7Zs0dGjR9WnTx9ze15e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Z/3hD39Qo0aNtG3bNo0bN07Hjh3T3LlzHfZfuHChLl26pKefflre3t4KCgpSVlaW3nvvPT3++OMaPny4zp49q/fff192u107d+5U+/btJUn5+fl6+OGHtXPnTo0cOVItWrTQP/7xD8XGxhbKc9++fbrnnnt066236oUXXlDNmjW1fPlyxcTE6O9//7seffTRG3q9AABFc8Ux8Ny5c+rWrZu+/fZbPfnkk+rYsaN++eUXffLJJ/rvf/+runXr6uLFi+revbu+//57xcfHKywsTCtWrNCQIUN0+vRpPfvss2V6vfLy8mS32xUREaHXX39dn332mWbNmqWmTZtq5MiRuuWWW/TWW29p5MiRevTRR9WnTx9JUtu2bcv0fKhmDMDFPf7440ZwcLBx+fJls+3YsWOGu7u78dJLLxmGYRjt27c3goODjV9//dXs8/XXXxvu7u7G4MGDzbbXXnvNkGQcOnTI4TkOHz5seHh4GNOmTXNo37Nnj1GjRo1C7SW5dOmSkZeX59B26NAhw9vb24zXMAzj7bffNiQZe/bscejbqlUr44EHHjAfT5061ahZs6bx73//26HfCy+8YHh4eBhHjhwxn0OSYbPZjOPHjzv0vXz5spGdne3QdurUKSMkJMR48sknzba///3vhiRj7ty5ZlteXp7xwAMPGJKMhQsXmu09evQw2rRpY1y6dMlsy8/PN+6++26jefPmJb5GAIAb42pj4MSJEw1Jxscff1xoW35+vmEYhjF37lxDkvHBBx+Y23JycozIyEjD39/fyMrKMgzDMDZt2mRIMjZt2uRwnILx7uoxKTY21pDkMM4ahmF06NDBCA8PNx+fOHHCkGRMmjTphnMCDMMwmP4Hl9e/f38dP37c4fT/Rx99pPz8fPXv31/Hjh1Tenq6hgwZoqCgILNP27Zt1bNnT61du/a6z/Hxxx8rPz9fjz32mH755RfzX2hoqJo3b17kNLnieHt7y939ykcvLy9Pv/76q/z9/XXHHXfoq6++Mvv16dNHNWrU0LJly8y2vXv3av/+/erfv7/ZtmLFCnXr1k21a9d2iC0qKkp5eXnaunWrw/P37dvX/OaxgIeHh7y8vCRdORt18uRJXb58WZ06dXKIad26dfL09NTw4cPNNnd3d8XFxTkc7+TJk9q4caMee+wxnT171ozp119/ld1u13fffaeff/75hl8zAEDRXG0M/Pvf/6527doVOVvBzc1NkrR27VqFhobq8ccfN7d5enrqj3/8o86dO1fkdMcbNWLECIfH3bp1048//ljm4wEFmP4Hl/fggw8qICBAy5YtU48ePSRdmfbQvn173X777dq+fbsk6Y477ii0b8uWLbV+/XqdP39eNWvWLPY5vvvuOxmGoebNmxe53dPT84bjzc/P17x58zR//nwdOnTInMstSXXq1DH/v27duurRo4eWL1+uqVOnmnnVqFHDnJJQENs333xTqFAqcPz4cYfHYWFhRfZbvHixZs2apQMHDig3N7fI/v/5z39Ur149+fn5OezbrFkzh8fff/+9DMPQhAkTNGHChGLjuvXWW4vcBgC4Ma42Bv7www/q27dviX3+85//qHnz5uYXkFfHW7C9LHx8fAqNlbVr19apU6fKdDzgahRVcHne3t6KiYnRypUrNX/+fGVmZuqLL77QK6+84rTnyM/Pl5ubm/75z3/Kw8Oj0HZ/f/8bPtYrr7yiCRMm6Mknn9TUqVMVFBQkd3d3jRo1ymFhCUkaMGCAhg4dqvT0dLVv317Lly9Xjx49zLnuBbH17NlTY8eOLfL5br/9dofHvr6+hfp88MEHGjJkiGJiYjRmzBgFBwfLw8ND06dP1w8//HDDuV0dkyQ999xzstvtRfa5thADAJSeq42BzlRwZutaV39ZebWiYgechaIKN4X+/ftr8eLFSklJ0bfffivDMMwpco0bN5Z0ZdW8ax04cEB169Y1v6Er7hd006ZNZRiGwsLCChUppfXRRx/p/vvv1/vvv+/Qfvr0aYdiSZJiYmL0hz/8wZwC+O9//1vjxo0rFNu5c+cUFRVlKabbbrtNH3/8scNrcO0iGY0bN9amTZt04cIFh7NV33//vUO/2267TdKVby+txAUAuD5XGgObNm1qrkhYnMaNG+ubb75Rfn6+w9mqAwcOmNulK2eZJBW6r1ZZz2RJxb8GwPVwTRVuClFRUQoKCtKyZcu0bNkyde7c2Zy2Vq9ePbVv316LFy92+MW7d+9ebdiwQQ899JDZVjCwXPsLuk+fPvLw8NCUKVNkGIbDNsMw9Ouvv95wrB4eHoWOsWLFiiKvMQoMDJTdbtfy5cu1dOlSeXl5KSYmxqHPY489ptTUVK1fv77Q/qdPn9bly5dvKKaCXArs2LFDqampDv3sdrtyc3P17rvvmm35+flKTEx06BccHKzu3bvr7bff1rFjxwo934kTJ64bEwDgxrjSGNi3b199/fXXWrlyZaFtBcd+6KGHlJGR4XBN8eXLl/XGG2/I39/fXOmwcePG8vDwKHTt8Pz58284nmsVfGFYnW+AjLLhTBVuCp6enurTp4+WLl2q8+fP6/XXX3fY/tprr6l3796KjIzUsGHDzOVkAwICHO4/ER4eLkl68cUXNWDAAHl6eurhhx9W06ZN9fLLL2vcuHE6fPiwYmJiVKtWLR06dEgrV67U008/reeee+6GYv3Nb36jl156SUOHDtXdd9+tPXv26MMPPzTP7lyrf//++v3vf6/58+fLbrcXWrZ2zJgx+uSTT/Sb3/xGQ4YMUXh4uM6fP689e/boo48+0uHDhwudASsqpo8//liPPvqooqOjdejQISUlJalVq1Y6d+6c2S8mJkadO3fWn/70J33//fdq0aKFPvnkE508eVKS4zd8iYmJ6tq1q9q0aaPhw4frtttuU2ZmplJTU/Xf//7X4b5cAICyc6UxcMyYMfroo4/Ur18/PfnkkwoPD9fJkyf1ySefKCkpSe3atdPTTz+tt99+W0OGDFFaWpqaNGmijz76SF988YXmzp2rWrVqSZICAgLUr18/vfHGG3Jzc1PTpk21evXqQtcSl4avr69atWqlZcuW6fbbb1dQUJBat26t1q1bl/mYqCYqY8lBoDwkJycbkgw3Nzfjp59+KrT9s88+M+655x7D19fXsNlsxsMPP2zs37+/UL+pU6cat956q+Hu7l5oadm///3vRteuXY2aNWsaNWvWNFq0aGHExcUZBw8evOE4L126ZPzpT38y6tWrZ/j6+hr33HOPkZqaatx3333GfffdV6h/VlaW4evrW2h52audPXvWGDdunNGsWTPDy8vLqFu3rnH33Xcbr7/+upGTk2MYxv+WmH3ttdcK7Z+fn2+88sorRuPGjQ1vb2+jQ4cOxurVq43Y2FijcePGDn1PnDhhPPHEE0atWrWMgIAAY8iQIcYXX3xhSDKWLl3q0PeHH34wBg8ebISGhhqenp7GrbfeavzmN78xPvrooxt+vQAA1+cqY6BhGMavv/5qxMfHG7feeqvh5eVlNGjQwIiNjTV++eUXs09mZqYxdOhQo27duoaXl5fRpk0bhyXSC5w4ccLo27ev4efnZ9SuXdv4wx/+YOzdu7fIJdVr1qxZaP9JkyYZ1/45vG3bNiM8PNzw8vJieXXcMDfDuOY8LgCU0qpVq/Too4/q888/1z333FPZ4QAAAFQoiioApXLx4kWHFQTz8vLUq1cv7dq1SxkZGUWuLggAAHAz45oqwEkuXryoM2fOlNgnKCjIvMmuq3rmmWd08eJFRUZGKjs7Wx9//LG2bdumV155hYIKAKqp6jIGAsXhTBXgJIsWLdLQoUNL7LNp0yZ17969YgIqJ0uWLNGsWbP0/fff69KlS2rWrJlGjhyp+Pj4yg4NAFBJqssYCBSHogpwkmPHjmnfvn0l9gkPDzfvqwEAwM2CMRDVHUUVAAAAAFjAzX8BAAAAwIJqvVBFfn6+jh49qlq1ajnctBQAcH2GYejs2bOqX7++3N35jq4qYFwDgLKzMq5V66Lq6NGjatiwYWWHAQAu7aefflKDBg0qOwyIcQ0AnKEs41q1Lqpq1aol6coLZ7PZSrVvbm6uNmzYoF69esnT07M8wqtyyLl65CxVz7zJufQ5Z2VlqWHDhubvUlS+6jKuuVKsEvGWJ1eKVXKteF0pVsk58VoZ16p1UVUwNcJms5Vp8PHz85PNZnOJN5ozkHP1yFmqnnmTc9lzZppZ1VFdxjVXilUi3vLkSrFKrhWvK8UqOTfesoxrTIIHAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKIKAAAAACyo1jf/BeA8TV5YU2T74RnRFRwJACtaT16v7DzHG1/yOQaAknGmCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAA/p8ZM2bIzc1No0aNMtsuXbqkuLg41alTR/7+/urbt68yMzMd9jty5Iiio6Pl5+en4OBgjRkzRpcvX3bos3nzZnXs2FHe3t5q1qyZFi1aVOj5ExMT1aRJE/n4+CgiIkI7d+4sjzQBAE5GUQUAgKQvv/xSb7/9ttq2bevQPnr0aH366adasWKFtmzZoqNHj6pPnz7m9ry8PEVHRysnJ0fbtm3T4sWLtWjRIk2cONHsc+jQIUVHR+v+++9Xenq6Ro0apaeeekrr1683+yxbtkwJCQmaNGmSvvrqK7Vr1052u13Hjx8v/+QBAJZQVAEAqr1z585p4MCBevfdd1W7dm2z/cyZM3r//fc1e/ZsPfDAAwoPD9fChQu1bds2bd++XZK0YcMG7d+/Xx988IHat2+v3r17a+rUqUpMTFROTo4kKSkpSWFhYZo1a5Zatmyp+Ph4/e53v9OcOXPM55o9e7aGDx+uoUOHqlWrVkpKSpKfn58WLFhQsS8GAKDUalR2AAAAVLa4uDhFR0crKipKL7/8stmelpam3NxcRUVFmW0tWrRQo0aNlJqaqi5duig1NVVt2rRRSEiI2cdut2vkyJHat2+fOnTooNTUVIdjFPQpmGaYk5OjtLQ0jRs3ztzu7u6uqKgopaamFht3dna2srOzzcdZWVmSpNzcXOXm5pbqNSjo7+1uFLutqiiIp6rFVRziLT+uFKvkWvG6UqySc+K1si9FFQCgWlu6dKm++uorffnll4W2ZWRkyMvLS4GBgQ7tISEhysjIMPtcXVAVbC/YVlKfrKwsXbx4UadOnVJeXl6RfQ4cOFBs7NOnT9eUKVMKtW/YsEF+fn7F7leSqZ3yC7WtXbu2TMcqb8nJyZUdQqkQb/lxpVgl14rXlWKVrMV74cKFMu9b7kXVjBkzNG7cOD377LOaO3eupCsX/f7pT3/S0qVLlZ2dLbvdrvnz5zsMJkeOHNHIkSO1adMm+fv7KzY2VtOnT1eNGv8LefPmzUpISNC+ffvUsGFDjR8/XkOGDCnvlAAAN4mffvpJzz77rJKTk+Xj41PZ4ZTauHHjlJCQYD7OyspSw4YN1atXL9lstlIdKzc3V8nJyZqwy13Z+W4O2/ZOtjslXmcpiLVnz57y9PSs7HCui3jLjyvFKrlWvK4Uq+SceAvO9pdFuRZVJV30u2bNGq1YsUIBAQGKj49Xnz599MUXX0j630W/oaGh2rZtm44dO6bBgwfL09NTr7zyiqT/XfQ7YsQIffjhh0pJSdFTTz2levXqyW6vWr/8AQBVU1pamo4fP66OHTuabXl5edq6davefPNNrV+/Xjk5OTp9+rTD2arMzEyFhoZKkkJDQwut0lewOuDVfa5dMTAzM1M2m02+vr7y8PCQh4dHkX0KjlEUb29veXt7F2r39PQs8x8V2fluys5zLKqq6h9UVvKsDMRbflwpVsm14nWlWCVr8VrJs9wWqqgKF/0CAFCSHj16aM+ePUpPTzf/derUSQMHDjT/39PTUykpKeY+Bw8e1JEjRxQZGSlJioyM1J49exxW6UtOTpbNZlOrVq3MPlcfo6BPwTG8vLwUHh7u0Cc/P18pKSlmHwBA1VVuZ6oq+6LfopTHBb2ucvGeM5Bz9VGWvL09Cl/cXtpjVKbq+LO2mvPN8FrVqlVLrVu3dmirWbOm6tSpY7YPGzZMCQkJCgoKks1m0zPPPKPIyEh16dJFktSrVy+1atVKgwYN0syZM5WRkaHx48crLi7OPIs0YsQIvfnmmxo7dqyefPJJbdy4UcuXL9eaNWvM501ISFBsbKw6deqkzp07a+7cuTp//ryGDh1aQa8GAKCsyqWoqgoX/fr6+hZ67vK4oNfVLt5zBnKuPkqT98zORbdX1Qvci1Mdf9ZlzdnKBb2uZM6cOXJ3d1ffvn0drgMu4OHhodWrV2vkyJGKjIxUzZo1FRsbq5deesnsExYWpjVr1mj06NGaN2+eGjRooPfee89hunr//v114sQJTZw4URkZGWrfvr3WrVtXaKwDAFQ9Ti+qqvJFv+VxQa+rXLznDORcPXKWypZ368nri2yvahe4F6c6/qyt5mzlgt6qbPPmzQ6PfXx8lJiYqMTExGL3ady48XW/QOjevbt2795dYp/4+HjFx8ffcKwAgKrB6UVVVbnotyjlcUGvq1285wzkXH2UJu9rL2y/+hiupDr+rMuac3V7nQAAKI7TF6qoKhf9AgAAAEBFcPqZqqp00S8AAAAAlLdyv/lvUSrqol8AAAAAKG8VUlRV5kW/AAAAAFCeyu3mvwAAAABQHVBUAQAAAIAFFFUAAAAAYAFFFQAAAABYQFEFAAAAABZQVAEAAACABZVynyoArqH15PXKznNzaDs8I7qSogEAAKiaOFMFAAAAABZQVAEAAACABRRVAAAAAGABRRUAAAAAWEBRBQAAAAAWUFQBAAAAgAUUVQAAAABgAUUVAAAAAFhAUQUAAAAAFlBUAQAAAIAFFFUAAAAAYAFFFQAAAABYQFEFAAAAABZQVAEAAACABRRVAAAAAGABRRUAAAAAWEBRBQAAAAAWUFQBAAAAgAUUVQAAAABgAUUVAAAAAFhAUQUAAAAAFlBUAQAAAIAFNSo7AADO0+SFNUW2H54RXcGRAAAAVB+cqQIAAAAACyiqAAAAAMACiioAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAEC19dZbb6lt27ay2Wyy2WyKjIzUP//5T3P7pUuXFBcXpzp16sjf3199+/ZVZmamwzGOHDmi6Oho+fn5KTg4WGPGjNHly5cd+mzevFkdO3aUt7e3mjVrpkWLFhWKJTExUU2aNJGPj48iIiK0c+fOcskZAOB8FFUAgGqrQYMGmjFjhtLS0rRr1y498MADeuSRR7Rv3z5J0ujRo/Xpp59qxYoV2rJli44ePao+ffqY++fl5Sk6Olo5OTnatm2bFi9erEWLFmnixIlmn0OHDik6Olr333+/0tPTNWrUKD311FNav3692WfZsmVKSEjQpEmT9NVXX6ldu3ay2+06fvx4xb0YAIAyo6gCAFRbDz/8sB566CE1b95ct99+u6ZNmyZ/f39t375dZ86c0fvvv6/Zs2frgQceUHh4uBYuXKht27Zp+/btkqQNGzZo//79+uCDD9S+fXv17t1bU6dOVWJionJyciRJSUlJCgsL06xZs9SyZUvFx8frd7/7nebMmWPGMXv2bA0fPlxDhw5Vq1atlJSUJD8/Py1YsKBSXhcAQOlQVAEAoCtnnZYuXarz588rMjJSaWlpys3NVVRUlNmnRYsWatSokVJTUyVJqampatOmjUJCQsw+drtdWVlZ5tmu1NRUh2MU9Ck4Rk5OjtLS0hz6uLu7KyoqyuwDAKjaajj7gG+99ZbeeustHT58WJJ05513auLEierdu7ekK/PT//SnP2np0qXKzs6W3W7X/PnzHQakI0eOaOTIkdq0aZP8/f0VGxur6dOnq0aN/4W7efNmJSQkaN++fWrYsKHGjx+vIUOGODsdAMBNbs+ePYqMjNSlS5fk7++vlStXqlWrVkpPT5eXl5cCAwMd+oeEhCgjI0OSlJGR4TB+FWwv2FZSn6ysLF28eFGnTp1SXl5ekX0OHDhQYuzZ2dnKzs42H2dlZUmScnNzlZube4OvgMx9JMnb3Sh2W1VREE9Vi6s4xFt+XClWybXidaVYJefEa2VfpxdVBfPTmzdvLsMwtHjxYj3yyCPavXu37rzzTo0ePVpr1qzRihUrFBAQoPj4ePXp00dffPGFpP/NTw8NDdW2bdt07NgxDR48WJ6ennrllVck/W9++ogRI/Thhx8qJSVFTz31lOrVqye73e7slAAAN7E77rhD6enpOnPmjD766CPFxsZqy5YtlR3WDZk+fbqmTJlSqH3Dhg3y8/Mr0zGndsov1LZ27doyHau8JScnV3YIpUK85ceVYpVcK15XilWyFu+FCxfKvK/Ti6qHH37Y4fG0adP01ltvafv27WrQoIHef/99LVmyRA888IAkaeHChWrZsqW2b9+uLl26mPPTP/vsM4WEhKh9+/aaOnWqnn/+eU2ePFleXl4O89MlqWXLlvr88881Z84ciioAQKl4eXmpWbNmkqTw8HB9+eWXmjdvnvr376+cnBydPn3a4WxVZmamQkNDJUmhoaGFVukrWB3w6j7XrhiYmZkpm80mX19feXh4yMPDo8g+Bccozrhx45SQkGA+zsrKUsOGDdWrVy/ZbLZSvApXvqFNTk7WhF3uys53c9i2d3LVGlsLYu3Zs6c8PT0rO5zrIt7y40qxSq4VryvFKjkn3oKz/WXh9KLqanl5eVqxYsUNz0/v0qVLsfPTR44cqX379qlDhw7Fzk8fNWpUeaYDAKgG8vPzlZ2drfDwcHl6eiolJUV9+/aVJB08eFBHjhxRZGSkJCkyMlLTpk3T8ePHFRwcLOnKt6Q2m02tWrUy+1x7pic5Odk8hpeXl8LDw5WSkqKYmBgzhpSUFMXHx5cYq7e3t7y9vQu1e3p6lvmPiux8N2XnORZVVfUPKit5VgbiLT+uFKvkWvG6UqyStXit5FkuRVVlz0/39fUtMq7ymHvuKvNMnYGcqz5vj8LXQkilj78s11Y467kri6v9rJ3Bas43w2s1btw49e7dW40aNdLZs2e1ZMkSbd68WevXr1dAQICGDRumhIQEBQUFyWaz6ZlnnlFkZKS6dOkiSerVq5datWqlQYMGaebMmcrIyND48eMVFxdnFjsjRozQm2++qbFjx+rJJ5/Uxo0btXz5cq1Zs8aMIyEhQbGxserUqZM6d+6suXPn6vz58xo6dGilvC4AgNIpl6Kqqs5PL4+55642z9QZyLnqmtm56PayXg9RmmsrnP3clcVVftbOVNacrcw9ryqOHz+uwYMH69ixYwoICFDbtm21fv169ezZU5I0Z84cubu7q2/fvg6LKxXw8PDQ6tWrNXLkSEVGRqpmzZqKjY3VSy+9ZPYJCwvTmjVrNHr0aM2bN08NGjTQe++95zBdvX///jpx4oQmTpyojIwMtW/fXuvWrSv0BSIAoGoql6KqsuenF6e6zj13FlebW+sMrpZz68nri2wv7XuyLO9vZz13ZXG1n7UzWM3ZytzzquL9998vcbuPj48SExOVmJhYbJ/GjRtf98uD7t27a/fu3SX2iY+Pv+50PwBA1VSu11QVqOj56cWp7nPPncXV5tY6g6vkfO17sUBFvL+d/dyVxVV+1s5U1pyr2+sEAEBxnF5UVZX56QAAAABQEZxeVFWV+ekAAAAAUBGcXlRVpfnpAAAAAFDe3Cs7AAAAAABwZRWyUAWAm0eTF7h2EQAA4GqcqQIAAAAACyiqAAAAAMACiioAAAAAsICiCgAAAAAsYKEKAFVKcQthHJ4RXcGRAAAA3BjOVAEAAACABRRVAAAAAGABRRUAAAAAWEBRBQAAAAAWsFAFgHLFwhMAAOBmR1EFVGEUJAAAAFUf0/8AAAAAwAKKKgAAAACwgKIKAAAAACygqAIAAAAACyiqAAAAAMACiioAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKhR2QEAKH9NXlhT7LbDM6IrMBIAAICbD2eqAAAAAMACiioAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKIKAAAAACygqAIAAAAACyiqAAAAAMACiioAQLU1ffp03XXXXapVq5aCg4MVExOjgwcPOvS5dOmS4uLiVKdOHfn7+6tv377KzMx06HPkyBFFR0fLz89PwcHBGjNmjC5fvuzQZ/PmzerYsaO8vb3VrFkzLVq0qFA8iYmJatKkiXx8fBQREaGdO3c6PWcAgPNRVAEAqq0tW7YoLi5O27dvV3JysnJzc9WrVy+dP3/e7DN69Gh9+umnWrFihbZs2aKjR4+qT58+5va8vDxFR0crJydH27Zt0+LFi7Vo0SJNnDjR7HPo0CFFR0fr/vvvV3p6ukaNGqWnnnpK69evN/ssW7ZMCQkJmjRpkr766iu1a9dOdrtdx48fr5gXAwBQZjUqOwAAACrLunXrHB4vWrRIwcHBSktL07333qszZ87o/fff15IlS/TAAw9IkhYuXKiWLVtq+/bt6tKlizZs2KD9+/frs88+U0hIiNq3b6+pU6fq+eef1+TJk+Xl5aWkpCSFhYVp1qxZkqSWLVvq888/15w5c2S32yVJs2fP1vDhwzV06FBJUlJSktasWaMFCxbohRdeqMBXBQBQWk4/U1XVplIAAHCjzpw5I0kKCgqSJKWlpSk3N1dRUVFmnxYtWqhRo0ZKTU2VJKWmpqpNmzYKCQkx+9jtdmVlZWnfvn1mn6uPUdCn4Bg5OTlKS0tz6OPu7q6oqCizDwCg6nL6maqCqRR33XWXLl++rP/7v/9Tr169tH//ftWsWVPSlakUa9as0YoVKxQQEKD4+Hj16dNHX3zxhaT/TaUIDQ3Vtm3bdOzYMQ0ePFienp565ZVXJP1vKsWIESP04YcfKiUlRU899ZTq1atnfusHAMCNys/P16hRo3TPPfeodevWkqSMjAx5eXkpMDDQoW9ISIgyMjLMPlcXVAXbC7aV1CcrK0sXL17UqVOnlJeXV2SfAwcOFBtzdna2srOzzcdZWVmSpNzcXOXm5t5o6uY+kuTtbhS7raooiKeqxVUc4i0/rhSr5FrxulKsknPitbKv04uqqjSVAgCAGxUXF6e9e/fq888/r+xQbtj06dM1ZcqUQu0bNmyQn59fmY45tVN+oba1a9eW6VjlLTk5ubJDKBXiLT+uFKvkWvG6UqyStXgvXLhQ5n3L/Zqq0k6l6NKlS7FTKUaOHKl9+/apQ4cOxU6lGDVqVLGxVNdv9JzF1b6xcIbKztnbo/D7Syo+nuL6l6SoY5X0/naW0uZQ0s+g9eT1RbbvnXzjX7BU9s+6MljN+WZ6reLj47V69Wpt3bpVDRo0MNtDQ0OVk5Oj06dPO5ytyszMVGhoqNnn2lX6Cqa0X93n2mnumZmZstls8vX1lYeHhzw8PIrsU3CMoowbN04JCQnm46ysLDVs2FC9evWSzWYrxStw5eeZnJysCbvclZ3v5rCtNJ+lilAQa8+ePeXp6VnZ4VwX8ZYfV4pVcq14XSlWyTnxFtQGZVGuRVVlTqXw9fUtFE91/0bPWVztGwtnqKycZ3Yuur2491hx/UtS0vu1qPe3s5Q2h5LiLMs+xeH9feOsfKNXVRiGoWeeeUYrV67U5s2bFRYW5rA9PDxcnp6eSklJUd++fSVJBw8e1JEjRxQZGSlJioyM1LRp03T8+HEFBwdLuvKa2mw2tWrVyuxz7fsxOTnZPIaXl5fCw8OVkpKimJgYSVfG0JSUFMXHxxcbv7e3t7y9vQu1e3p6lvmPiux8N2XnORZVVfUPKit5VgbiLT+uFKvkWvG6UqyStXit5FmuRVVVm0pRXb/RcxZX+8bCGSo759KegSmuf0mKOlZJ729nKW0OJX2unHWmivd36Vj5Rq+qiIuL05IlS/SPf/xDtWrVMr+4CwgIkK+vrwICAjRs2DAlJCQoKChINptNzzzzjCIjI9WlSxdJUq9evdSqVSsNGjRIM2fOVEZGhsaPH6+4uDiz4BkxYoTefPNNjR07Vk8++aQ2btyo5cuXa82aNWYsCQkJio2NVadOndS5c2fNnTtX58+fN1cDBABUXeVWVFX2VIqiVPdv9JzF1b6xcIbKyvna91aB4mIprn9JSsqrqPe3s5Q2hxLjLMM+JcXF+/vG93N1b731liSpe/fuDu0LFy7UkCFDJElz5syRu7u7+vbtq+zsbNntds2fP9/s6+HhodWrV2vkyJGKjIxUzZo1FRsbq5deesnsExYWpjVr1mj06NGaN2+eGjRooPfee8/hGuD+/fvrxIkTmjhxojIyMtS+fXutW7eu0KwMAEDV4/SiqqpMpQAA4HoM4/rXDfr4+CgxMVGJiYnF9mncuPF1p5t2795du3fvLrFPfHx8idP9AABVk9OLqqo0lQIAAAAAypvTb/771ltv6cyZM+revbvq1atn/lu2bJnZZ86cOfrNb36jvn376t5771VoaKg+/vhjc3vBVAoPDw9FRkbq97//vQYPHlzkVIrk5GS1a9dOs2bNKjSVAgAAAADKW7lM/7ueipxKAQAAAADlyelnqgAAAACgOqGoAgAAAAALKKoAAAAAwIJyvfkvADhLkxdY2RMAAFRNnKkCAAAAAAs4UwW4IM7aAAAAVB2cqQIAAAAACyiqAAAAAMACiioAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKIKAAAAACygqAIAAAAACyiqAAAAAMACiioAAAAAsICiCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKIKAAAAACyoUdkBADejJi+sKbL98IzoCo4EAAAA5Y0zVQAAAABgAUUVAAAAAFhAUQUAAAAAFlBUAQAAAIAFLFQBVHNFLarh7WFoZudKCAYAAMAFcaYKAAAAACygqAIAAAAACyiqAAAAAMACiiqgAjV5YU2R/wBUnq1bt+rhhx9W/fr15ebmplWrVjlsNwxDEydOVL169eTr66uoqCh99913Dn1OnjypgQMHymazKTAwUMOGDdO5c+cc+nzzzTfq1q2bfHx81LBhQ82cObNQLCtWrFCLFi3k4+OjNm3aaO3atU7PFwDgfE4vqqrS4AQAwPWcP39e7dq1U2JiYpHbZ86cqT//+c9KSkrSjh07VLNmTdntdl26dMnsM3DgQO3bt0/JyclavXq1tm7dqqefftrcnpWVpV69eqlx48ZKS0vTa6+9psmTJ+udd94x+2zbtk2PP/64hg0bpt27dysmJkYxMTHau3dv+SUPAHAKpxdVVWVwAgDgRvTu3Vsvv/yyHn300ULbDMPQ3LlzNX78eD3yyCNq27at/vKXv+jo0aPml4bffvut1q1bp/fee08RERHq2rWr3njjDS1dulRHjx6VJH344YfKycnRggULdOedd2rAgAH64x//qNmzZ5vPNW/ePD344IMaM2aMWrZsqalTp6pjx4568803K+R1AACUndOXVO/du7d69+5d5LZrBydJ+stf/qKQkBCtWrVKAwYMMAenL7/8Up06dZIkvfHGG3rooYf0+uuvq379+g6Dk5eXl+68806lp6dr9uzZDsUXAABWHDp0SBkZGYqKijLbAgICFBERodTUVA0YMECpqakKDAw0xyxJioqKkru7u3bs2KFHH31Uqampuvfee+Xl5WX2sdvtevXVV3Xq1CnVrl1bqampSkhIcHh+u91eaMbH1bKzs5WdnW0+zsrKkiTl5uYqNze3VLkW9Pd2N4rdVlUUxFPV4ioO8ZYfV4pVcq14XSlWyTnxWtm3Qu9TVZGDE4CqjWvJ4AoyMjIkSSEhIQ7tISEh5raMjAwFBwc7bK9Ro4aCgoIc+oSFhRU6RsG22rVrKyMjo8TnKcr06dM1ZcqUQu0bNmyQn5/fjaRYyNRO+YXaquq1XcnJyZUdQqkQb/lxpVgl14rXlWKVrMV74cKFMu9boUVVRQ5ORamu3+g5i6t9Y+EMZc3Z26Pw++JGnsfqcZyl4H1d1PvblZTm51bQN/yldcrOd3PYtney3alxVRVWP9PV6XdBVTVu3DiHs1tZWVlq2LChevXqJZvNVqpj5ebmKjk5WRN2uVf5z0BBrD179pSnp2dlh3NdxFt+XClWybXidaVYJefEW1AblEWFFlWVrbp/o+csrvaNhTOUNueZnUt3/OLeM6U9jrMV9f52JWX5LPKZvnFWvtFzFaGhoZKkzMxM1atXz2zPzMxU+/btzT7Hjx932O/y5cs6efKkuX9oaKgyMzMd+hQ8vl6fgu1F8fb2lre3d6F2T0/PMv9RkZ3vpuw8x6Kqqv5BZSXPykC85ceVYpVcK15XilWyFq+VPCu0qKrIwako1fUbPWdxtW8snKGsObeevL5Uz1Pce6a0x3EWb3dDUzvlF/n+diWl+SzymS79Z9rKN3quIiwsTKGhoUpJSTHHqaysLO3YsUMjR46UJEVGRur06dNKS0tTeHi4JGnjxo3Kz89XRESE2efFF19Ubm6u+VonJyfrjjvuMGdXREZGKiUlRaNGjTKfPzk5WZGRkRWULQCgrCq0qKrIwako1f0bPWdxtW8snKG0OV/7nriR4zvjOM5W1PvblZTlfcpnunT73QzOnTun77//3nx86NAhpaenKygoSI0aNdKoUaP08ssvq3nz5goLC9OECRNUv359xcTESJJatmypBx98UMOHD1dSUpJyc3MVHx+vAQMGqH79+pKkJ554QlOmTNGwYcP0/PPPa+/evZo3b57mzJljPu+zzz6r++67T7NmzVJ0dLSWLl2qXbt2sbItALgApy+pfu7cOaWnpys9PV3S/wanI0eOyM3NzRycPvnkE+3Zs0eDBw8udnDauXOnvvjiiyIHJy8vLw0bNkz79u3TsmXLNG/evEKrJgEAcD27du1Shw4d1KFDB0lSQkKCOnTooIkTJ0qSxo4dq2eeeUZPP/207rrrLp07d07r1q2Tj4+PeYwPP/xQLVq0UI8ePfTQQw+pa9euDsVQQECANmzYoEOHDik8PFx/+tOfNHHiRIcVa++++24tWbJE77zzjtq1a6ePPvpIq1atUuvWrSvolQAAlJXTz1Tt2rVL999/v/m4oNCJjY3VokWLNHbsWJ0/f15PP/20Tp8+ra5duxY5OMXHx6tHjx5yd3dX37599ec//9ncXjA4xcXFKTw8XHXr1i00OAHO1Hry+iLP2ByeEV0J0QBwpu7du8swil+Uxc3NTS+99JJeeumlYvsEBQVpyZIlJT5P27Zt9a9//avEPv369VO/fv1KDhgAUOU4vaiqSoMTAAAAAJS3arX6H4Dqpbh7YXGGEQAAOJPTr6kCAAAAgOqEogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKIKAAAAACygqAIAAAAACyiqAAAAAMACbv4LWFDczWUBAABQfXCmCgAAAAAsoKgCAAAAAAsoqgAAAADAAooqAAAAALCAogoAAAAALKCoAgAAAAALKKoAAAAAwAKKKgAAAACwgJv/otop7oa9h2dEV3AkAAAAuBlQVAFVQHGFHgAAAKo+pv8BAAAAgAUUVQAAAABgAUUVAAAAAFhAUQUAAAAAFlBUAQAAAIAFFFUAAAAAYAFFFQAAAABYQFEFAAAAABZQVAEAAACABTUqOwDgRjV5YU2p+h+eEV1OkQAAAAD/w5kqAAAAALCAogoAAAAALGD6H25apZ0uCAAAAJQFZ6oAAAAAwALOVAGodoo6i+ntYWhmZ+vHkVgkBQCA6oaiCvh/nPWHNlAV8f4GAKD8MP0PAAAAACzgTBUAXEdFLHrCVEIAAFwXRRVKrfXk9crOc3NoK8sffvwRCQCugd/XAFAyiiqUK5Y1BwAAwM2OospF8a0hAAAAUDW4/EIViYmJatKkiXx8fBQREaGdO3dWdkjVUpMX1hT5DwBQOoxrAOB6XPpM1bJly5SQkKCkpCRFRERo7ty5stvtOnjwoIKDgys7PADVFGeSUVauNq7xXgeAK1y6qJo9e7aGDx+uoUOHSpKSkpK0Zs0aLViwQC+88EIlR4ey4gwXbla8t3E9N8u4RrEFoLpx2aIqJydHaWlpGjdunNnm7u6uqKgopaamFrlPdna2srOzzcdnzpyRJJ08eVK5ubmlev7c3FxduHBBNXLdlZfvuBLer7/+WqpjlUWNy+eLbG/23PJye05vd0PjO+QXmfPNqka+oQsXqlfOUvXMu6rmXNrP9I5xPYpsL+p3RkHOv/76qzw9PUsd29mzZyVJhmGUel8UVpXHNWcpyxhV1Hu6INayvncrGvGWH1eKVXKteF0pVsk58VoZ11y2qPrll1+Ul5enkJAQh/aQkBAdOHCgyH2mT5+uKVOmFGoPCwtzamx1Zzn1cFXKE5UdQCWojjlL1TPvmyHn0v7+cUbOZ8+eVUBAgBOOVL1V5XGtMt3MYyqAqqks45rLFlVlMW7cOCUkJJiP8/PzdfLkSdWpU0dubqX7Vi4rK0sNGzbUTz/9JJvN5uxQqyRyrh45S9Uzb3Iufc6GYejs2bOqX79+OUSHG1FdxzVXilUi3vLkSrFKrhWvK8UqOSdeK+OayxZVdevWlYeHhzIzMx3aMzMzFRoaWuQ+3t7e8vb2dmgLDAy0FIfNZnOJN5ozkXP1UR3zJufS4QyV8zCulZ4rxSoRb3lypVgl14rXlWKVrMdb1nHNZZdU9/LyUnh4uFJSUsy2/Px8paSkKDIyshIjAwCg9BjXAMB1ueyZKklKSEhQbGysOnXqpM6dO2vu3Lk6f/68uWoSAACuhHENAFyTSxdV/fv314kTJzRx4kRlZGSoffv2WrduXaGLfMuDt7e3Jk2aVGjaxc2MnKuP6pg3OaMqYFy7Ma4Uq0S85cmVYpVcK15XilWq/HjdDNbCBQAAAIAyc9lrqgAAAACgKqCoAgAAAAALKKoAAAAAwAKKKgAAAACwgKKqDBITE9WkSRP5+PgoIiJCO3furOyQytX06dN11113qVatWgoODlZMTIwOHjxY2WFVqBkzZsjNzU2jRo2q7FDK1c8//6zf//73qlOnjnx9fdWmTRvt2rWrssMqV3l5eZowYYLCwsLk6+urpk2baurUqbqZ1vDZunWrHn74YdWvX19ubm5atWqVw3bDMDRx4kTVq1dPvr6+ioqK0nfffVc5waJSVMa4diNjy6VLlxQXF6c6derI399fffv2LXRz5CNHjig6Olp+fn4KDg7WmDFjdPnyZYc+mzdvVseOHeXt7a1mzZpp0aJFlmIvakyoarFe7/f5jXzuT548qYEDB8pmsykwMFDDhg3TuXPnHPp888036tatm3x8fNSwYUPNnDmz1LHeyO/hyorXGb8/nRXXihUr1KJFC/n4+KhNmzZau3ZtqeLNzc3V888/rzZt2qhmzZqqX7++Bg8erKNHj1ZKvNd7ba82YsQIubm5ae7cuZUS6w0xUCpLly41vLy8jAULFhj79u0zhg8fbgQGBhqZmZmVHVq5sdvtxsKFC429e/ca6enpxkMPPWQ0atTIOHfuXGWHViF27txpNGnSxGjbtq3x7LPPVnY45ebkyZNG48aNjSFDhhg7duwwfvzxR2P9+vXG999/X9mhlatp06YZderUMVavXm0cOnTIWLFiheHv72/MmzevskNzmrVr1xovvvii8fHHHxuSjJUrVzpsnzFjhhEQEGCsWrXK+Prrr43f/va3RlhYmHHx4sXKCRgVqrLGtRsZW0aMGGE0bNjQSElJMXbt2mV0+f/bu5OYprooDuAHWlohBkHRVjB1iAMKRpEGvqrRhY1oSDSaOBBCiC6cMI7B2bhyNho1isNCFw6oicZZg4ADpiJWqlQQTVQcYiUOpSQOIP1/C9MXH4JtbXnvieeXdGHvDfz77D2nNy23//2H4cOHC+Pfv39HYmIizGYzysvLcenSJcTExGDlypXCnGfPniEiIgJLlixBZWUldu/eDZVKhStXrvxR7tZ6gpKy+lLPfVn348aNw5AhQ3Dnzh3cunULffv2RUZGhjBeV1cHnU6HzMxM2O12HD9+HOHh4di/f79feX2pw3LlDUb9DEau27dvQ6VSYcuWLaisrMSaNWsQFhaGiooKn/M6nU6YzWacOHECjx8/hsViQUpKCpKTk0U/Q6q83q6tx+nTpzFkyBDExsZix44dsmT1BW+q/JSSkoKcnBzh301NTYiNjcXGjRtlTCWt2tpaEBFu3Lghd5Q2V19fj379+qGgoACjR49u15uq5cuXY+TIkXLHkFx6ejpmzpwpum/y5MnIzMyUKVHbat643G439Ho9tm7dKtzndDqh1Wpx/PhxGRIyqSmlrzXvLU6nE2FhYTh16pQwp6qqCkQEi8UC4MeLstDQUDgcDmFOXl4eIiMj8e3bNwDAsmXLkJCQIPpd06ZNQ1pamt8ZW+sJSsvqrZ77su4rKytBRCgrKxPmXL58GSEhIXjz5g0AYO/evYiOjhbye373gAED/MrrrQ4rJe+f1M9g5Zo6dSrS09NFeVJTUzF79myf87bk7t27ICLU1NTImre1rK9fv0ZcXBzsdjt69uwp2lTJeW1bwh//80NDQwNZrVYym83CfaGhoWQ2m8lisciYTFp1dXVERNS5c2eZk7S9nJwcSk9PF/2ft1fnzp0jo9FIU6ZMoW7dulFSUhIdPHhQ7lhtbvjw4VRYWEhPnjwhIqIHDx5QSUkJjR8/XuZk0nj+/Dk5HA7Rc7xTp06Umpr6T9W1f5WS+lrz3mK1WqmxsVGULT4+ngwGg5DNYrHQ4MGDRV+OnJaWRi6Xix49eiTMaV7D09LS/ujxtdYTlJbVWz33Zd1bLBaKiooio9EozDGbzRQaGkqlpaXCnFGjRpFGoxHlra6upk+fPvmc11sdVlpeDylzBfN5/LO6ujoKCQmhqKgoxeV1u92UlZVFubm5lJCQ8Mu4krISEan9mv2Pe//+PTU1Nf3yzfY6nY4eP34sUyppud1uWrRoEY0YMYISExPljtOm8vPz6f79+1RWViZ3FEk8e/aM8vLyaMmSJbRq1SoqKyujBQsWkEajoezsbLnjtZkVK1aQy+Wi+Ph4UqlU1NTUROvXr6fMzEy5o0nC4XAQEbVY1zxjrP1SSl9rqbc4HA7SaDTCi72fs3memw6Ho8XsnrHfzXG5XPTlyxcKDw/3KePveoLSsnqr576se4fDQd26dRONq9Vq6ty5s2hO7969W31M0dHRPuX1VoeVltdDylytPTcCqdNfv36l5cuXU0ZGBkVGRiou7+bNm0mtVtOCBQtaHFdSViLeVDE/5eTkkN1up5KSErmjtKlXr17RwoULqaCggDp06CB3HEm43W4yGo20YcMGIiJKSkoiu91O+/bta9ebqpMnT9LRo0fp2LFjlJCQQDabjRYtWkSxsbHt+nEzpiRK7y1/W0/42+o512HpNTY20tSpUwkA5eXlyR3nF1arlXbu3En379+nkJAQueP4hD/+54eYmBhSqVS/nObz7t070uv1MqWSzvz58+nChQtUXFxMPXr0kDtOm7JarVRbW0vDhg0jtVpNarWabty4Qbt27SK1Wk1NTU1yRwy67t2706BBg0T3DRw4kF6+fClTImnk5ubSihUraPr06TR48GDKysqixYsX08aNG+WOJglP7fpX69q/Tgl9rbXeotfrqaGhgZxOZ6vZ9Hp9i9k9Y7+bExkZ6fM7P956gk6nU0xWIu/13Jd1r9frqba2VjT+/ft3+vjxo1+PyRfe6rDS8npImau1OX+S27OhqqmpoYKCAuFdKiXlvXXrFtXW1pLBYBDWXE1NDS1dupR69eqlqKwevKnyg0ajoeTkZCosLBTuc7vdVFhYSCaTScZkbQsAzZ8/n86cOUNFRUW/vI3aHo0ZM4YqKirIZrMJN6PRSJmZmWSz2UilUskdMehGjBjxy3HGT548oZ49e8qUSBqfP3+m0FBxKVSpVOR2u2VKJK3evXuTXq8X1TWXy0WlpaXtuq6xH+Tsa956S3JyMoWFhYmyVVdX08uXL4VsJpOJKioqRC+sPC8SPZsKk8kk+hmeOf48Pm89wWg0KiYrkfd67su6N5lM5HQ6yWq1CnOKiorI7XZTamqqMOfmzZvU2NgoyjtgwAC/PkrnrQ4rLa+HlLmC9dzwbKiePn1K165doy5duojGlZI3KyuLHj58KFpzsbGxlJubS1evXlVUVoFfx1ow5OfnQ6vV4vDhw6isrMSsWbMQFRUlOs2nvZk7dy46deqE69ev4+3bt8Lt8+fPckeTVHs//e/u3btQq9VYv349nj59iqNHjyIiIgJHjhyRO1qbys7ORlxcnHCU7+nTpxETE4Nly5bJHS1o6uvrUV5ejvLychARtm/fjvLycuG0p02bNiEqKgpnz57Fw4cPMXHiRD5S/R8iV1/zpbfMmTMHBoMBRUVFuHfvHkwmE0wmkzDuOaZ87NixsNlsuHLlCrp27driMeW5ubmoqqrCnj17AjpS3aN5T1BSVl/quS/rfty4cUhKSkJpaSlKSkrQr18/0XHVTqcTOp0OWVlZsNvtyM/PR0REhN9HqvtSh+XKG4z6GYxct2/fhlqtxrZt21BVVYV169a1eOz37/I2NDRgwoQJ6NGjB2w2m2jd/Xw6nlR5vV3b5pqf/if1tfWGN1V/YPfu3TAYDNBoNEhJScGdO3fkjtSmiKjF26FDh+SOJqn2vqkCgPPnzyMxMRFarRbx8fE4cOCA3JHanMvlwsKFC2EwGNChQwf06dMHq1evFjWYv11xcXGLazg7OxvAj2OB165dC51OB61WizFjxqC6ulre0ExScvQ1X3rLly9fMG/ePERHRyMiIgKTJk3C27dvRT/nxYsXGD9+PMLDwxETE4OlS5eisbFRNKe4uBhDhw6FRqNBnz59gtK/mvcEpWX1Vs99WfcfPnxARkYGOnbsiMjISMyYMQP19fWiOQ8ePMDIkSOh1WoRFxeHTZs2+Z3VlzosV95g1M9g5Tp58iT69+8PjUaDhIQEXLx40a+8z58/b3XdFRcXS57X27VtrqVNlZTX1psQ4Kevq2aMMcYYY4wx5hf+myrGGGOMMcYYCwBvqhhjjDHGGGMsALypYowxxhhjjLEA8KaKMcYYY4wxxgLAmyrGGGOMMcYYCwBvqhhjjDHGGGMsALypYowxxhhjjLEA8KaKMcYYY4wxxgLAmyrGGGOMMcYYCwBvqhhjjDHGGGMsALypYowxxhhjjLEA8KaKMcYYY4wxxgLwP+iSIJkcaY8DAAAAAElFTkSuQmCC\n"},"metadata":{}}]},{"cell_type":"markdown","source":["## Removing entries with numeric name of comopanies or countries"],"metadata":{"id":"uTNnaW8Jmr3U"}},{"cell_type":"code","source":["def is_string_number(string):\n"," try:\n"," float(string)\n"," return True\n"," except ValueError:\n"," return False"],"metadata":{"id":"-sB4JFQnmCxW","executionInfo":{"status":"ok","timestamp":1688571638129,"user_tz":-210,"elapsed":595,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":40,"outputs":[]},{"cell_type":"code","source":["for i in range(metadata.shape[0]):\n"," if is_string_number(metadata.loc[i, 'production_countries']) or is_string_number(metadata.loc[i, 'production_companies']):\n"," metadata.drop(index=i, inplace=True)\n","metadata.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"7EZfyxccmqMQ","executionInfo":{"status":"ok","timestamp":1688571640517,"user_tz":-210,"elapsed":784,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"564f7e66-ea73-4755-cd9e-9e55e50707d4"},"execution_count":41,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(45460, 24)"]},"metadata":{},"execution_count":41}]},{"cell_type":"code","source":["metadata.drop_duplicates(inplace=True)\n","metadata.dropna(subset=['production_companies', 'production_countries'], inplace=True)"],"metadata":{"id":"vtrzBhjznD7p","executionInfo":{"status":"ok","timestamp":1688571642826,"user_tz":-210,"elapsed":363,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":42,"outputs":[]},{"cell_type":"code","source":["metadata = metadata.fillna(\"NaN value\")\n"],"metadata":{"id":"q7mDM3zAnlH_","executionInfo":{"status":"ok","timestamp":1688571644612,"user_tz":-210,"elapsed":398,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":43,"outputs":[]},{"cell_type":"markdown","source":["## Extracting information from json values"],"metadata":{"id":"J952IGoVrwJA"}},{"cell_type":"code","source":["def get_text_nan(text, obj=\"name\"):\n"," if(text == \"NaN value\"):\n"," return np.nan\n"," elif (isinstance(literal_eval(str(text)), float)):\n"," return np.nan\n"," else:\n"," text = literal_eval(str(text))\n"," for i in text:\n"," if(i == obj):\n"," return (text[i])"],"metadata":{"id":"C3ElqfyRrgK8","executionInfo":{"status":"ok","timestamp":1688571653225,"user_tz":-210,"elapsed":739,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":44,"outputs":[]},{"cell_type":"code","source":["def text_getter(text, obj='name'):\n"," if(text == 'NaN value'):\n"," return np.nan\n"," elif (isinstance(literal_eval(str(text)), float)):\n"," return np.nan\n"," elif(isinstance(literal_eval(str(text)), list)):\n"," s = []\n"," for i in text:\n"," s.append(str(i[obj]))\n"," return ', '.join(s)\n"," else:\n"," text = literal_eval(str(text))\n"," for i in text:\n"," if(i == obj):\n"," return (text[i])"],"metadata":{"id":"sPZP1mKRrhnY","executionInfo":{"status":"ok","timestamp":1688571654839,"user_tz":-210,"elapsed":6,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":45,"outputs":[]},{"cell_type":"markdown","source":["'belongs to collection' column"],"metadata":{"id":"kvoi_xr8sw5X"}},{"cell_type":"code","source":["metadata['name_belongs_to_collection'] = metadata['belongs_to_collection'].apply(get_text_nan ,obj = \"name\")\n","metadata['id_belongs_to_collection'] = metadata['belongs_to_collection'].apply(get_text_nan ,obj = \"id\")\n","metadata['poster_path_belongs_to_collection'] = metadata['belongs_to_collection'].apply(get_text_nan ,obj = \"poster_path\")\n","metadata['backdrop_path_belongs_to_collection'] = metadata['belongs_to_collection'].apply(get_text_nan ,obj = \"backdrop_path\")"],"metadata":{"id":"9-ZGGNdfsFKw","executionInfo":{"status":"ok","timestamp":1688571660522,"user_tz":-210,"elapsed":933,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":46,"outputs":[]},{"cell_type":"markdown","source":["'genres' column"],"metadata":{"id":"B-8-Qd9dtIcv"}},{"cell_type":"code","source":["metadata['name_genres'] = metadata['genres'].apply(get_text ,obj = \"name\")\n","metadata['id_genres'] = metadata['genres'].apply(get_text ,obj = \"id\")"],"metadata":{"id":"QJp5U6BGsu0Z","executionInfo":{"status":"ok","timestamp":1688571665947,"user_tz":-210,"elapsed":2373,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":47,"outputs":[]},{"cell_type":"markdown","source":["'production countries' column"],"metadata":{"id":"GLFk9tGQtM4_"}},{"cell_type":"code","source":["metadata['name_production_countries'] = metadata['production_countries'].apply(get_text ,obj = \"name\")\n","metadata['iso_3166_1_production_companies'] = metadata['production_countries'].apply(get_text ,obj = \"iso_3166_1\")"],"metadata":{"id":"viAxv4kGsvbD","executionInfo":{"status":"ok","timestamp":1688571671111,"user_tz":-210,"elapsed":1435,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":48,"outputs":[]},{"cell_type":"markdown","source":["'production companies' column"],"metadata":{"id":"VDodd_DPtbrz"}},{"cell_type":"code","source":["metadata['name_production_companies'] = metadata['production_companies'].apply(get_text ,obj = \"name\")\n","metadata['id_production_companies'] = metadata['production_companies'].apply(get_text ,obj = \"id\")\n"],"metadata":{"id":"9fyeJVlftaEU","executionInfo":{"status":"ok","timestamp":1688571676262,"user_tz":-210,"elapsed":1791,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":49,"outputs":[]},{"cell_type":"code","source":["metadata = metadata.replace('NaN value', np.nan)"],"metadata":{"id":"VkkYNztRuf42","executionInfo":{"status":"ok","timestamp":1688571907439,"user_tz":-210,"elapsed":579,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":52,"outputs":[]},{"cell_type":"markdown","source":["## Constructing the new dataframe and saving the new dataset"],"metadata":{"id":"8-Z-JMlCtlon"}},{"cell_type":"code","source":["clean_metadata = metadata.drop([\"spoken_languages\" ,\"genres\" ,\"production_countries\" ,\"belongs_to_collection\"] ,axis=1)\n","print('shape of the cleaned dataset: {}'.format(clean_metadata.shape))\n","clean_metadata.head(3)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":532},"id":"zveKnpTPtfiA","executionInfo":{"status":"ok","timestamp":1688571914195,"user_tz":-210,"elapsed":578,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}},"outputId":"8b7df7c5-f07e-418b-9dfe-de0f92557bb3"},"execution_count":53,"outputs":[{"output_type":"stream","name":"stdout","text":["shape of the cleaned dataset: (45447, 30)\n"]},{"output_type":"execute_result","data":{"text/plain":[" adult budget homepage id imdb_id \\\n","0 False 30000000 http://toystory.disney.com/toy-story 862 tt0114709 \n","1 False 65000000 NaN 8844 tt0113497 \n","2 False 0 NaN 15602 tt0113228 \n","\n"," original_language original_title \\\n","0 en Toy Story \n","1 en Jumanji \n","2 en Grumpier Old Men \n","\n"," overview popularity \\\n","0 Led by Woody, Andy's toys live happily in his ... 21.946943 \n","1 When siblings Judy and Peter discover an encha... 17.015539 \n","2 A family wedding reignites the ancient feud be... 11.7129 \n","\n"," poster_path ... name_belongs_to_collection \\\n","0 /rhIRbceoE9lR4veEXuwCC2wARtG.jpg ... Toy Story Collection \n","1 /vzmL6fP7aPKNKPRTFnZmiUfciyV.jpg ... NaN \n","2 /6ksm1sjKMFLbO7UY2i6G1ju9SML.jpg ... Grumpy Old Men Collection \n","\n"," id_belongs_to_collection poster_path_belongs_to_collection \\\n","0 10194.0 /7G9915LfUQ2lVfwMEEhDsn3kT4B.jpg \n","1 NaN NaN \n","2 119050.0 /nLvUdqgPgm3F85NMCii9gVFUcet.jpg \n","\n"," backdrop_path_belongs_to_collection name_genres \\\n","0 /9FBwqcd9IRruEDUrTdcaafOMKUq.jpg Animation, Comedy, Family \n","1 NaN Adventure, Fantasy, Family \n","2 /hypTnLot2z8wpFS7qwsQHW1uV8u.jpg Romance, Comedy \n","\n"," id_genres name_production_countries iso_3166_1_production_companies \\\n","0 16, 35, 10751 United States of America US \n","1 12, 14, 10751 United States of America US \n","2 10749, 35 United States of America US \n","\n"," name_production_companies id_production_companies \n","0 Pixar Animation Studios 3 \n","1 TriStar Pictures, Teitler Film, Interscope Com... 559, 2550, 10201 \n","2 Warner Bros., Lancaster Gate 6194, 19464 \n","\n","[3 rows x 30 columns]"],"text/html":["\n"," <div id=\"df-c8e90d56-a50e-4f9c-b919-c9d653aa1110\">\n"," <div class=\"colab-df-container\">\n"," <div>\n","<style scoped>\n"," .dataframe tbody tr th:only-of-type {\n"," vertical-align: middle;\n"," }\n","\n"," .dataframe tbody tr th {\n"," vertical-align: top;\n"," }\n","\n"," .dataframe thead th {\n"," text-align: right;\n"," }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n"," <thead>\n"," <tr style=\"text-align: right;\">\n"," <th></th>\n"," <th>adult</th>\n"," <th>budget</th>\n"," <th>homepage</th>\n"," <th>id</th>\n"," <th>imdb_id</th>\n"," <th>original_language</th>\n"," <th>original_title</th>\n"," <th>overview</th>\n"," <th>popularity</th>\n"," <th>poster_path</th>\n"," <th>...</th>\n"," <th>name_belongs_to_collection</th>\n"," <th>id_belongs_to_collection</th>\n"," <th>poster_path_belongs_to_collection</th>\n"," <th>backdrop_path_belongs_to_collection</th>\n"," <th>name_genres</th>\n"," <th>id_genres</th>\n"," <th>name_production_countries</th>\n"," <th>iso_3166_1_production_companies</th>\n"," <th>name_production_companies</th>\n"," <th>id_production_companies</th>\n"," </tr>\n"," </thead>\n"," <tbody>\n"," <tr>\n"," <th>0</th>\n"," <td>False</td>\n"," <td>30000000</td>\n"," <td>http://toystory.disney.com/toy-story</td>\n"," <td>862</td>\n"," <td>tt0114709</td>\n"," <td>en</td>\n"," <td>Toy Story</td>\n"," <td>Led by Woody, Andy's toys live happily in his ...</td>\n"," <td>21.946943</td>\n"," <td>/rhIRbceoE9lR4veEXuwCC2wARtG.jpg</td>\n"," <td>...</td>\n"," <td>Toy Story Collection</td>\n"," <td>10194.0</td>\n"," <td>/7G9915LfUQ2lVfwMEEhDsn3kT4B.jpg</td>\n"," <td>/9FBwqcd9IRruEDUrTdcaafOMKUq.jpg</td>\n"," <td>Animation, Comedy, Family</td>\n"," <td>16, 35, 10751</td>\n"," <td>United States of America</td>\n"," <td>US</td>\n"," <td>Pixar Animation Studios</td>\n"," <td>3</td>\n"," </tr>\n"," <tr>\n"," <th>1</th>\n"," <td>False</td>\n"," <td>65000000</td>\n"," <td>NaN</td>\n"," <td>8844</td>\n"," <td>tt0113497</td>\n"," <td>en</td>\n"," <td>Jumanji</td>\n"," <td>When siblings Judy and Peter discover an encha...</td>\n"," <td>17.015539</td>\n"," <td>/vzmL6fP7aPKNKPRTFnZmiUfciyV.jpg</td>\n"," <td>...</td>\n"," <td>NaN</td>\n"," <td>NaN</td>\n"," <td>NaN</td>\n"," <td>NaN</td>\n"," <td>Adventure, Fantasy, Family</td>\n"," <td>12, 14, 10751</td>\n"," <td>United States of America</td>\n"," <td>US</td>\n"," <td>TriStar Pictures, Teitler Film, Interscope Com...</td>\n"," <td>559, 2550, 10201</td>\n"," </tr>\n"," <tr>\n"," <th>2</th>\n"," <td>False</td>\n"," <td>0</td>\n"," <td>NaN</td>\n"," <td>15602</td>\n"," <td>tt0113228</td>\n"," <td>en</td>\n"," <td>Grumpier Old Men</td>\n"," <td>A family wedding reignites the ancient feud be...</td>\n"," <td>11.7129</td>\n"," <td>/6ksm1sjKMFLbO7UY2i6G1ju9SML.jpg</td>\n"," <td>...</td>\n"," <td>Grumpy Old Men Collection</td>\n"," <td>119050.0</td>\n"," <td>/nLvUdqgPgm3F85NMCii9gVFUcet.jpg</td>\n"," <td>/hypTnLot2z8wpFS7qwsQHW1uV8u.jpg</td>\n"," <td>Romance, Comedy</td>\n"," <td>10749, 35</td>\n"," <td>United States of America</td>\n"," <td>US</td>\n"," <td>Warner Bros., Lancaster Gate</td>\n"," <td>6194, 19464</td>\n"," </tr>\n"," </tbody>\n","</table>\n","<p>3 rows × 30 columns</p>\n","</div>\n"," <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-c8e90d56-a50e-4f9c-b919-c9d653aa1110')\"\n"," title=\"Convert this dataframe to an interactive table.\"\n"," style=\"display:none;\">\n"," \n"," <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n"," width=\"24px\">\n"," <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n"," <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n"," </svg>\n"," </button>\n"," \n"," <style>\n"," .colab-df-container {\n"," display:flex;\n"," flex-wrap:wrap;\n"," gap: 12px;\n"," }\n","\n"," .colab-df-convert {\n"," background-color: #E8F0FE;\n"," border: none;\n"," border-radius: 50%;\n"," cursor: pointer;\n"," display: none;\n"," fill: #1967D2;\n"," height: 32px;\n"," padding: 0 0 0 0;\n"," width: 32px;\n"," }\n","\n"," .colab-df-convert:hover {\n"," background-color: #E2EBFA;\n"," box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n"," fill: #174EA6;\n"," }\n","\n"," [theme=dark] .colab-df-convert {\n"," background-color: #3B4455;\n"," fill: #D2E3FC;\n"," }\n","\n"," [theme=dark] .colab-df-convert:hover {\n"," background-color: #434B5C;\n"," box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n"," filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n"," fill: #FFFFFF;\n"," }\n"," </style>\n","\n"," <script>\n"," const buttonEl =\n"," document.querySelector('#df-c8e90d56-a50e-4f9c-b919-c9d653aa1110 button.colab-df-convert');\n"," buttonEl.style.display =\n"," google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n"," async function convertToInteractive(key) {\n"," const element = document.querySelector('#df-c8e90d56-a50e-4f9c-b919-c9d653aa1110');\n"," const dataTable =\n"," await google.colab.kernel.invokeFunction('convertToInteractive',\n"," [key], {});\n"," if (!dataTable) return;\n","\n"," const docLinkHtml = 'Like what you see? Visit the ' +\n"," '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n"," + ' to learn more about interactive tables.';\n"," element.innerHTML = '';\n"," dataTable['output_type'] = 'display_data';\n"," await google.colab.output.renderOutput(dataTable, element);\n"," const docLink = document.createElement('div');\n"," docLink.innerHTML = docLinkHtml;\n"," element.appendChild(docLink);\n"," }\n"," </script>\n"," </div>\n"," </div>\n"," "]},"metadata":{},"execution_count":53}]},{"cell_type":"code","source":["clean_metadata.to_csv('/content/drive/MyDrive/Rec/data/cleaned/clean_metadata.csv', index=False)"],"metadata":{"id":"bFZ03yWWuFTO","executionInfo":{"status":"ok","timestamp":1688571930421,"user_tz":-210,"elapsed":1566,"user":{"displayName":"Amir Hossein Karami","userId":"12632705231641967217"}}},"execution_count":54,"outputs":[]},{"cell_type":"code","source":[],"metadata":{"id":"LiikvR3euR2Z"},"execution_count":null,"outputs":[]}]} |