<jupyter_start><jupyter_text>Ciencia de Datos Acelerada con GPU Introducción a cuDF para usuarios de pandas Presentador: <NAME> (BLAZINGSQL)Notebook adaptado a español desde [02_Introduction_to_cuDF_for_pandas.ipynb](https://github.com/BlazingDB/Welcome_to_BlazingSQL_Notebooks/blob/master/webinars/rapids_intro/02_Introduction_to_cuDF_for_pandas.ipynb) por <NAME>. -------En este Notebook presumiremos de los beneficios de usar cuDF. cuDF es una librería en Python de DataFrame GPU, para cargar, ejecutar joins, hacer agregaciones, filtrar y toda clase de manipulación de data tabular usando un DataFrame style API.  Primero, sumemos las librerías necesarias<jupyter_code>import os

import pandas as pd
import numpy as np

import cupy as cp
import cudf as cd<jupyter_output><empty_output><jupyter_text>Importemos data desde un archivo csv  **movies_pdf** es nuestro DataFrame de Pandas<jupyter_code>movies_pdf = pd.read_csv("s3://bsql/data/rapids_intro/movies.csv")<jupyter_output><empty_output><jupyter_text>**movies_cdf** es nuestro cuDF<jupyter_code>movies_cdf = cd.read_csv("s3://bsql/data/rapids_intro/movies.csv", storage_options={'anon': True})<jupyter_output><empty_output><jupyter_text>Ejemplos de estadísticas en dataset<jupyter_code>print(movies_pdf.shape)
print(movies_pdf.ndim)
print(len(movies_pdf))
print(movies_cdf.shape)
print(movies_cdf.ndim)
print(len(movies_cdf))<jupyter_output>(4916, 28)
2
4916<jupyter_text>Explorando la Data<jupyter_code>movies_pdf.head()
movies_cdf.head()
movies_pdf.info()
movies_cdf.info()
movies_pdf.columns
movies_cdf.columns<jupyter_output><empty_output><jupyter_text>Seleccionando subconjuntos del DataFrame  Seleccionando campos que son data continua<jupyter_code>movies_pdf.select_dtypes(include="number").head()
movies_cdf.select_dtypes(include="number").head()<jupyter_output><empty_output><jupyter_text>Seleccionando campos que son floats<jupyter_code>movies_pdf.select_dtypes(include="float").head()
movies_cdf.select_dtypes(include="float").head()<jupyter_output><empty_output><jupyter_text>Seleccionando campos que son valores discretos<jupyter_code>movies_pdf.select_dtypes(include="object").head()
movies_cdf.select_dtypes(include="object").head()<jupyter_output><empty_output><jupyter_text>Análisis de Data  Resumen estadístico para todos los campos de data continua<jupyter_code>movies_pdf.select_dtypes(include="number").describe()
movies_cdf.select_dtypes(include="number").describe()<jupyter_output><empty_output><jupyter_text>Resumen estadístico para todos los campos con valores discretos<jupyter_code>movies_pdf.select_dtypes(include="object").describe()
movies_cdf.select_dtypes(include="object").describe()<jupyter_output><empty_output><jupyter_text>Transpuesta de los resultados de la función describe() de cuDF (esto se puede hacer también en Pandas)<jupyter_code>movies_cdf.select_dtypes(include="number").describe().T<jupyter_output><empty_output><jupyter_text>Cálculo de Covarianza de dos variables continuas<jupyter_code>movies_pdf.movie_facebook_likes.cov(movies_pdf.actor_3_facebook_likes)
movies_cdf.movie_facebook_likes.cov(movies_cdf.actor_3_facebook_likes)<jupyter_output><empty_output><jupyter_text>Correlación Pearson de dos variables continuas<jupyter_code>movies_pdf.movie_facebook_likes.corr(movies_pdf.actor_3_facebook_likes)
movies_cdf.movie_facebook_likes.corr(movies_cdf.actor_3_facebook_likes)<jupyter_output><empty_output><jupyter_text>AgrupacionesAnalizando los montos brutos (gross amounts) generados por los dos actores principales<jupyter_code>movies_pdf[['actor_1_name','actor_2_name','gross']].groupby(['actor_1_name','actor_2_name']).sum()
movies_cdf[['actor_1_name','actor_2_name','gross']].groupby(['actor_1_name','actor_2_name']).sum()<jupyter_output><empty_output><jupyter_text>Preparación de la Data Algunos géneros (genres) son resultado de la combinación de otros varios géneros. Por ejemplo: `Action|Adventure|Comedy|Fantasy|Sci-Fi`<jupyter_code>print('There are ' + str(len(movies_pdf.genres.unique())) + ' genre combinations in the genres field')
print('Examples:\n', movies_pdf.genres.unique()[:10])<jupyter_output>There are 914 genre combinations in the genres field
Examples:
 ['Action|Adventure|Fantasy|Sci-Fi' 'Action|Adventure|Fantasy'
 'Action|Adventure|Thriller' 'Action|Thriller' 'Documentary'
 'Action|Adventure|Sci-Fi' 'Action|Adventure|Romance'
 'Adventure|Animation|Comedy|Family|Fantasy|Musical|Romance'
 'Adventure|Family|Fantasy|Mystery' 'Action|Adventure']<jupyter_text>Dividiendo la columna Género (Genre) usando pandas<jupyter_code>genres_pdf = movies_pdf.join(movies_pdf.genres.str.split('|', expand=True).add_prefix('genre_'))
genres_pdf<jupyter_output><empty_output><jupyter_text>Dividiendo la columna Género (Genre) usando cuDFcuDF no tiene la opción add_prefix() cuando dividimos una columna. Acá mostramos una opción para renombrar la columna en cuDF.<jupyter_code>genre_fields = len(movies_cdf.genres.str.split('|', expand=True).columns)
print('There will be ' + str(genre_fields) + ' new columns that will be added into our dataframe\n')
genres_cdf = movies_cdf.join(movies_cdf.genres.str.split('|', expand=True))
genres_cdf.head()<jupyter_output>There will be 8 new columns that will be added into our dataframe<jupyter_text>**Los nuevos nombres de columna son asignados a números, que no son strings**<jupyter_code>col_numbers = genres_cdf.columns[-genre_fields:].to_list()
print(col_numbers)<jupyter_output>[0, 1, 2, 3, 4, 5, 6, 7]<jupyter_text>**Necesitas convertirlos a strings, asignarles un prefijo y convertir ambas listas a un diccionario para renombrar las nuevas columnas en cuDF**<jupyter_code>new_col_names = ['genre_' + str(x) for x in col_numbers] 
print(new_col_names)

new_col_dict = dict(zip(col_numbers, new_col_names))
print(new_col_dict)
genres_cdf = genres_cdf.rename(columns=new_col_dict)
genres_cdf.head()<jupyter_output><empty_output><jupyter_text>One Hot Encoding  OHE usando PandasAplicado a la columna genre_0<jupyter_code>pd_ohe = pd.get_dummies(genres_pdf.genre_0, prefix='genre_0')
df = pd.concat([genres_pdf, pd_ohe], axis=1)
df.head()<jupyter_output><empty_output><jupyter_text>OHE usando cuDFAplicado a la columna genre_0<jupyter_code>cdf = cd.get_dummies(genres_cdf, prefix='genre_0', columns=['genre_0'])
cdf.head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11176191230014247, 'fraction_numerical': 0.007915149596327371, 'mean_word_length': 10.4043321299639, 'pattern_counts': {'":': 0, '<': 83, '<?xml version=': 0, '>': 83, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '21', 'dir': 'jupyter-structured-clean-dedup', 'id': '491701', 'license': 'Apache-2.0', 'n_tokens_mistral': 2447, 'n_tokens_neox': 2389, 'n_words': 397, 'path': 'webinars/rapids_intro/02_Introduccion_a_cuDF_para_pandas.ipynb', 'repo_name': 'jacobtomlinson/Welcome_to_BlazingSQL_Notebooks', 'size': '6341'}