2022/07/31

S4 Cierre

Cierre Semana 4

Muchos de los problemas actuales a los que se enfrenta un científico de datos involucran el manejo de grandes cantidades de información, por lo que es necesario que se organicen bases de datos donde es posible almacenar y consultar la información de una forma práctica y sencilla.

En esta semana hemos explorado los conceptos fundamentales relacionados con las bases de datos, así como los principales tipos de bases de datos que se utilizan actualmente. También trabajamos con pocas instrucciones del lenguaje SQL, para poder manipular bases de datos ya existentes o crear nuevas bases de datos. Gracias a la paquetería Pandas pudimos integrar el nuevo conocimiento a Python con lo que podremos generar nuevos y más complejos códigos.

Tu carrera de científico de datos sigue creciendo y esperamos que a esta altura ya cuentes con herramientas que te permitan empezar a desarrollar tus primeros proyectos donde puedas utilizar Python para obtener información desde sitios web, manipular grandes volúmenes de datos e incluso visualizar de forma clara y precisa la información más valiosa de un conjunto de datos.

Muchos de los problemas actuales a los que se enfrenta un científico de datos involucran el manejo de grandes cantidades de información.

Generalmente las empresas almacenan la mayoría de su información en una base de datos.
Por ello es indispensable para nosotros como científicos de datos consultar esa información de manera eficaz.

En esta semana hemos explorado los conceptos fundamentales relacionados con las bases de datos así como los principales tipos de bases de datos que se utilizan actualmente.

También trabajamos con unas cuantas instrucciones del lenguaje SQL para poder manipular bases de datos ya existentes o crear nuevos registros en las bases de datos.

Gracias a la paquetería Pandas pudimos integrar el nuevo conocimiento a Python con lo que podemos generar nuevos y más complejos códigos.

Tu carrera de científico de datos sigue creciendo y esperamos que a esta altura ya cuentes con las herramientas que te permiten empezar a desarrollar tus primeros proyectos donde puedes utilizar python para poder obtener información desde sitios web, manipular grandes volúmenes de datos e incluso visualizarlos de una forma clara y precisa, y que sepas encontrar la información más valiosa de un conjunto de datos de la manera más eficaz.

S4 Qué es una Base de Datos NOSQL

¿Qué Es Una Base De Datos NOSQL?

Cuando se habla de entornos de base de datos o de desarrollo de aplicaciones web, cada vez es más frecuente el uso del término NoSQL. Pero, ¿qué es una base de datos NoSQL? 

Las bases de datos NoSQL están diseñadas para varios patrones de acceso a datos que incluyen aplicaciones de baja latencia. Las bases de datos de búsqueda NoSQL están diseñadas para hacer análisis sobre datos semiestructurados. El modelo relacional normaliza los datos en tablas conformadas por filas y columnas.


NoSQL (a veces llamado "no solo SQL") es una amplia clase de sistemas de gestión de bases de datos que difieren del modelo clásico de SGBDR (Sistema de Gestión de Bases de Datos Relacionales) en aspectos importantes, siendo el más destacado que no usan SQL como lenguaje principal de consultas. Los datos almacenados no requieren estructuras fijas como tablas, normalmente no soportan operaciones JOIN, ni garantizan completamente ACID (atomicidad, consistencia, aislamiento y durabilidad) y habitualmente escalan bien horizontalmente. Los sistemas NoSQL se denominan a veces "no solo SQL" para subrayar el hecho de que también pueden soportar lenguajes de consulta de tipo SQL.


los investigadores académicos se refieren a este tipo de bases de datos como almacenamiento estructurado, término que abarca también las bases de datos relacionales clásicas. A menudo, las bases de datos NoSQL se clasifican según su forma de almacenar los datos, y comprenden categorías como clave-valor, las implementaciones de BigTable, bases de datos documentales, y bases de datos orientadas a grafos.

Los sistemas de bases de datos NoSQL crecieron con las principales redes sociales, como Google, Amazon, Twitter y Facebook. Estas tenían que enfrentarse a desafíos con el tratamiento de datos que las tradicionales SGBDR no solucionaban. Con el crecimiento de la web en tiempo real existía una necesidad de proporcionar información procesada a partir de grandes volúmenes de datos que tenían unas estructuras horizontales más o menos similares. Estas compañías se dieron cuenta de que el rendimiento y sus propiedades de tiempo real eran más importantes que la coherencia, en la que las bases de datos relacionales tradicionales dedicaban una gran cantidad de tiempo de proceso.

En ese sentido, a menudo, las bases de datos NoSQL están altamente optimizadas para las operaciones recuperar y agregar, y normalmente no ofrecen mucho más que la funcionalidad de almacenar los registros (p.ej. almacenamiento clave-valor). La pérdida de flexibilidad en tiempo de ejecución, comparado con los sistemas SQL clásicos, se ve compensada por ganancias significativas en escalabilidad y rendimiento cuando se trata con ciertos modelos de datos.

El siguiente artículo te será útil para complementar el tema.

https://blogs.oracle.com/


S4 Qué es NOSQL

¿Qué es NOSQL?

Ahora vera qué son las bases de datos NOSQL.

Ya ha visto las SQL, las has trabajado en Python.

Ahora vera otro tipo de formas en las que se representa nuestra información.

Para eso preparamos una libreta igual que la de cuando abordamos el tema de base de datos SQL, es una libreta teórica que contiene pequeños ejemplos que te permiten visualizar cómo funciona las base de datos NOSQL.

Bueno, en esta libreta se presentan una, dos, tres formas diferentes de administrar tu información en bases de datos del tipo NOSQL.

Las bases de datos Clave - Valor, mejor conocidas por su nombre en inglés "Key Value" son las bases de datos NOSQL donde a cada elemento conocido como valor se le asocia una llave única que permite el acceso a esa información, conocido como "llave".

Entonces, este ejemplo que tiene en particular la llave que el usuario 1 está asociada a un valor, el valor número 14 que contiene el elemento Mary, la llave usuario 2 está asociada al elemento 1 que contiene el valor Mike y la llave usuario 3 está asociada al elemento 2 que contiene el valor de John.

Entonces, a cada una de las llaves se le asigna específicamente un elemento que tiene un valor.

Este tipo de base de datos permite la recuperación de la información de una manera muy rápida y además se caracterizan por ser muy eficientes no solo para leer información sino también para escribir la nueva información en la base de datos.

Otro tipo de base de datos es la base de datos grafo.

Las bases de datos de grafos representa la información a través de la teoría de grafos.
A cada elemento se le asigna un grafo y las relaciones entre ese elemento y otros quedan representados por las aristas o conexiones entre los nodos del grafo.

Entonces, este tipo de bases de datos no solo me permiten visualizar de una manera sencilla la información sino que su principal fuerza es que nos permiten visualizar de manera sencilla las relaciones que existen entre esa información.

Nos permiten saber exactamente cómo un dato se relaciona con otro, en qué sentido se relacionan o de qué manera se relacionan.

A las aristas se les puede muchas veces incluir una especie de etiqueta en la que se definan más visualmente de qué forma está relacionada la información.

El último ejemplo de base de datos SQL que veremos son las bases de datos documentales.

En las bases de datos documentales, como su nombre lo dice, toda la información se escribe en un solo documento que usualmente es en algún formato sencillo.

Por ejemplo, xml.

Pero bueno, a través de una clave única se puede accesar a cada registro de este documento.

En este caso nuestra ilustración nos dice que hay un documento de fondo en el que está toda la información y al accesar a un registro nosotros podemos ver cierta información en específico.

Esa información puede contener diferentes datos similar a como funcionaría un objeto en programación.

Este tipo de bases de datos no sólo permite realizar búsquedas similares a las bases de datos clave - valor que vimos anteriormente sino que también nos permite realizar consultas más avanzadas sobre el contenido del documento.

El objetivo de este curso escapa un poco de las dimensiones de explorar estas de una manera práctica pero nos interesa que sepas que las bases de datos NOSQL han cobrado popularidad debido a que las bases de datos SQL se ven un poco limitados al momento de escalar para resolver problemas del tipo de big data.

Entonces, ahora que estás iniciando tu carrera de analista de datos es conveniente que sepas que existen alternativas para cada una de las bases de datos a las que tú te enfrentes, hazlo con la misma confianza, toma tu tiempo, busca alternativas, busca una forma cómoda y no olvides que limpiar los datos, visualizarlos, te va a permitir a ti entender qué es lo que quieres analizar de estas bases de datos.

S4 PANDAS con SQL

PANDAS CON SQL

Vamos a ver lo que es Pandas conectado a SQL.

Para ello vamos a abrir el cuaderno "Pandas con SQL".

Lo que es importar para la base de datos en este momento, que sigue siendo la misma, la de fútbol soccer, y se va hacer una consulta.

Seleccionar de la tabla liga, el nombre de la liga.

Va a decirle a la tabla partidos: los goles como equipo de casa, los goles como equipo de visitante y la fecha de ese partido.

¿De dónde? De un join, es decir, una combinación de tablas de la tabla liga y de la tabla partidos.

¿Con respecto a qué campo? Al campo league_id de match y id de liga.

Estos dos tienen que ser iguales para que se puedan asociar los registros de las dos tablas.

Ahora, se va a utilizarlo con Pandas.

Lo que ha estado haciendo en ese momento es decirle: SQL lite3, crea una conexión y con el cursor ejecuta esta consulta.

Pandas puede hacer todo eso de forma automática, solamente se le dice qué consulta va a ejecutar y cuál es la conexión que va a utilizar para ejecutar la consulta.

Importar Pandas como lo hace normalmente, que es import Pandas as pd, y le dice "Pandas, lee SQL", es decir, va a ejecutar la consulta en una conexión.

Si se tiene un motor de base de datos ya más pesado el cual da consultas de gran nivel simplemente va a reemplazar los datos de la conexión.

Por eso es conveniente utilizar SQL lite porque al final de cuentas con Pandas solamente hay que cambiar eso, y se tiene una conexión lista para producción.

Entonces, lo ejecuta, tarda un poquito en cargar Pandas la primera vez que lo importamos, y ahora sí, ya guardó la consulta en la variable "df".

Al darle la función head y va a imprimir los cinco primeros registros, ya en una forma tabulada en Pandas como esta acostumbrado a verlo, va a decir que hay un nombre de la liga, el número de goles como el equipo de casa y el número de goles como visitante y aparte una fecha.

Entonces ya indica la consulta SQL, ya lo ejecutó y el data frame de Pandas como ya los sabe se puede hacer mil cosas.

Se puede transformarlo como quiera.

Por ejemplo, va a agregar una quinta columna la cual sea la diferencia de goles.

Puede decirle "de df dame los goles como equipo de casa y restarle los goles como visitante y da un valor absoluto de esos dos".

Se guarda, seimprime otra vez los cinco primeros registros, y ahora sí, ya da las diferencias de goles.

Una vez que calculamos la diferencia entre los goles de casa con visitante podemos imprimirlos fácilmente con, otra vez, la función head.

Lo generamos, y podemos ver, por ejemplo, en el primer caso, que fue un partido 1 - 1.
La diferencia de goles es 0.
En el caso del tercero, por ejemplo, fue 0 goles en casa y 3 como visitante, entonces la diferencia de goles es 3.
Entonces, ya estamos haciendo ingeniería de datos, estamos agregando datos a la tabla de una forma sencilla gracias a Pandas, y esto lo podemos manipular a la escala que queramos porque podemos escalarlo a múltiples tablas, a múltiples consultas, múltiples manipulaciones.
Ahora, como tenemos Pandas como nuestro respaldo podemos utilizar los ordenamientos que hemos estado utilizando.
Por ejemplo, vamos a ordenar a través de esta nueva columna que acabamos de generar y vamos a decirle que los ordene de mayor diferencia de goles a menor diferencia de goles.
Entonces, aquí tenemos los partidos.
Por ejemplo, en la liga de Holanda tenemos un partido que fue 10 - 0, una super goliza, en la liga francesa tenemos un 0 - 9 que curiosamente fue como visitantes, tenemos en la liga escocesa un 9 - 0.
Entonces estos son diferentes partidos que pudimos hacer una selección específica gracias a la diferencia de goles que utilizamos o que agregamos.
Además también podemos, como estamos trabajando junto con Pandas, podemos hacer graficaciones.
Vamos a importar matplotlib, que ya hemos estado utilizando, y podemos utilizar además seaborn, que son estilos de gráficas un poquito más estilizadas, y vamos a hacer una gráfica la cual en el eje de las "x" tiene los goles de casa, en el eje de las "y" los de visitante y nuestro conjunto de datos es el data frame.
Entonces, si nosotros lo graficamos, tarda un poquito porque está procesando.
Aquí está.
Hacemos la gráfica y nos da estos valores.
Nos dice dónde está la concentración de los goles en casa, nos da la concentración de los partidos...
de los goles como visitante y nos da la distribución de estos dos ejes que son goles como casa contra visitante.
Se puede ver por las manchitas que tenemos aquí que la mancha más intensa está alrededor del 1 - 1.

Esto nos dice que el resultado más común en los partidos europeos es el 1 - 1, seguido del 1 - 0 donde el equipo de casa anota al menos un gol.

Esta escala se crece hasta acá por los datos que teníamos de golizas, por ejemplo, el 10-0, el 9-0, todo eso se va a hacia los extremos, que son valores muy alejados del grueso de los datos, por lo tanto pues no se alcanzan a percibir.

Pero ahí están, por eso sale la gráfica con estos tamaños.

Este concluye los ejercicios que hemos tenido preparados para ustedes donde hacemos consultas a la base datos, hacemos inserciones, hacemos actualizaciones, incluso eliminamos campos de la base de datos, los pudimos traer a Pandas y pudimos trabajarlos ya en el entorno con el que estamos más familiarizados: con Pandas.

SQL es necesario en el data science porque cuando llegamos a la industria por lo general ahí es donde están las colecciones de datos importantes: en SQL.

Entonces, es importante poder conocer cómo extraer la información de ahí, traerla a nuestro ambiente de trabajo, que es Python, poderlo procesar con Pandas y poder hacer nuestro análisis de datos.

S4 Modificando Tabla con Update y Delete

Modificando La Tabla Con Update Y Delete

Ya hemos hecho inserciones a la base de datos.

Además hemos hecho selección de qué es la información que queremos ver, hemos hecho joins.

Ahora, ¿qué tal si ya tenemos información en la base de datos y queremos actualizarla o digamos que la queremos eliminar? Entonces esas son instrucciones que nos faltan.

Para ello vamos a utilizar el cuaderno "modificando con update y delete".

Vamos a abrirlo.

Vamos a ver la cláusula update, en esta la sintaxis varía un poco pero en realidad es muy sencilla de entender.
Update nos ayuda para realizar una consulta que en realidad de seleccionada información va a actualizar la información que está en la base de datos.
Entonces, estas update también se pueden utilizar con la cláusula where.
Nos va a especificar qué registros de la base de datos queremos modificar para no tener que modificar toda la tabla.
La sintaxis similar es la siguiente: tenemos la palabra update que hace referencia a una tabla en específico, luego sigue acompañado de la palabra reserva set, que la traducción sería asignar, entonces le podemos decir "en la columna 1 asigna el valor 1, en la columna 2 asigna el valor 2".
Todo esto separado por comas y utilizando el operador igual para poder asignar.
Eso lo vamos a hacer para el número de columnas que queremos modificar los valores y le vamos a decir que solamente modifique a aquellos registros donde la condición se cumpla.
Vamos a utilizar SQL lite otra vez, la conexión es idéntica a como lo hemos estado utilizando, vamos a importar la base de datos del fútbol soccer y tenemos nuestro objeto conexión.
La conexión vamos otra vez a extraer un cursor que nos va a decir en dónde está de la base de datos y le vamos a hacer una selección para nosotros visualizar qué es lo que contiene nuestra base de datos.
Entonces vamos a seleccionar todos los jugadores.
Nos los imprime de esta manera.
entonces vamos a seleccionar algún jugador en específico.
Vamos a seleccionar el 103.
Vamos a escoger a Adam Federici.
Y a el vamos a tratar de cambiarle los valores, tal vez hubo un error a la hora de tipearlo y hay que actualizarlo.
Entonces le vamos a decir "update (actualiza) en la tabla player", y le vamos a asignar una altura de 190 y un peso de 170, ¿a quién? Bueno, a aquellos registros que tengan un Id de 103, nosotros sabemos que el 103 corresponde a Adam Federici, que él tiene un peso de 187 y una altura de 198.
Entonces, vamos a ver si se actualizan, lo hacemos si nos da el cursor no hay nada que nos haga referencia a que se hizo efectivamente o no pero podemos volver a hacer el select.
Vamos a usar un select más específico, vamos a decirle "donde Id es igual a 103".
Notarán que aquí utilizamos web en mayúsculas y acá abajo where con minúsculas, SQL lo interpreta exactamente igual, no hay ningún problema, pero es costumbre utilizarlo en mayúsculas todas estas palabras reservadas de SQL.
Entonces vamos a corregirlo, y ahora sí.
Vamos a seleccionar de la tabla player en donde el Id sea igual a 103 y eso nos trae a Adam Federici ya con los datos actualizados: la altura es de 190 y el peso es de 170.
Entonces, la cláusula update es muy sencilla de utilizar, simplemente le decimos reemplaza estos valores en estos registros y se acabó.
Es muy sencillo.
Por otro lado tenemos delete.
Delete se utiliza para eliminar los registros que ya no queremos en nuestra base de datos.
La estructura es muy similar a select, simplemente le decimos "delete ( o sea, elimina) de la tabla name donde se cumple esta condición".
Entonces le vamos a decir a la conexión ejecuta este, si se fijan aquí ya no estamos utilizando el cursor, nada más le estamos diciendo directamente a la conexión, "elimina de la tabla player donde el Id es igual a 103", es decir, nos vamos a deshacer de Federeci, lo ejecutamos y nos da pues simplemente un cursor, no nos dice bien, mal, no nos dice nada.
Lo que podemos hacer es consultarli Vamos a hacer la misma consulta de arriba: select (selecciona) from la tabla player donde (where) Id es igual a 103.
Lo imprimimos y vemos que no nos imprimió nada.
Lo que pasa es que cuando fue a buscar el Id 103 no lo encontró, y como no encontró nada pues no nos imprime nada.
No nos va a decir "no existe".
Simplemente nos va a decir nada.
Estos cambios, como los estamos haciendo en SQL, hay que buscar la manera de que sean permanentes, esto lo está haciendo en memoria.

Esto lo hacemos con esta función "conexión commit (conn_commit)", ahorita no la vamos a ejecutar porque no queremos alterar nuestros archivos de forma permanente, pero si ustedes están modificando los archivos, bueno, su base de datos en algún proyecto pues seguramente quieren los cambios permanentemente.

Ya se vio dos funciones nuevas que es update y delete, que son indispensables en el uso de bases de datos que nos van a servir de mucho cuando empecemos a administrar información de ahí.

Tal vez queremos eliminar información que está mal tipeada, que es información sucia, o tal vez queremos actualizarla y corregirla para que nuestra base de datos quede lista para poder hacer nuestro proceso de data mining o de data science.
Los espero en el próximo video para poder ver cómo podemos implementar todo esto que hemos estado viendo en SQL y verlo con lo que nosotros ya sabemos hacer en nuestras carpetas de Pandas.
 

S4 SELECT WHERE y JOIN

SELECT, WHERE Y JOIN

Ahora veremos las funcionalidad de select de una forma más avanzada.
Lo utilizaremos con la cláusula where.
Además empezaremos a utilizar unos conceptos llamados join.
Vamos a empezar.
La carpeta que vamos a estar utilizando, si lo recuerdan, la llamada cuadernos,C en su caso está guardado en el escritorio.
Entonces nosotros ya lo tenemos abierto aquí con Jupyter.
Entonces vamos a "Select, Where y Join".
Lo abrimos, esperamos un momento a que cargue.
Y ahora sí, ya lo tenemos.
Where, lo específico de where es que nos permite seleccionar ya más específico qué registros queremos de la base de datos, no nada más obtener todo.
Ya cuando escalamos a niveles grandes de industria, digamos, no vamos a estar jalando la base de datos completa en nuestra computadora, es más, ni siquiera va a caber en nuestra memoria RAM.
La función where nos va a ayudar a delimitar un poco qué es lo que nos podría servir y qué es lo que no nos podría servir.
Tiene una sintaxis muy similar a select, es más, es un agregado a la sintaxis de select donde tenemos select, seleccionar, columna 1, 2, hasta n, de tabla tal, donde hay una condición.
Esta condición por lo general hace referencia a los elementos de la tabla que estamos seleccionando.
Las base de datos que hemos estado utilizando es la european soccer data base, como en videos anteriores, y la vamos a seguir utilizando.
Para ello vamos a utilizar import SQL Lite 3, la versión reducida de motor de base de datos que nos funciona para nuestros ejemplos, y de forma similar vamos a utilizar la ruta de nuestro archivo: data/soccer/database.sqlite y vamos a hacer la conexión.
Una vez que ya está realizado ese elemento de la conexión ya empezamos a hacer consultas, y vamos a empezar a construirlas de forma similar a como lo hemos hecho, con select.
Vamos a decir "selecciona todo de la tabla player", pero hay una restricción, le vamos a decir "dónde height es mayor a 200", este height ¿a qué hace referencia? Bueno, recordemos nuestra tabla player, nuestra tabla player dice que tiene la columna player id, player name, player fifa api, birthday, height y weight.
Este height específico de aquí se llama idéntico a como lo tenemos acá.
Es más, nosotros podemos decirle explícitamente player.height, el cual no le va a indicar a SQL que este height al que no estamos refiriendo es de la tabla player.
Al ser la única tabla en nuestra consulta pues esto lo podemos omitir y simplemente llamarle height y va a funcionar exactamente igual.
Ok, entonces ¿cuáles son los elementos que nos arrojó? Nos arrojó este jugador, por ejemplo, Abdoul Ba que tiene una altura de 200.66, que apenitas pasa el filtro que nosotros impusimos que era mayor a 200, pero entró.
Es es una condición verdadera, entonces lo tomamos.
Así mismo pasaron todos estos jugadores.
Ya están filtrados de nuestra base completa que era de 11,060 jugadores en total.
Entonces de todos esos, nada más estos que nos presentó tienen una altura mayor a 200.
Entonces a partir de ahí ya se empieza a ver un poco el valor de la cláusula where.
Bueno, pero ¿qué más podemos hacer? Lo que podemos hacer es tomar dos tablas y combinarlas, pero sólo se van a combinar si ciertos parámetros son verdaderos o ciertas restricciones, por ejemplo, podemos tomar select con el asterisco, selecciona todo, de country y league.
Si recuerdan son dos tablas diferentes: country y league, aquí están cada una con sus respectivas columnas.
Donde el country Id, es decir el Id de la tabla country, sea igual al country Id de la liga, es decir que este de aquí, country Id, sea igual a este de acá.
Ok.
Una vez hecho eso lo imprimimos y nos va a dar esta consulta ya construida que nos va a decir: para el país Bélgica tiene una liga Jupiler Bélgica.
Entonces, ya corresponde el país a la liga de donde corresponde, pero pues esto se ve un poco sucio, verdad, porque tenemos estos...
unos regados, tenemos el 1,729, son valores que no necesitamos realmente.
Entonces, aquí yo les comenté esta parte de aquí que podemos decir que nada más queremos country.name y league.name.
No queremos lo demás, no nos interesa, nada más queremos esos dos valores.
Ok.
A ver, aquí hay un error.
Es...
Hay un error.
Ahora sí.
Nos dice que Bélgica tiene la liga Jupiler, Inglaterra tiene la liga Premier, Francia tiene la France League 1 y así en adelante.
Entonces, con esto, con select, where, ya podemos combinar valores de dos tablas que nos interesan.
Bueno, pero esto, aparte de hacerlo con la cláusula where, se puede hacer con un join.
Join es una cláusula muy especial en SQL la cual nos permite combinar valores de varias tablas (dos, tres o más tablas), en específico vamos a hablar de dos.
Entonces, como se ve esta relación ya gráficamente es, tenemos todos los elementos que se encuentran en la tabla A y todos los elementos que se encuentran en la tabla B, el join solamente nos va a dar los valores donde los elementos de la tabla A y los elementos de tabla B coinciden, que se representa en este diagrama de Venn.
Y ¿cómo se representa este join? Bueno, aquí dice la consulta compara cada fila de la tabla 1 con cada fila de la tabla 2 para encontrar todos los pares de filas que satisfacen una condición de unión.
Cuando se cumple el predicado los valores de la columna para cada par de filas coincidentes de B y B se combinan en una fila de resultados.
Este tipo de uniones, el Inner Join, es el tipo más común y es de hecho el predeterminado.
Si nosotros hablamos de un join, la gente normalmente se imagina el Inner Join.
De hecho, la palabra inner se puede usar de manera opcional, se puede omitir, simplemente utilizar el join, y la sintaxis para utilizarlo en SQL es muy simple, solamente se utiliza el select, ¿qué es lo que queremos ver?, de, ¿qué tabla?, pero unida a qué otra tabla.
Es tabla 1 unida la tabla 2.
Pero debe haber una condición, y esto le llamamos con la palabra "ON." Entonces vamos a hacer una traducción sencilla o simple de esta sintaxis: selecciona columna 1, 2, n, de la unión de tabla 1 con tabla 2 con esta condición.
Hay otros tipos de joins.
Tenemos intersección derecha o join derecho, tenemos intersección izquierda, tenemos intersección de extremos, en particular en este curso como es la más popular solamente vamos a utilizar la inner join.
Entonces vamos a ver cómo funciona.
Vamos a aplicar la sintaxis.
Utilizamos select todo de country unido...
unido a la tabla liga en una condición: que el country Id sea igual al country Id de la tabla liga.
Entonces la hacemos y lo ejecutamos y nos da este resultado que es idéntico al que teníamos acá arriba cuando nada más seleccionamos el todo.
Esto de aquí es idéntico a lo que tenemos acá abajo.
Gracias al inner join podemos hacer consultas un poco más complejas, por ejemplo, para empezar aquí hay una diferencia grande porque qué tal si empezamos a conseguir una consulta más grande, podemos utilizar estos tres caracteres que son las comillas las cuales nos van a permitir hacer una consulta en varias líneas y para ello vamos a utilizar dos tablas: vamos a utilizar la de la liga y la de los partidos.
Vamos a pedirle que nos dé los partidos donde el gol de casa sea mayor a 5.
Entonces vamos a empezar a construirla.
Le vamos a decir "selecciona el nombre de la liga, selecciona el número de goles de como equipo de casa de la tabla match, similarmente selecciona el número de iguales como visitante de la tabla match y la fecha de ese partido".
¿De dónde vamos a seleccionar esa información? De un join.
Aquí se los voy a subrayar.
Donde estamos haciendo un join de la tabla liga con la tabla partido o match pero en una variable en específico que es el Id de la liga en la tabla match junto con el Id de liga.
Aquí es donde podemos eliminar la condición where donde le vamos a decir "de la tabla match solo quiero cuando los goles de casa sean mayores a 5", no 5, solamente mayores.
Ok, entonces, si ejecutamos esto...
tarda un poquito más...
nos da los partidos.
Entonces, nos dice: de la liga de Bélgica hubo un partido en el 2008 que fue un 7 a 1.
7-1 sería porque como tenemos primero el, como goles en casa, pues nos está diciendo que ese equipo en casa metió siete goles y recibió uno en contra.

Entonces fue una goliza, podemos decir.

Asimismo empezó a darnos todo el historial de partidos donde existen que el equipo de casa tiene más de 5 goles.

Entonces, con eso podemos conseguir una consulta ya más compleja, ¿por qué? porque utilizamos un inner join para unir dos tablas diferentes y a partir de eso aplicamos un filtro con where.

Entonces así es como se empiezan a construir consultas ya más complejas.

Ya estamos utilizando select, estamos utilizando join y estamos utilizando where.

De forma similar con alguna base de datos que tengas por ahí o que hayas encontrado en kaggle puedes empezar a practicar y pueden realizar consultas complejas como esta.

S4 Select Parte 2

Select: Parte 2

Entonces, hay un montón de información relacionada a la liga de fútbol soccer.

Bueno, pero entonces ¿cómo empezamos a hacer consultas a la base de datos? Dijimos que vamos a utilizar nuestro objeto conexión.

Entonces, a conexión le podemos decir "dame un curso".

El cursor lo pueden imaginar como si fuera el puntero del mouse de una computadora, va a apuntar a una posición específica de una tabla o de una base de datos.

Entonces, podemos nosotros hacer un cursor y lo vamos a llamar objeto cursor.
Es un elemento específico.
Y le vamos a decir "objeto cursor, ejecuta la siguiente consulta SQL", y esta consulta SQL tiene que tener la estructura o la sintaxis que les mencionamos acá arriba: select estas columnas de la tabla.
Entonces, qué le estamos pidiendo, le estamos diciendo "selecciona el nombre del jugador de la tabla player".
La tabla player la tenemos aquí.
¿Qué columnas tiene? pues todas estas de aquí.
Y en específico hay una que se llama player name.
Entonces, estamos diciendo a la base de datos "dame todos los nombres de la tabla jugadores.
Una vez que se ejecutó esta consulta le tenemos que decir fetchall.
Fetchall lo que nos va a hacer es: va a ir a la base de datos y nos va a traer todos los registros, es decir, todos los jugadores pero delimitados, solamente a las columnas específicas que queremos.
Y lo vamos a meter en un ciclo for, ¿para qué? para que primero imprima el primer registro, luego el segundo registro, hasta que recorra todos los registros de la tabla, y luego los imprimimos.
Entonces, si lo hacemos nos va a dar directamente los jugadores de las diferentes ligas de la liga europa...
y ya nos da todos estos que son muchísimos.
Ahora, pero tal vez queremos no un nombre, tal vez queremos las alturas.
Bueno, repetimos el mismo proceso.
Le decimos "conexión, dame un cursor", le llamamos objeto cursor, le decimos "ejecuta la siguiente consulta: selecciona la altura de la tabla player", y decimos "dame todos y recorrelos dentro de un ciclo for", a cada registro le vamos a llamar row, y lo imprimimos.
Entonces nos da todos esos valores.
Ahora, si se dan cuenta lo que está haciendo Python es que cada registro nos lo está dando dentro de este conjunto de paréntesis, nos está dando una tupla.
Esta tupla tiene una coma, esto es lo que está identificando como una tupla.
Ese es el valor de efecto porque por lo general no estamos esperando un solo valor, estamos esperando tal vez el nombre y el peso, el nombre y la altura.
Entonces por eso la manera de dárnoslo de una manera consistente es darnos una tupla por cada registro.
Entonces podemos usar esto en nuestra ventaja, ¿por qué? porque esto estos elementos de aquí es la posición cero de la tupla.
Entonces, vamos a utilizar otra vez esa consulta vamos a usar select, seleccionar, la altura de la tabla jugador o player, y le vamos a decir "cursor, tráeme toda la información de esa consulta".
Dámela, como usualmente, en filas, pero sólo vamos a guardar el primer elemento de esa fila, es decir, el que tenga el índice 0, y eso lo vamos a guardar en una variable que es llamada player_height, o altura del jugador.
Esto ya es un arreglo...
es un arreglo de enteros.
En particular no es un arreglo como tal, es una lista, pero para nosotros, nuestro vocabulario que hemos estado utilizando, esto lo podemos ver como un conjunto de números.
Debido a eso podemos usar funciones como min o max o promedio o media o moda.
Vamos a utilizar en las primeras que mencioné: min y max.
Entonces le podemos decir "imprime el mínimo de la player_height, que es en la lista que acabamos de crear, y el máximo.
Ok, entonces ahora tenemos que de nuestra consulta en la base de datos el jugador con la menor altura es de 157 centímetros y el más alto es de 208 centímetros.
Entonces, nosotros ya tenemos la altura de los jugadores en una lista.
Nosotros podemos utilizarlo con la librería Numpy para crear un arreglo básicamente optimizado el cual podemos hacer consultas más rápidamente.
Entonces, vamos a usarlo "import numpy as np" como lo hemos estado haciendo anteriormente, y vamos a decirle "np.array, y lo vamos a pasar como parámetro la lista que ya teníamos, y lo vamos a sobreescribir, si se fijan es la misma variable, estamos sobreescribiendo la lista original con un arreglo de numpy.
Ok, lo ejecuto, lo hace sin ningún problema, no nos imprime nada, no es necesario, y ahora ya tenemos acceso a mayor número de funciones, por ejemplo, podemos usar el promedio de numpy, podemos usar el mínimo, el máximo e incluso podemos usar funciones como cuartiles.
Le estamos diciendo "de la player_height, el arreglo de alturas, dame estos cuartiles", que le estamos pidiendo el primer cuartil, el segundo cuartil y el tercer cuartil, que es 25%, 50% y 75%.
Ok, se lo pedimos y aquí están las alturas.
Entonces, podemos decir que los jugadores promedio en Europa tienen la altura de uno de 181 centímetros.
El más chaparrito es de 157, ya lo habíamos confirmado eso, el más alto de 208, y el primer cuartil es de 177, el segundo de 182 y el tercero es de 185.
Ok.
Bueno, pero hasta el momento sólo hemos consultado un valor a la vez, hemos consultado el nombre o la altura.
¿Qué pasa si queremos consultar dos elementos simultáneamente? Bueno, lo podemos hacer igualito como lo habíamos hecho, solamente le vamos a agregar coma y el segundo atributo que queremos, la segunda columna.
En este caso queremos la altura y el peso de la tabla jugador.
Entonces, lo ejecutamos y vamos a imprimir nada más los cinco primeros...
y la obtenemos directamente.
Nos da el primer elemento, que tiene una altura de 182 con un peso de 187, el segundo jugador tenemos la altura de 170 con un peso de 146, y así nos da los primeros cinco elementos.
Similarmente lo podemos pasar a una forma de arreglo con numpy y, como ya lo tenemos organizado ahí, podemos utilizar las funciones de alto nivel de numpy.
Entonces les vamos a pedir el promedio, el mínimo y el máximo de los cuartiles.
La diferencia a como lo hemos estado usando con una sola columna es que ahora hay que especificarle en qué eje queremos que aplique estas operaciones.
¿Cómo que en qué eje? Bueno, el eje 0 se refiere a los renglones, el eje 1 se refiere a las columnas.
La diferencia es que le vamos a estar pidiendo "dame el promedio de los jugadores por filas", es decir, va a tomar la fila 1, fila 2, fila 3 y de eso va a sacar promedio de la primera columna, luego va a hacer lo mismo para la segunda columna y ahí terminó.
Entonces, esto ya es algo que tenemos que empezar a pensar cuando hagamos consultas u operaciones ya en matrices de datos.
Hay que especificar cómo queremos que apliquen las funciones.
Ok, y nos dice que el promedio de los valores en su altura es de 181, que es el mismo que habíamos pedido antes.
Ahora la diferencia es el peso.
Tenemos un peso promedio de 168 kilos, un mínimo de 117, un máximo de 243, los cuartiles se encuentran en 159, 168 y 179.
¿A quién más le podemos hacer consultas? Bueno, podemos utilizar, así mismo como usamos la tabla jugadores, podemos usar la tabla países.
Podemos decirle "selecciona el nombre de país".
¿Cómo se que se usa la columna nombre? Bueno, en nuestra descripción original dice que para country tiene las columnas Id y nombre.
Entonces yo puedo hacerlo y nos va a dar sin ningún problema.
¿Qué tal si me equivoco aquí? ¿Qué es lo que va a pasar si le puse names? Pues me va a decir que no encuentra la columna names.
Entonces es algo que hay que tener en cuenta.
Siempre que no sea un error hay que leerlo y analizar qué es lo que pudo haber estado mal.
Ok.
De forma similar la liga tiene el Id del país y el nombre de la liga.
Simplemente lo ejecutamos y nos da los valores sin ningún problema.
Entonces esta es una versión resumida de lo que es la función select en cuanto es SQL.
Más adelante vamos a ver funciones como lo es insert, update, delete que hacen diferentes cosas y vamos a volver a revisar lo que es el select pero ya como una condicional: selecciona estos valores de acuerdo a esta condición.
Pero eso ya lo veremos un poco más adelante.
INSERT
Hola.
En este video vamos a ver la función insert que, acompañado con select, es una función más importante a la hora de hablar de bases de datos.
Eso nos va a permitir hacer, como dice la palabra, inserciones a la base de datos de valores nuevos.
Es como se va a llenar principalmente la base de datos y es la que nos va a permitir interactuar directamente con ella.
Entonces, para ver esta función vamos a utilizar un cuaderno en nuestra carpeta de Jupyter llamada "insert".
Entonces, vamos a abrirlo.
Ya una vez que abrió vamos a ver un poquito de la sintaxis de lo que es insert.
Insert lleva una segunda palabra llamada into que no va a decir inserta en...
y siguiente a eso lleva el nombre de la tabla en la cual vamos a hacer la inserción, a la cual le queremos agregar datos nuevos.
Seguido de eso vamos a indicarle las columnas en las cuales queremos hacer la inserción de datos, si tenemos por ejemplo...
nada más queremos insertar, regresando a lo que son los jugadores, nada más el nombre y el peso, pues nada más especificamos esas dos columnas.
En seguida de eso viene la palabra reservada values la cual me va a decir qué valores van a resaltar en las columnas que acabamos de especificar.
Ahora, aquí hay que tener mucho cuidado.
Si nosotros especificamos tres columnas hay que especificar tres valores, y hacen relación en el mismo orden, por ejemplo, para la columna 1 es el valor 1, para la columna 2 es el valor 2, etcétera.
Una vez insertados los datos podemos regresar a utilizar nuestra función select que, como recordatorio, es select más algo de la tabla, ok.
Entonces, vamos a utilizar el mismo ejemplo la vez pasada.
Si no recuerdan es el que está aquí, es el european soccer data base, es una base de datos que sacamos de kaggle y viene en formato de SQL lite, tiene diferentes tablas y diferentes columnas para cada una en las tablas.
Lo vamos a utilizar de una manera muy similar a como lo usamos en el cuaderno pasado, que era el de select, donde importamos SQL lite 3, especificamos el nombre del archivo seguido de la ruta de ese archivo.
Recordemos que lo tenemos en la carpeta data/soccer/database_sqllite si tienen dudas de donde salió este archivo en el video anterior lo hicimos.
Además usamos un archivo de conexión que es SQL 3 connect y utilizamos el archivo que hemos utilizado en la sección anterior y le llamamos conexión.
Hasta el momento es idéntico a lo que hemos estado usando.
Ahora vamos a hacer nada más una consulta de select para ver qué es lo que contiene la tabla country.
Si nosotros lo ejecutamos simplemente nos dice el ID y el país, entonces nos está diciendo que Bélgica es el 1 e Inglaterra es el 1,729, Francia es el 4,769, este número de la izquierda es solamente para identificar ese renglón, no quiere decir que uno sea más que otro tenga un orden específico.
Seguido de eso vamos a empezar a utilizar la función insert.
Como dijimos es primero insert into, estamos diciendo: inserta en la tabla country estos valores.
¿Qué valores? nosotros le pusimos pregunta pregunta.
Nosotros podemos ponerle directamente 2 y México...
México pero una manera de hacerlo más sencillo es decirle a python que sus valores los vamos a completar después.
¿Dónde es después? Pues justo aquí, nada más le estamos diciendo el primer value va a hacer 2 y el segundo va a ser México.
Entonces, si lo ejecutamos nos dice esto de aquí, nos devuelve el cursor no nos dice fue satisfactorio o no.
Entonces vamos a comprobarlo, vamos a hacer un select.
Selecciona todo de la tabla country, exactamente a la celda que tenemos acá arriba, y nos da aquí un valor, nos dice que México tiene el ID número 2.
Entonces la inserción que hicimos acá arriba fue efectiva y ya la podemos consultar gracias a nuestra instrucción select.
Bueno, vamos a insertar a otra tabla, vamos a insertar, por ejemplo, en la tabla player el nombre Pelé y vamos a darle un número identificador 120,350, es un número inventado, no sé a la altura de Pelé pero le puse 180 y un peso de 178, que obviamente no lo es, verdad, pero pues solamente es para interactuar con la base de datos.
Entonces le decimos "inserta en la tabla player, en los campos ID, player_name, altura y peso estos cuatro valores, que son signos de interrogación.
Pero ahora verán que es muy diferente no estamos pasando los valores separados por comas, le estamos pasando una variable.
Bueno, esta variable es la que creamos de acá arriba.
Le podemos pasar directamente vectores o arreglos o duplas a esta ejecución y Python sabrá que va a respetar el orden de ese arreglo y lo va a reemplazar sobre estos signos de interrogación.
Entonces nos facilita mucho las cosas.
Lo ejecutamos, nos devuelve el cursor que no representa nada significativo para nosotros pero podemos utilizar un select para ver si Pelé existe o no.
Esta cláusula web la vamos a ver en otro video que nos específica: quiero que el jugador...
el nombre del jugador sea idéntico a Pelé.
Sólo entonces selecciónalo.
Entonces, lo hacemos y nos da tres valores.
Al parecer ya había dos jugadores llamados Pelé, pero recordemos que el nuestro tiene una altura de 180 y un peso de 178.
Entonces hizo la inserción correctamente a la base de datos.
Bueno, vamos a intentar otra.
Vamos a decir inserta a Diego Maradona con el número indicador 103, una altura de 165 y un peso de 180.
Entonces, hacemos la inserción idéntico a Pelé, nos va a dar un error, nos va a decir que hay una restricción que se está incumpliendo y es esta palabra "unique".
"Unique" nos está diciendo que ese campo en específico tiene que ser único, si esa es la base datos no se puede hacer la inserción, y ¿cuál es el campo que no estaba causando conflicto? Player_id.
Eso significa que en la base de datos ya hay un jugador con ese identificador único.
Entonces, vamos a consultar quién es.
Selecciona todo de "jugador" dónde ID es igual a 103.
Y ya había uno.

Adam Federici, este ya tiene un identificador de 103, una altura de 187 y un peso de 198.

Entonces ya está ocupado ese valor, por lo tanto no podemos realizar la inserción.

Entonces, esto concluye rápidamente lo que es la función insert, más adelante vamos a ver las funciones que nos faltan pero recuerden que esto lo estamos viendo a un nivel superficial.

S4 Cierre

Cierre Semana 4 Muchos de los problemas actuales a los que se enfrenta un científico de datos involucran el manejo de grandes cantidades de ...