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/75hl8z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\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":[]}]}