{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Big Data Derby Analysis","metadata":{}},{"cell_type":"markdown","source":"# Importamos bibliotecas","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\nimport plotly.figure_factory as ff\nimport missingno as msno\n\nimport os\nsns.set_theme(style=\"darkgrid\")\n\ncolors = [\"#FFFFFF\",\"#6CD4FF\",\"#F7DF00\",\"#E60000\"]\n\nplt.rcParams[\"figure.figsize\"] = (12,8)\n\nwarnings.simplefilter(\"ignore\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## BIBLIOTECAS SCIKIT","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_error, r2_score\nfrom sklearn import datasets, linear_model\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install pymap3d\nimport pymap3d as pm","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Cargamos datos","metadata":{}},{"cell_type":"code","source":"##Creamos los datasframe de todos los csv, esto data tienen nombre en español ya que es el idioma que mas maneja el equipo\nTodos_los_archivos = \"nyra_2019_complete.csv\"\ndatos_carreras_caballos = \"nyra_start_table.csv\"\ndatos_carrera_hipodromo = \"nyra_race_table.csv\"\ndatos_seguimiento = \"nyra_tracking_table.csv\"\n\nTodos_los_archivos_df = pd.read_csv(Todos_los_archivos)\ndatos_carreras_caballos_df = pd.read_csv(datos_carreras_caballos)\ndatos_carrera_hipodromo_df = pd.read_csv(datos_carrera_hipodromo)\ndatos_seguimiento_df = pd.read_csv(datos_seguimiento)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Empieza EDA","metadata":{}},{"cell_type":"markdown","source":"Todos los archivos","metadata":{}},{"cell_type":"code","source":"## Vemos las primeras filas del dataframe todos los archivos el cual viene de nyra_2019_complete.csv \nTodos_los_archivos_df.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## vemos todas las filas con las columnas \nTodos_los_archivos_df.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Vemos las columnas y nos damos cuenta que no tienen asignado un nombre identificador\nTodos_los_archivos_df.columns","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##Entonces vamos a generarle nombre a las columnas los cuales seran los sig:\natributos_español = [\"id_pista\",\"fecha_carrera\",\"numero_carrera\",\"id_caballo\",\"recopilacion_cuarto\",\"latitud_caballo\",\"longitud_caballo\",\"distancia\",\"tipo_terreno\",\"condicion_de_la_pista\",\"distancia_en_pies\",\"tipo_carrera\",\"dinero_dos_decimales_USD\",\"hora_de_carrera\",\"peso_llevado\",\"jockey\",\"posibilidades_de_ganar\",\"posicion\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Asignamos los nombres\nTodos_los_archivos_df.columns=atributos_español","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Vemos las columnas ya con nombres\nTodos_los_archivos_df.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Todos_los_archivos_df.shape\n##vemos que no se pierdan datos ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Todos_los_archivos_df.describe()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## usamos .info() para ver la informacion del dataframe de todos los archivos\nTodos_los_archivos_df.info()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##hacemos el mismo proceso anterior con nyra_start_table el cual su data frame es datos_carreras_caballos_df\ndatos_carreras_caballos_df.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## vemos todas las filas con las columnas \ndatos_carreras_caballos_df.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Vemos las columnas y nos damos cuenta que no tienen asignado un nombre identificador\n\ndatos_carreras_caballos_df.columns","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##Entonces vamos a generarle nombre a las columnas los cuales seran los sig:\natributos_español = [\"id_pista\",\"fecha_carrera\",\"numero_carrera\",\"id_caballo\",\"peso_llevado\",\"jockey\",\"posibilidades_de_ganar\",\"Posicion\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Asignamos los nombres\ndatos_carreras_caballos_df.columns=atributos_español","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Vemos las columnas ya con nombres\n\ndatos_carreras_caballos_df.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datos_carreras_caballos_df.shape\n##vemos que no se pierdan datos y asi es","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##Graficamos las pistas\ndata_tracking = Todos_los_archivos_df.loc[Todos_los_archivos_df['id_pista'] == 'AQU']\n\nplt.style.use(\"dark_background\")\nplt.figure(figsize = (16, 10))\nsns.scatterplot(data = data_tracking, x = 'longitud_caballo', y = 'latitud_caballo',\n                hue = 'numero_carrera', palette= \"Paired\")\nplt.title(\"Longitud y Latitude de las carreras en AQU\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_tracking = Todos_los_archivos_df.loc[Todos_los_archivos_df['id_pista'] == 'BEL']\n\nplt.style.use(\"dark_background\")\nplt.figure(figsize = (16, 10))\nsns.scatterplot(data = data_tracking, x = 'longitud_caballo', y = 'latitud_caballo',\n                hue = 'numero_carrera', palette= \"Paired\")\nplt.title(\"Longitud y Latitude de las carreras en BEL\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_tracking = Todos_los_archivos_df.loc[Todos_los_archivos_df['id_pista'] == 'SAR']##???\n\nplt.style.use(\"dark_background\")##fondo\nplt.figure(figsize = (16, 10))##tamaño figura\nsns.scatterplot(data = data_tracking, x = 'longitud_caballo', y = 'latitud_caballo',\n                hue = 'numero_carrera', palette= \"Paired\")\nplt.title(\"Longitud y Latitude de las carreras en SAR\")##titulo","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##Grafica de caballos que compieron en la pista AQU\ndata_tracking = Todos_los_archivos_df.loc[Todos_los_archivos_df['id_pista'] == 'AQU']\n\nplt.style.use(\"dark_background\")\nplt.figure(figsize = (16, 10))\nsns.scatterplot(data = data_tracking, x = 'longitud_caballo', y = 'latitud_caballo',\n                hue = 'id_caballo', palette= \"Paired\")\nplt.title(\"Longitud y Latitude de los caballos en AQU\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##Grafica de caballos que compieron en la fecha 2019-01-01\ndata_tracking = Todos_los_archivos_df.loc[Todos_los_archivos_df['fecha_carrera'] == '2019-01-01']\nplt.style.use(\"dark_background\")\nplt.figure(figsize = (16, 10))\nsns.scatterplot(data = data_tracking, x = 'longitud_caballo', y = 'latitud_caballo',\n                hue = 'id_caballo', palette= \"Paired\")\nplt.title(\"Longitud y Latitude de caballos que compieron en la fecha 2019-01-01\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Anteriormentes los datos que se proporcionaban en Kaggle no tenian la columna de posiciones por ende tuvimos que calcular la velocidad de los caballos\n# argumentando que el caballo mas veloz deberia tener la primera posicion.\n\n#Tiempo despues los datos se actualizaron y nos dieron la columna de posiciones entonces decidimos hacer un cambio y comparar si nuestra teoria era cierta\n#entonces obtuviamos el caballo mas veloz y comparabamos con la posicion que quedaba esperando que esta sea el primer lugar, esto se realizo en todos los \n#numeros de carreras,fechas,id pistas, guardandose en un excel y calculando nuestro porcentaje de acertacion el cual acertamos un:\n#AQU= 54.74%\n#BEL= 70%\n#SAR= 52%\n#la tabla se puede ver en el sig repositorio https://github.com/ascary14/BIG-DATA-DERBY-CSV.git\n\n#Con esto nos damos cuenta que teniamos mas 50 % de acertacion pero al no ser un porcentaje tan alto decidimos trabajar con las posiciones que se nos acababan de proporcionar\n\n#El codigo siguiente muestra como fue este proceso (esto se replico las (n carreras)*(n fechas)) pero al ser una cantidad grande solo dejamos 1 muestra\n\nfrom concurrent.futures.process import _ExecutorManagerThread\n\n\nid_pista = \"AQU\"\n#####pusimos las fechas una por una \nfecha_carrera =\"2019-01-01\"\n#se creo  un ciclo para todos las carreras\ncuarto=4\nlevation = 0\n#for i in [1, 2, 3, 4, 5,6,7,8,9,10,11,12,13]: \"aqui comentamos el for porque se detiene en la (ultima carrera + 1)  y como esta no existe manda error\"\nfor i in [1, 2, 3, 4]:\n    numero_carrera = i\n    target_tracking = Todos_los_archivos_df.query(\"id_pista == @id_pista & fecha_carrera == @fecha_carrera& numero_carrera == @numero_carrera\").sort_values(\"recopilacion_cuarto\")\n    target_tracking\n    dtime = 0.25 #0.25 segundos por el cuarto de segundo en el que se publica el punto \n    #la elevacion se consigue con google _ExecutorManagerThread\n    if id_pista == \"AQU\":\n        elevation = 3\n    elif id_pista == \"BEL\":\n        elevation = 20\n    elif id_pista == \"SAR\":\n        elevation = 93\n\n    target_trackings = []\n    print(\"\")\n    print(\"*********** \")\n    contador=0\n    contador2=0\n    numero=0\n    for number, group in target_tracking.groupby(\"id_caballo\"):\n        ecef = np.array(pm.geodetic2ecef(group[\"latitud_caballo\"].values, group[\"longitud_caballo\"].values, np.array([elevation]*len(group)))).T\n        #Calculando la velocidad en  [km/h]\n        v_ecef = np.sqrt(np.sum(np.diff(ecef,axis=0) ** 2, axis = 1)) * 3.6 / dtime\n        group[\"tiempo\"] = group[\"recopilacion_cuarto\"] * dtime -  dtime #se crea gupo del tiempo, como el priemr tiempo es cero y lo toma como 1 le restamos los 25\n        group[\"velocidad\"] = np.insert(v_ecef, 0, 0)\n        \n        contador = np.mean(v_ecef)\n        if contador2<contador:\n            contador2=contador\n            numero=number\n   \n      \n        target_trackings.append(group)\n        \n    print(\"FECHA:\",fecha_carrera,\"CARRERA:\",i,\"EL MEJOR FUE.: \", numero,\"TIENE VELOCIDAD:{:.2f}\".format(contador2))\n    print(\"\")\n    print(\"DATOS DE TABLA COMPLETA\")\n    print(Todos_los_archivos_df.query(\"id_pista == @id_pista & fecha_carrera == @fecha_carrera& numero_carrera == @numero_carrera & id_caballo == @numero& recopilacion_cuarto == @cuarto\").sort_values(\"recopilacion_cuarto\"))\n    print(\"DATOS DE TABLA CON POSICIONES\")\n    print(datos_carreras_caballos_df.query(\"id_pista == @id_pista & fecha_carrera == @fecha_carrera& numero_carrera == @numero_carrera & id_caballo == @numero\"))\n    target_tracking = pd.concat(target_trackings)\n    target_tracking\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Todos_los_archivos_df.head(100)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# EMEPEZAMOS A QUITAR DUPLICADOS","metadata":{}},{"cell_type":"code","source":"##  Aqui ya empezamos a trabajar con las posiciones\n## Al publicarse una fila cada 0.25 seg nos genera un archivo duplicados de posiciones, caballos, fechas, etc. por ende decidimos eliminar las recopilacion de cuarto\n## Ademas al ya hacer uso de la longitud y latidud para graficar las pistas y para calcular la velocidad ya no vemos usos de ellas por ende tambien se eliminan \n\n## creamos un nuevo data frame \nTodos_los_archivos_sin_duplicados_df = Todos_los_archivos_df.copy()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#borramos variables de cuarto de segundo y latidud y longitud\n\n\nTodos_los_archivos_sin_duplicados_df= Todos_los_archivos_sin_duplicados_df.drop(columns=['recopilacion_cuarto','latitud_caballo','longitud_caballo'])\nTodos_los_archivos_sin_duplicados_df.head(100)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##vemos los duplicados\nTodos_los_archivos_sin_duplicados_df.duplicated()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##borramos los duplicados\n\nTodos_los_archivos_sin_duplicados_df=Todos_los_archivos_sin_duplicados_df.drop_duplicates()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#vemos si se borraron\nTodos_los_archivos_sin_duplicados_df.head(100)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##verificamos que ya no tenemos duplicados\nTodos_los_archivos_sin_duplicados_df.duplicated()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Remplazamos tipos objeto por float para la regresion","metadata":{}},{"cell_type":"code","source":"##La regresion solo funciona con datos numericos asi que las columnas : jockey, id pista, id_caballo, condicion_de_la_pista, tipo_terreno, tipo_Carrera no se mostrarian\n## Para solucionar esto decidimos cambiar el tipo de objeto a float, en este caso no se puede hacer si no cambiamos lo que esta dentro del objeto en este caso \"char\", \n## entonces al ser datos unicos les asignamos un dato numerico que lo identifique\n\n\n\n## Al momento de convertir los char a un dato nummerico perdemos variables en la columna \"id_caballo\" y \"condicion_de_la_pista\"   por ende estas no son remplazadas en jupyter pero si en excel \n## con \"buscar y remplazar\" \n## la tabla se puede obtener en el siguiente repositorio https://github.com/ascary14/BIG-DATA-DERBY-CSV.git\n\n## Por lo anterior solamente convertimos el dataframe sin duplicados a csv una sola vez para que dentro de excel remplazemos \"id_caballo\" y \"condicion_de_la_pista\"\n##Todos_los_archivos_sin_duplicados_df.to_csv('Todos_los_archivos_sin_duplicados.csv', index=False)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Agregamos valores a mano y leemos el excel","metadata":{}},{"cell_type":"code","source":"##Una vez tenido el csv replazado con las 2 columnas que se perdian lo hacemos dataframe \nTodos_los_archivos_sin_duplicados_df_remplazados = \"Todos_los_archivos_sin_duplicados_remplazados.csv\"\n\n\nTodos_los_archivos_sin_duplicados_df_remplazados_df = pd.read_csv(Todos_los_archivos_sin_duplicados_df_remplazados)\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##ahora cambiaremos nombres de corredores a identificadores numericos\n##Primero vemos como estan los datos\n\npd.options.display.max_rows=30\n\nprint(Todos_los_archivos_sin_duplicados_df_remplazados_df.drop_duplicates(subset = \"jockey\"))\nprint(type(Todos_los_archivos_sin_duplicados_df_remplazados_df.drop_duplicates(subset = \"jockey\")))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#contamos los jockeys\nTodos_los_archivos_sin_duplicados_df_remplazados_df[\"jockey\"].value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#cambiamos valores a enteros\nTodos_los_archivos_sin_duplicados_df_remplazados_df['jockey'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['jockey'].map({\n                            'Abner Adorno':'1',\n                            'Adam Beschizza':'2',\n                            'Adam Bowman':'3',\n                            'Adrian Flores':'4',\n                            'Alex Cintron':'5',\n                            'Andre Shivnarine Worrie':'6',\n                            'Andrea Atzeni':'7',\n                            'Andrea C. Rodriguez':'8',\n                            'Andrew Wolfsont':'9',\n                            'Angel Castillo':'10',\n                            'Angel Cruz':'11',\n                            'Angel R. Rodriguez':'12',\n                            'Angel Suarez':'13',\n                            'Anthony Salgado':'14',\n                            'Antonio A. Gallardo':'15',\n                            'Arienne Cox':'16',\n                            'Barry Foley':'17',\n                            'Ben Curtis':'18',\n                            'Benjamin Hernandez':'19',\n                            'Bernard Dalton':'20',\n                            'Brian Joseph Hernandez Jr.':'21',\n                            'Carlos J. Hernandez':'22',\n                            'Carol Cedeno':'23',\n                            'Channing Hill':'24',\n                            'Charles C. Lopez':'25',\n                            'Charlie Amaro':'26',\n                            'Chris Landeros':'27',\n                            'Christian Santiago Reyes':'28',\n                            'Christophe Soumillon':'29',\n                            'Christopher P. DeCarlo':'30',\n                            'Corey J. Lanerie':'31',\n                            'Cory Orm':'32',\n                            'Cristina Bonilla':'33',\n                            'Daisuke Fukumoto':'34',\n                            'Dalton Brown':'35',\n                            'Dana G. Whitney':'36',\n                            'Daniel Centeno':'37',\n                            'Danny Mullins':'38',\n                            'Darren Nagle':'39',\n                            'David Cohen':'40',\n                            'Declan Cannon':'41',\n                            'Declan Carroll':'42',\n                            'Dylan Davis':'43',\n                            'Dyn Panell':'44',\n                            'Edgar S. Prado':'45',\n                            'Edward Escobar':'46',\n                            'Edwin Rivera':'47',\n                            'Emanuel De Diego':'48',\n                            'Emisael Jaramillo':'49',\n                            'Emmanuel Esquivel':'50',\n                            'Eric Cancel':'51',\n                            'Erick Lopez':'52',\n                            'Feargal Lynch':'53',\n                            'Flavien Prat':'54',\n                            'Florent Geroux':'55',\n                            'Forest Boyce':'56',\n                            'Frankie Pennington':'57',\n                            'Gary Richards':'58',\n                            'Gavin Coetzee':'59',\n                            'Georgina Sergeon':'60',\n                            'Gerard Galligan':'61',\n                            'Graham Watters':'62',\n                            'Grant Whitacre':'63',\n                            'Harry Hernandez':'64',\n                            'Hector Rafael Diaz Jr.':'65',\n                            'Heman K. Harkie':'66',\n                            'Irad Ortiz Jr.':'67',\n                            'J. D. Acosta':'68',\n                            'Jack Doyle':'69',\n                            'Jaime Rodriguez':'70',\n                            'Jamie P. Spencer':'71',\n                            'Javier Castellano':'72',\n                            'Jeffrey Sanchez':'73',\n                            'Jeremias Flores':'74',\n                            'Jeremy Rose':'75',\n                            'Jevian Toledo':'76',\n                            'Joe Bravo':'77',\n                            'Joel Rosario':'78',\n                            'Joel Sone':'79',\n                            'Joey R. Martinez':'80',\n                            'Johan Rosado':'81',\n                            'John Bisono':'82',\n                            'John R. Velazquez':'83',\n                            'Jomar Garcia':'84',\n                            'Jomar Torres':'85',\n                            'Jorge A. Vargas Jr.':'86',\n                            'Jorge L. Vargas Jr.':'87',\n                            'Jorge M. Perez':'88',\n                            'Jorge Ruiz':'89',\n                            'Jose A. Bracho':'90',\n                            'Jose Angel Garcia':'91',\n                            'Jose Antonio Gallego':'92',\n                            'Jose Baez':'93',\n                            'Jose C. Ferrer':'94',\n                            'Jose F. Rojas':'95',\n                            'Jose L. Ortiz':'96',\n                            'Jose Lezcano':'97',\n                            'Jose R. Betancourt':'98',\n                            'Joseph Talamo':'99',\n                            'Jozef Bojko':'100',\n                            'Julian Pimentel':'101',\n                            'Julien R. Leparoux':'102',\n                            'Julio Correa':'103',\n                            'Junior Alvarado':'104',\n                            'Katie Davis':'105',\n                            'Keivan Serrano':'106',\n                            'Kendrick Carmouche':'107',\n                            'Kevin Carmona':'108',\n                            'Kevin Gomez':'109',\n                            'Kieran Norris':'110',\n                            'Kirk Johnson':'111',\n                            'Kody Kellenberger':'112',\n                            'Leonardo Corujo':'113',\n                            'Leonel Reyes':'114',\n                            'Luca Panici':'115',\n                            'Luis A. Rodriguez Castro':'116',\n                            'Luis Cardenas':'117',\n                            'Luis R. Reyes':'118',\n                            'Luis Saez':'119',\n                            'Manuel Franco':'120',\n                            'Mario Gutierrez':'121',\n                            'Mark Watts':'122',\n                            'Martin Chuan':'123',\n                            'Michael Hussey':'124',\n                            'Michael J. Luzzi':'125',\n                            'Michael Mitchell':'126',\n                            'Miguel A. Melendez':'127',\n                            'Mike E. Smith':'128',\n                            'Miyabi Muto':'129',\n                            'Mychel J. Sanchez':'130',\n                            'Nathan Vickers':'131',\n                            'Navin Mangalee':'132',\n                            'Nazario Alvarado':'133',\n                            'Nik Juarez':'134',\n                            'Oscar Gomez':'135',\n                            'Pablo Fragoso':'136',\n                            'Paco Lopez':'137',\n                            'Rachael Blackmore':'138',\n                            'Rafael Manuel Hernandez':'139',\n                            'Rajiv Maragh':'140',\n                            'Reylu Gutierrez':'141',\n                            'Ricardo Santana Jr.':'142',\n                            'Richard A. Bracho':'143',\n                            'Robbie G. Davis':'144',\n                            'Rosario Montanez':'145',\n                            'Ross Geraghty':'146',\n                            'Ruben Silvera':'147',\n                            'Sam Twiston-Davies':'148',\n                            'Samuel Camacho Jr.':'149',\n                            'Samuel Jimenez':'150',\n                            'Sean McDermott':'151',\n                            'Shannon Uske':'152',\n                            'Shaun Bridgmohan':'153',\n                            'Sheldon Russell':'154',\n                            'Silvestre Gonzalez':'155',\n                            'Sophie Doyle':'156',\n                            'Stephane Pasquier':'157',\n                            'Steven Ronald Bahen':'158',\n                            'Suguru Hamanaka':'159',\n                            'Talbert Howell':'160',\n                            'Tammi Piermarini':'161',\n                            'Thomas Garner':'162',\n                            'Tomas B. Mejia':'163',\n                            'Tony Piccone':'164',\n                            'Trevor McCarthy':'165',\n                            'Tyler Baze':'166',\n                            'Tyler Conner':'167',\n                            'Tyler Gaffalione':'168',\n                            'Tzeonn Chang':'169',\n                            'Victor Espinoza':'170',\n                            'Victor R. Carrasco':'171',\n                            'Vince Halliday':'172',\n                            'Virginia Tormey':'173',\n                            'Wayne Lordan':'174',\n                            'Weston Hamilton':'175',\n                            'William McCarthy':'176',\n                            'Wilmer A. Garcia':'177',\n                            'Winston R. Kay':'178',\n\n                             \n                             np.nan:'0'},\n                             na_action=None)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n## mostramos el cambio de datos char a numericos\nTodos_los_archivos_sin_duplicados_df_remplazados_df.head(3000)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##vemos si id caballo que se hizo aparte se ven los datos numericos\nTodos_los_archivos_sin_duplicados_df_remplazados_df[\"id_caballo\"].value_counts()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Como cambiamos variables valores en excel esto no se hace\n#Todos_los_archivos_sin_duplicados_df['id_caballo'] = Todos_los_archivos_sin_duplicados_df['id_caballo'].map({\n#                            '1':'2',\n#                            '2':'1',\n#                            '3':'3',\n#                            '4':'4',\n#                            '5':'5',\n#                            '6':'6',\n#                            '7':'7',\n#                            '8':'8',\n#                            '9':'9',\n#                            '10':'10',\n#                            '11':'11',\n#                            '12':'12',\n#                            '13':'13',\n#                            '14':'14',\n#                            '15':'15',\n#                            '16':'16',\n#                            '1A':'17',\n#                            '2B':'18',\n#                            '3X':'19',\n#                            '1X':'20',\n#                            \n#\n #                         \n  #                        \n   #                          \n#                             np.nan:'0'},\n#                             na_action=None)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n#como cambiamos valores en excel esto no se hace\n#Todos_los_archivos_sin_duplicados_df['condicion_de_la_pista'] = Todos_los_archivos_sin_duplicados_df['condicion_de_la_pista'].map({\n#                            'GD':'1',\n#                            'FM':'2',\n#                            'FT':'3',\n#                            'SY':'4',\n#                            'MY':'5',\n#                            'YL':'6',\n#                            'SF':'7',\n#                          \n#                             \n#                             np.nan:'0'},\n#                             na_action=None)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#cambiamos valores a enteros de tipo carrera\nTodos_los_archivos_sin_duplicados_df_remplazados_df['tipo_carrera'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['tipo_carrera'].map({\n                            'CLM':'1',\n                            'AOC':'2',\n                            'ALW':'3',\n                            'SST':'4',\n                            'STK':'5',\n                            'MSW':'6',\n                            'MCL':'7',\n                            'SOC':'8',\n                            'STR':'9',\n                            'WCL':'10',\n                            'WMC':'11',\n                            'SHP':'12',\n                           \n                             \n                             np.nan:'0'},\n                             na_action=None)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#cambiamos valores a enteros de id_pista\nTodos_los_archivos_sin_duplicados_df_remplazados_df['id_pista'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['id_pista'].map({\n                            'AQU':'1',\n                            'BEL':'2',\n                            'SAR':'3',\n                        \n                           \n                             \n                             np.nan:'0'},\n                             na_action=None)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n#cambiamos valores a enteros de tipo_terreno\n\nTodos_los_archivos_sin_duplicados_df_remplazados_df['tipo_terreno'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['tipo_terreno'].map({\n                            'D':'1',\n                            'O':'2',\n                            'I':'3',\n                            'T':'4',\n                            'M':'5',\n                        \n                           \n                             \n                             np.nan:'0'},\n                             na_action=None)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##rectificamos que no haya duplicados\nTodos_los_archivos_sin_duplicados_df_remplazados_df.duplicated()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Cambiamos los tipos de datos a float\nTodos_los_archivos_sin_duplicados_df_remplazados_df['tipo_terreno'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['tipo_terreno'].astype('float64')\nTodos_los_archivos_sin_duplicados_df_remplazados_df['id_pista'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['id_pista'].astype('float64')\nTodos_los_archivos_sin_duplicados_df_remplazados_df['tipo_carrera'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['tipo_carrera'].astype('float64')\nTodos_los_archivos_sin_duplicados_df_remplazados_df['id_caballo'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['id_caballo'].astype('float64')\nTodos_los_archivos_sin_duplicados_df_remplazados_df['jockey'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['jockey'].astype('float64')\nTodos_los_archivos_sin_duplicados_df_remplazados_df['condicion_de_la_pista'] = Todos_los_archivos_sin_duplicados_df_remplazados_df['condicion_de_la_pista'].astype('float64')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Verificamos que se hayan cambiado los tipos \"vemos que si\"\nTodos_los_archivos_sin_duplicados_df_remplazados_df.dtypes","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#aqui ya todos pueden ser categoricos\natributos_español = [\"id_pista\",\"fecha_carrera\",\"numero_carrera\",\"id_caballo\",\"recopilacion_cuarto\",\"latitud_caballo\",\"longitud_caballo\",\"distancia\",\"tipo_terreno\",\"condicion_de_la_pista\",\"distancia_en_pies\",\"tipo_carrera\",\"dinero_dos_decimales_USD\",\"hora_de_carrera\",\"peso_llevado\",\"jockey\",\"posibilidades_de_ganar\",\"Posicion\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"atributos_categoricos = [\"id_pista\",\"fecha_carrera\",\"numero_carrera\",\"id_caballo\",\"recopilacion_cuarto\",\"latitud_caballo\",\"longitud_caballo\",\"distancia\",\"tipo_terreno\",\"condicion_de_la_pista\",\"distancia_en_pies\",\"tipo_carrera\",\"dinero_dos_decimales_USD\",\"hora_de_carrera\",\"peso_llevado\",\"jockey\",\"posibilidades_de_ganar\",\"Posicion\"]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"##vemos que si todos lo son\nlist(set(atributos_español).difference(atributos_categoricos))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Hacemos matiz de correlacion ","metadata":{}},{"cell_type":"code","source":"##Al hacer el cambio de tipos de datos todas las columnas pueden verse en una matriz de correlacion \ncorr = Todos_los_archivos_sin_duplicados_df_remplazados_df.corr()\nsns.set(rc = {'figure.figsize':(20,10)})\nsns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True),linewidths=.5)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## Para ver la relacion de las variables utilizamos la matriz de correlacion lo que indica  -1 correlacion lineal perfectamente negativa, 0 no hay correlacion lineal, \n# 1 indica una correlacion lineal perfectamente positiva, cuando mas lejos este el numero generado de dos columnas (x,y) de 0 mas fuerte sera la relacion entre ellas.\n\n#Vemos que las que tiene mayor relacion son: (posibilidades de ganar, posicion)= 0.47\n#Vemos que las que tiene mayor relacion son: (tipo terreno, condicion de la pista )= -0.51\n#Vemos que las que tiene mayor relacion son: (tipo terreno, distancia en pies )= 0.52\n#Vemos que las que tiene mayor relacion son: (distancia en pies, tipo terreno)= 0.52\n#Vemos que las que tiene mayor relacion son: (condicion de la pista, tipo terreno)= -0.51\n#Vemos que las que tiene mayor relacion son: (peso llevado, distancia)=0.35\n#Vemos que las que tiene mayor relacion son: (distancia, peso llevado)=0.47\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Realizamos la regresion","metadata":{}},{"cell_type":"code","source":"#En X estaran estas columnas para las diferentes regresiones que vimos \nX=Todos_los_archivos_sin_duplicados_df_remplazados_df[['peso_llevado', 'posibilidades_de_ganar', 'distancia','tipo_terreno','posicion','id_caballo','condicion_de_la_pista']].to_numpy()\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#En Y solo agregamos posibilidades de ganar pero en nuestras pruebas se cambiaba a diferentes atributos\ny=Todos_los_archivos_sin_duplicados_df_remplazados_df.posibilidades_de_ganar.to_numpy()\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#En X seleccionamos uno de los atributos del arreglo \nX = X[:,np.newaxis,4]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Entrenamos los datos\nsize = int(len(X)*.10)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = X[:-size]\nX_test = X[-size:]\ny_train = y[:-size]\ny_test = y[-size:]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"regr = linear_model.LinearRegression()\nregr.fit(X_train, y_train)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_est= regr.predict(X_test)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"La media del error al cuadrado: %.2f\" % mean_squared_error(y_test, y_est))\nprint(\"Coeficiente de detrminacion: %.2f\" % r2_score(y_test, y_est))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nplt.title('Regresion lineal')\nplt.xlabel('Posicion')\nplt.ylabel('Posibilidades_de_ganar')\nplt.scatter(X_test, y_test, color='green')\nplt.plot(X_test, y_est,color='blue', linewidth=3)\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Conclusiones ","metadata":{}},{"cell_type":"code","source":"#Se puede observar en la gráfica de regresión el que tiene mayor relación son los puntos de posibilidades de ganar, con posición, lo cual es congruente con los datos analisados.\n ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## ANEXOS","metadata":{}},{"cell_type":"code","source":"#dIFERENTES TIPOS DE GRÁFICA QUE PODEMOS OBTENER.\n\nsns.pairplot(Todos_los_archivos_sin_duplicados_df_remplazados_df)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}