Este proyecto es de autoría de Francisco Hugo Lezik.
Mi correo es: franciscohugolezik@gmail.com
El URL de mi linkedin es: https://www.linkedin.com/in/francisco-hugo-lezik-7b4256220/
- Introducción
- Requisitos
- Instalación
- Estructura
- Ejecución
- Datos y Fuentes
- Metodología
- Resultados y Conclusiones
- Contribución y Colaboración
- Licencia
El objetivo de este proyecto de MVP (Minimum Viable Product) es crear un sistema de recomendación de películas. El objetivo es que este sistema recomiende películas similares a una película en particular vista por cada usuario particular. La cantidad de películas a recomendar son cinco. Estas películas deben ser similares en puntuación a la película usada para recomendar. Se mostraran sus títulos ordenadas de mayor puntaje a menor puntaje.
En primer lugar se crea una API con endpoints que satisfagan las siguientes necesidades de los usuarios:
-
La cantidad de filmaciones por mes.
-
La cantidad de filmaciones por día.
-
El estreno y el score de una película en particular.
-
El año, la cantidad de votos y el promedio de los votos de una película en particular.
-
La cantidad de peliculas, el exito o retorno (suma del retorno de todas las peliculas) y el promedio del retorno de todas las peliculas de un actor en particular. (1)
-
El exito total (retorno) y todas las películas (por cada una: la fecha de lanzamiento, el retorno, el presupuesto y los ingresos) de un director en particular. (2)
(1) Durante el proceso de la elaboracion de este endpoint se descubrio que faltaban datos del retorno de varias peliculas por lo que se opto por incluir la cantidad total de peliculas y la cantidad de las peliculas que poseen datos sobre el retorno. Se uso el retorno de las peliculas que lo tenian. Por ejemplo:
Si el actor participo de 10 peliculas y 5 de ellas tienen el dato del retorno, entonces, se usaran los datos del retorno de estas últimas 5.
(2) El problema del anterior endpoint afecta tambien a este endpoint. Por lo tanto se decidio usar la solucion dada en el punto anterior (2).
Por último se va a agregar un nuevo endpoint a la API que es el sistema de recomendación.
Use python 3.8.10 y las librerias necesarias estan en libraries.txt.
-
Clonar el repositorio:
git clone https://github.com/FranciscoHugoLezik/Proyecto_Peliculas.git
-
Crear un entorno virtuak:
python -m venv venv
-
Activar el entorno virtual:
-
Windows:
venv\Scripts\activate
(Si se usa Git bash es:source venv/Scripts/activate
) -
macOS/Linux:
source venv/bin/activate
-
-
Instalar las dependencias:
pip install -r libraries.txt
La libreria requirements.txt es para Render.
data/
:
En la carpeta data/ se guardan los archivos que son el resultado del proceso ETL de los archivos en crudo. A continuacion se lista el contenido:
Carpeta credits/
-
cast_ETL.parquet
-
crew_ETL.parquet
Carpeta movies_dataset/
-
belongs_to_collection_ETL.parquet
-
genres_ETL.parquet
-
movies_ETL.parquet
-
production_companies_ETL.parquet
-
production_countries_ETL.parquet
-
spoken_language_ETL.parquet
notebooks/
:
Contiene los archivos jupyter para el ETL de los archivos en crudo. Los archivos en crudo son extraidos de un repositorio en GitHub llamado Movies_data. Los archivos producidos por los ETL son alojados en las carpeta data. Cada ETL guarda el archivo en una ubicacion ya establecida.
El link del repositorio Movies_data es:
https://github.com/FranciscoHugoLezik/Movies_data.git
Las carpetas que contiene son las siguientes:
Carpeta ETL_credits/ : Contiene el ETL de los archivos en crudo llamados cast_id.parquet y crew_id.parquet. Originalmente estaban en un archivo en crudo llamado credits.csv pero fueron separados y convertidos a parquet para poder guardarlos en github.
Se hicieron dos ETL:
-
ETL_cast_id.ipynb
-
ETL_crew_id.ipynb
Carpeta ETL_movies_dataset/ : Contiene el ETL del archivo en crudo llamado movies_dataset.parquet.
Se hicieron seis ETL:
-
ETL_belongs_to_collection.ipynb
-
ETL_genres.ipynb
-
ETL_movies.ipynb
-
ETL_production_companies.ipynb
-
ETL_production_countries.ipynb
-
ETL_spoken_languages.ipynb
reports/
:
Contiene los informes y visualizaciones generados.
src/
:
Contiene el código fuente del proyecto. Dentro se encuentran dos carpetas y un archivo main.py:
Carpeta pycache : contiene archivos con el bytecode compilado de los módulos Python. Es generado automaticamente.
Carpeta Scrips : contiene otra pycache y un archivo script. El script es el siguiente:
query_movies.py : Contiene las funciones que hacen el procesamiento requerido por los endpoints alojados en el main.py.
main.py : Contiene la API y los endpoints. Estos endpoints llaman a las funciones alojadas en el script query_movies.py para hacer el procesamiento.
.gitignore
:
Es el archivo que permite que git no haga un commit de los archivos o carpetas. Esto se logra escribiendo la ubicacion del archivo o de la carpeta. Se comienza a partir de la raíz de la carpeta del proyecto. Por ejemplo: Para que git no haga un commit del entorno virtual se escribe en el archivo .gitignore la ubicacion /venv ya que esta carpeta esta en la raiz de la carpeta del proyecto.
README.md
:
Es el archivo donde esta la documentación del proyecto.
libraries.txt
:
Es el archivo que contiene las librerias que use en mi entorno virtual. Decidi tener este archivo separado porque Render me daba muchos problemas con las versiones de las librerias.
requirements.txt
:
Es el archivo que contiene las librerías que le indican a Render que versiones usar. Ya esta probada. No deberia dar error.
En la carpeta notebooks se encuentran los ETL. Se los puede ejecutar para producir los archivos requeridos que se guardan en la carpeta data/. Es opcional porque ya estan ejecutadas.
En un principio los archivos en crudo iban a estar en la carpeta data/.
El proyecto se carga en Render. Se usa la version gratuita que tiene un RAM de 512 Mb. Por este motivo se tuvo que poner en otro repositorio de github llamado Movies_data. Los archivos ETL descargan los archivos de ese repositorio. En el readme de ese repositorio explico el proceso que se tuvo que hacer para poder exportalos a GitHub.
El GitHub del repositorio de los archivos en crudo es:
https://github.com/FranciscoHugoLezik/Movies_data.git
Datasets en crudo:
cast_id.parquet : originalmente dentro de credits.csv. Contiene los datos anidados de cada uno de los actores de cada pelicula.
crew_id.parquet : originalmente dentro de credits.csv. Contiene los datos anidados de cada uno de los miembros del equipo de produccion de cada pelicula.
movies_dataset.parquet : originalmente era un archivo csv. Contiene los datos de cada pelicula.
El proceso de ETL produjo 8 datasets almacenados como archivos parquet. Estan guardados en la carpeta data/:
cast_ETL.parquet : contiene los datos de los actores de forma individual. Se pueden repetir por el id de la pelicula si participaron en mas de una pelicula.
crew_ETL.parquet : contiene los datos de los miembros del equipo de produccion de forma individual. Se pueden repetir por el id de la pelicula si participaron en mas de una pelicula.
movies_ETL.parquet : contiene los datos de cada pelicula sin las columnas de datos anidados.
belongs_to_collection_ETL.parquet : era una columna en el dataset movies_dataset. Contiene los datos de cada franquicia. Se puede repetir por el id de las peliculas si la franquicia tiene mas de una pelicula.
genres_ETL.parquet : era una columna en el dataset movies_dataset. Contiene los datos de cada tipo de genero. Se puede repetir por el id de las peliculas porque un genero tiene muchas peliculas.
production_companies_ETL.parquet : era una columna en el dataset movies_dataset. Contiene los datos de cada compañia cinematografica. Se puede repetir por el id de las peliculas porque una compañia cinematografica tiene muchas peliculas.
production_countries_ETL.parquet : era una columna en el dataset movies_dataset. Contiene los datos de cada pais en donde se produjo la pelicula. Se puede repetir por el id de las peliculas porque un país tiene muchas peliculas.
spoken_language_ETL.parquet : era una columna en el dataset movies_dataset. Contiene los datos de cada idioma hablado en cada pelicula. Se puede repetir por el id de las peliculas porque un país tiene muchas peliculas.