Recursos libres para aprender a programar en español
🛑 Hagamos un alto en el camino. ¿Qué vimos hasta acá?
if
)for ... in
)DataFrame
s): estructuras tabulares con filas y columnaslen
, all
, any
, max
, sum
, sorted
listas por comprensión, etc (listas)groupby
, dropna
, value_counts
, head
, filtros, etc (tablas)for
, if
, variables acumuladoras, variables contadoras, segmentos, acceso indexado, operaciones de alto nivel, etcsum
)mean
)median
)quantile
)max
, min
, idxmax
, idxmin
)sort_values
, sorted
)cabeza
)tail
)slices
)groupby
)rename
)del
, drop
)iloc
, una_lista[índice]
)¡Fueron un montón de cosas!
Como material de referencia, te dejamos algunos links para que leas y tengas a mano a partir de ahora:
anio
Definí la función anio
que dado un string con una fecha (como por ejemplo "30/11/2014"
) devuelva el año, como un número. La función tiene que andar tanto con si el string original completa los dígitos con cero como si no lo hace.
Por ejemplo:
>>> anio("30/11/2014")
2014
>>> anio("05/01/0152")
152
>>> anio("5/1/152")
152
Tenemos datos de un curso como el siguiente:
curso_ejemplo = [
{
'legajo': '123446',
'nombre': 'María',
'apellido': '(...)',
'notas' : [10, 2, 3],
'zona': 'Quilmes'
},
{
'legajo': '123450',
'nombre': 'Carlos',
'apellido': '(...)',
'notas' : [5, 8, 8],
'zona': 'CABA'
},
{
'legajo': '123430',
'nombre': 'Liz',
'apellido': '(...)',
'notas' : [4, 8, 2],
'zona': 'CABA'
},
{
'legajo': '123453',
'nombre': 'Hector',
'apellido': '(...)',
'notas' : [9, 9, 1],
'zona': 'Temperley'
},
{
'legajo': '123110',
'nombre': 'Ana',
'apellido': '(...)',
'notas' : [6, 7, 8],
'zona': 'Quilmes'
},
{
'legajo': '123371',
'nombre': 'Ivana',
'apellido': '(...)',
'notas' : [7, 7, 9],
'zona': 'Avellaneda'
}
]
Con esta información, definí las siguientes tres funciones:
nota_final(un_estudiante)
: devuelve la nota final de un estudiante, que se calcula como el promedio de sus notaspromedio_de_notas_del_curso(un_curso)
: devuelve el promedio general de las notas finales del cursoestudiantes_aprobados(un_curso)
: devuelve aquellos estudiantes cuyas notas individuales (sin importar la nota final) son todas mayores o iguales a 4.Ejemplo:
>>> estudiantes_aprobados(curso_ejemplo) [ { 'legajo': '123450', 'nombre': 'Carlos', 'apellido': '(...)', 'notas' : [5, 8, 8], 'zona': 'CABA' }, { 'legajo': '123110', 'nombre': 'Ana', 'apellido': '(...)', 'notas' : [6, 7, 8], 'zona': 'Quilmes' }, { 'legajo': '123371', 'nombre': 'Ivana', 'apellido': '(...)', 'notas' : [7, 7, 9], 'zona': 'Avellaneda' } ]
Ahora vamos a querer más estadísticas:
cantidad_de_estudiantes_por_zona(un_curso)
: devuelve un diccionario con la cantidad de estudiante que hay en cada zonalegajos_de_estudiantes(un_curso)
: devuelve una lista con sólo los legajosnombre_completo_de(legajo, un_curso)
: busca un estudiante por legajo y devuelve su nombre completo, asumiendo que el legajo existe.legajo_registrado(legajo, un_curso)
: dice si existe un estudiante con el legajo dadoEjemplos:
>>>> cantidad_de_estudiantes_por_zona(curso_ejemplo)
{
"Quilmes": 2,
"CABA": 2,
"Temperley": 1,
"Avellaneda": 1
}
>>> legajos_de_estudiantes(curso_ejemplo)
['123446', '123450', '123430', '123453', '123110', '123371']
>>> nombre_completo_de('123446', curso_ejemplo)
"María (...)"
>>> legajo_registrado('89612', curso_ejemplo)
False # nadie tiene ese legajo
Definí las nuevas funciones.
Usando pandas
, Creá un DataFrame
en pandas con los datos de ejercicio anterior ….
import pandas as pd
estudiantes = pd.DataFrame(curso_ejemplo)
…y realizá los siguientes análisis:
Cargá este archivo en una tabla de pandas
…
import pandas as pd
# notá que este archivo no es un CSV, sino un JSON, un formato
# muy diferente pero que podemos cargar de forma muy similar
emojis = pd.read_json("https://raw.githubusercontent.com/github/gemoji/ce6c4ab12ae229be2b1089cbf7e85702fdc5552f/db/emoji.json")
emojis
… y respondé lo siguiente:
print
Usando la tabla emojis
del ejercicio anterior, definí una función bandera_de
que tome el nombre de un país (en inglés) y te de su bandera.
Por ejemplo:
>>> bandera_de("Argentina")
'🇦🇷'
>>> bandera_de("Brazil")
'🇧🇷'
>>> emojificar("Mexico")
'🇲🇽'
Definí la función emojificar
, que tome un texto y reemplace todas las palabras que se correspondan con el alias de un emoji por el emoji correspondiente.
Por ejemplo:
>>> emojificar("Emojificando smile")
'Emojificando 😄'
>>> emojificar("hola argentina")
'hola 🇦🇷'
>>> print(emojificar("pizza y mate"))
# el print puede ser
# necesario si el emoji no se ve bien
🍕 y 🧉
Hay varias formas de encarar este ejercicio. Una de ellas es recorrer la tabla de emojis
iterando los índices, y luego accediendo cada fila con iloc
:
for index in emojis.index:
emoji = emojis.iloc[index]
# y ahora emoji es una fila que podés
# usar como emoji.skin_tones, por ejemplo
Otra más sencilla es usar itertuples()
que nos permite recorrer directamente cada fila:
for emoji in emojis.itertuples():
# y ahora emoji es una fila que podés
# usar igual que el ejemplo anterior
Por último, también podés convertir el dataframe emojis
en una lista de diccionarios usando …
# esto devuelve una lista de diccionarios
emojis.to_dict("records")
… y luego recorrerla normalmente.
Por último, ojo porque hay muchos emojis que tienen alias muy cortos y si no tenés cuidado te puede pasar ésto:
>>> emojificar("hola argentina")
'h⭕l🅰️ 🅰️rgentin🅰️'
En una aplicación tenemos estadísticas de partidos de fútbol ⚽ como las siguientes:
partidos_de_ejemplo = [
{'anio': 2015,
'dia': 17,
'equipo_local': 'Belgrano',
'equipo_visitante': 'Nueva Chicago',
'goles_locales': 3,
'goles_visitantes': 1,
'mes': 2,
'resultado': 'local'},
{'anio': 2017,
'dia': 22,
'equipo_local': 'Olimpo Bahia Blanca',
'equipo_visitante': 'Estudiantes L.P.',
'goles_locales': 3,
'goles_visitantes': 1,
'mes': 5,
'resultado': 'local'},
{'anio': 2015,
'dia': 31,
'equipo_local': 'Tigre',
'equipo_visitante': 'Defensa y Justicia',
'goles_locales': 0,
'goles_visitantes': 0,
'mes': 3,
'resultado': 'empate'},
{'anio': 2020,
'dia': 8,
'equipo_local': 'Banfield',
'equipo_visitante': 'Rosario Central',
'goles_locales': 1,
'goles_visitantes': 1,
'mes': 2,
'resultado': 'empate'},
{'anio': 2017,
'dia': 25,
'equipo_local': 'Tigre',
'equipo_visitante': 'Velez Sarsfield',
'goles_locales': 0,
'goles_visitantes': 3,
'mes': 8,
'resultado': 'visitante'}]
Como vemos, estas estadísticas tienen información de la fecha, equipos que se enfrentaron, y quien ganó (resultado
) y qué goles hizo cada equipo.
Sabiendo ésto, definí una función
goles_hechos_a
, que reciba un equipo y un diccionario con las estadísticas de un partido, y devuelva la cantidad de goles que le hicieron al equipo dado, sin importante si fueron de visitante o local.Por ejemplo:
>>> goles_hechos_a("Tigre", { 'equipo_local': 'Rosario Central', 'equipo_visitante': 'Tigre', 'goles_locales': 2, 'goles_visitantes': 1, ... }) 2 # porque Tigre era visitante y hubo un sólo gol local >>> goles_hechos_a("River Plate", { 'equipo_local': 'River Plate', 'equipo_visitante': 'Quilmes', 'goles_locales': 2, 'goles_visitantes': 3, ... }) 3 # porque River era local y hubo dos goles visitantes
Nota: asumí que la función será siempre invocada con uno de los dos equipos participantes.
Definí una función participo
que diga si un equipo partició en un partido.
>>> participo("Nueva Chicago", partidos_de_ejemplo[0])
True # Porque fue un partido Belgrano vs Nueva Chicago
>>> participo("Olimpo Bahia Blanca", partidos_de_ejemplo[1])
True # Porque fue vs Olimpo Bahia Blanca vs Estudiantes L.P.
>>> participo("River Plate", partidos_de_ejemplo[1])
False
Los domingos necesitamos armar los titulares que se ven durante el partido y al finalizar. Por ejemplo:
>>> titular_durante(partidos_de_ejemplo[3])
"El minuto a minuto del Banfield - Rosario Central"
>>> titular_final(partidos_de_ejemplo[4])
"Tigre 0 - 0 Defensa y Justicia: toda la información"
Definí las funciones
titular_durante
ytitular_final
Definí una función mayor_goleada_recibida
que responda cuál fue la mayor goleada recibida, independientemente de si fue recibida de local o visitante. Probablemente te convenga reutilizar algunas de las funciones anteriores
Definí una función perdio
, que diga si un equipo perdió en un partido. Nota: si el equipo empató o no partició, diremos que no perdió.
¡Llegó la hora de usar datos reales!
Cargá desde https://www.football-data.co.uk/new/ARG.csv una tabla de pandas y mirá qué contiene.
Dado que no vamos a usar todas las columnas, vamos a quedarnos sólamente con las siquientes:
League Division
(división)Match Date
(fecha del partido dd/mm/yy)Time of match kick off
(horario de inicio)Home Team
(equipo local)Away Team
(equipo visitante)Home Team Goals
(goles locales)Away Team Goals
(goles visitantes)Full Time Result
(H=Home Win, D=Draw, A=Away Win) (resultado)Recortá el dataframe para que contenga sólo las columnas mencionadas
El problema es que las columnas tienen nombres difíciles de recordar, y no se parece mucho a lo que veníamos trabajando.
Renombrar las columnas para que sus nombres coincidan con lo que representan, en español. Inspirate en las estadísticas de ejemplo que usamos en los ejercicios anteriores.
Ah, pero los valores de la columna resultado
tampoco coinciden con los que veníamos trabajando.
Convertí los códigos de la columna resultado de la siguiente forma:
H
➡️local
A
➡️visitante
D
➡️empate
Podés transformar los valores de una columna usando un_datagrame.una_columna.map(diccionario)
, donde las claves del diccionario son los valores originales, y los valores, los valores nuevos.
Momento, ¿y de cuándo son estos datos? ¿Desde qué año hay registros?
Transformá la columna de fecha en
datetime
para que podamos maniuplarla adecuadamente, agregá una columnaanio
y finalmente respondé la pregunta.
Te va a convenir usar la función pd.to_datetime
.
¿Cuál es el promedio de goles visitante y local de cada año?
Hacé una tabla que contenga una fila por cada liga con sus resultados y un gráfico de barras donde se presente esta información
¿Cuál es la proporción de victorias de local, visitante y empates?
Calculá estas estadísticamente numéricamente y con ellas hacé un gráfico de torta 🥧.
Ahora que tenemos los datos reales, ¿podríamos usar nuestras primeras funciones con ellos?
Actualizá la variable
partidos_de_ejemplo
para que tenga una lista de diccionarios iguales a los originales, pero esta vez generados tomando 20 partidos al azar de la tabla.
Recordá que contás con un_dataframe.sample
y que podés transformar una tabla en una lista de registros usando to_dict("records")