Sesion 20221126
Sesion 20221126
Sesion 20221126
Dataframe
Una de las mejores opciones para trabajar con datos tabulares en Python es usar la
Python Data Analysis Library (alias Pandas).
Que es un dataframe
# usando la expresión .to_csv exportamos los datos de nuestro dataframe hacia csv
# como definimos la ruta, se exportan directamente a la ruta del archivo python en
que se ejecuta el código
df.to_csv('data0316.csv')
# Leer surveys.csv
ruta_archivo = input("[1] Indique la ruta del archivo a importar: ")
# Si queremos leer una ruta fija, debemos colocar los dos \\ para escapar el
caracter \
ruta_archivo
# recordemos que para nuestro caso los datos tienen una columna indice
df_desde_ruta = pd.read_csv(ruta_archivo, index_col=0)
df_desde_ruta
df_desde_ruta
# recordemos que para nuestro caso los datos tienen una columna indice
# leemos el archivo surveys.csv
df_desde_ruta = pd.read_csv(ruta_archivo, index_col=0)
df_desde_ruta
# Si usamos el método type podemos ver que que nuestro df es de tipo pandas
dataframe
type(df_desde_ruta)
# .tail nos devuelve los ultimos 5 datos; dentro de los paretensis podemos indicar
la cantidad de datos que
# queremos
df_desde_ruta.tail(10)
# podemos usar el método describe para obtener información sobre cada columna
df_desde_ruta.describe()
# Si queremos obetener información sobre una sola columna, podemos llamar a una
columna en particular
# usando slicing
df_desde_ruta['weight'].describe()
Podemos generar una agrupación de datos por un campo en especial, como por ejemplo
el campo sex
# Generamos un nuevo df, que va a agrupar por cada una de las valores de
# esta columna
# Para nuestro caso, sex sólo tiene 2 valores, F y M
datos_agrupados = df_desde_ruta.groupby('sex')
# Ejercicios
# Como podriamos obtener la cantidad de individuos de cada sexo
datos_agrupados['month'].count()
Por ejemplo, si quisieramos obtener los datos del número de muestras de cada
especie, podemos usar combinar el agrupado con el conteo de la siguiente manera
df_desde_ruta
# Primero agrupamos por el campo species_id, luego solo por el campo day, hacemos
un conteo de los registros
conteo_especies = df_desde_ruta.groupby('species_id')['day'].count()
print(conteo_especies)
type(conteo_especies)
# Como obtendriamos los datos de más de una especie, por ejemplo D0, UR y UP
df_desde_ruta.groupby('species_id')['day'].count().tail()
Leyendo datos desde Excel
De manera similar que se leen los datos de csv, se pueden leer datos desde excel
df_ventas
# también se pueden leer los datos por los indices de cada hoja
df_productos = pd.read_excel('Datos.xlsx',sheet_name=1,index_col=0)
df_productos
# Ejercicio
# Leer las otras 2 hojas
df_vendedores = pd.read_excel('Datos.xlsx',sheet_name=2,index_col=0)
df_vendedores
df_ciudad = pd.read_excel('Datos.xlsx',sheet_name=3,index_col=0)
df_ciudad
Merge
Para esto podemos usar el método merge para unir los dos dataframes
df_cons = pd.merge(df_ventas,df_productos,how='left',left_on=['Producto'],
right_on=['Id'])
df_cons
# En este caso como tenemos dos columnas en ambas tablas llamadas Producto
# al momento de la union se les anexan unos indices _x y _y para diferenciarlas
df_cons
# Ejercicio
# Realizar la union del df_cons con los otros dos df, df_vendedores y df_ciudad
# vendedores
df_cons = pd.merge(df_cons,df_ciudad,how='left',left_on=['Ciudad'],
right_on=['Id'])
df_cons
df_cons.head()
En algunos casos vamos a necesitar por algún motivo realizar un filtro de los
datos.
df_cons
df_aretes.head()
# Ejercicio
# Como solicitar solo los productos aretes y manillas donde la cantidad haya sido
superior a 3
df_are_y_man = df_cons.query("Des_Producto in ('Aretes','Manillas') and Cantidad >
10").copy()
df_are_y_man = df_cons.query('(Des_Producto == "Aretes" or Des_Producto ==
"Manilla")and(Cantidad >=10)').copy()
df_are_y_man
Ejercicios adicionales
Generar un dataframe que permita conocer las ventas sólo realizadas del producto
Collar en la ciudad de Bogotá de Género Femenino.
Ejercicio adicional 1
Generar un dataframe que permita conocer las ventas sólo realizadas del producto
Manilla y Aretes en la ciudad de Medelín donde la ganancia haya sido superior o
igual a 50000. a. Especial, una vez generado, que se pueda exportar a Excel, pero
que le solicite al usuario donde desea generarlo b. Especial 2, que el archivo
exportado no sea csv sino Excel, sin los indices y que la hoja se llame
RepEspecial1
Eliminando columnas
Dado que ya realizamos algunos cruces, podemos eliminar algunas columnas usando el
método de los dataframe .drop
# Miremos si sí se elimino
df_cons
df_cons
# Ejercicio
# Eliminar las demás columnas con llaves de las que ya tenemos valores
Para seleccionar las filas y las columnas, podemos usar los métodos loc e iloc
# Método loc
# Realizar la búsqueda basado en la columna indice, para nuestro caso los indices
son similares
# a un enumarado
# Incluye ambos valores, el inicio y el final
df_cons.loc[1:5]
# con el otro df
df.iloc[1:5]
Es normal que se requieran agrupar los datos por diferentes niveles y medidas, como
sumas, promedios o demás
df_cons
# Agrupando nivel 2
# con la instrucción groupby indicamos los campos que queremos agrupar
# dentro de agg, definimos las medidas que queremos revisar
# al final identificamos sólo las columnas que queremos resumir
df_agru1 = df_cons.groupby(['Des_Producto']).agg(['mean','sum','nunique'])
[['Cantidad','Costo','Valor']]
df_agru1
#
-----------------------------------------------------------------------------------
---------------------
# Adicionales
# Recorriendo hojas iguales en un libro para consolidarlas
# reseteamos el indice
tabla_completa.reset_index(inplace=True, drop=True)
print(tabla_completa)
#
-----------------------------------------------------------------------------------
---------------------
#importar pandas y os
import pandas as pd
import os
lista_archivos_excel = os.listdir(ruta_insumos)
lista_archivos_excel
df = pd.DataFrame()
df.to_excel(ruta_salida+"Consolidado.xlsx", index=False)
#
-----------------------------------------------------------------------------------
-----------------------
import pandas as pd
df = pd.read_csv('50000 HRA Records.csv')
df[df.groupby(['Age', 'Department'])['DailyRate'].transform('count').eq(189)]
***********************************************************************************
**************************
Tuplas
# Método 1
a = 1,2,3,'ejemplo',4,5,'hola'
print(a)
type(a)
# Método 2
b = (1,2,3,'otra,',5,6,'tupla')
print(b)
type(b)
- Métodos
b.append(1)
b[0] = 0
lista = [1,2,3,'hola',5,6,'tarde']
lista
type(lista)
a = 1,2,3,4
b = 5,6,7,8
c = a + b
print(c)
type(c)
print(a * 3)
tup1.count(1)
type(tup1)
Modificacion Tuplas
# para modificar tuplas las podemos convertir en listas usando list() y luego en
tuplas usando tuple()
a = 1,2,3,4,5
a = list(a)
a.sort(reverse=True)
a = tuple(a)
print(a)
a[:2]
a = (1,(1,2,3),3,4)
a[1]
a[1][2]
a = (1,[1,2,3],3,4)
a[1]
type(a[1])
a[1][1]
a[1][1] = 234
type(a)
type(a[1])
Conjuntos
conjunto1 = set({1,2,3})
conjunto1
conjunto2 = {1,2,3}
type(conjunto2)
print(conjunto)
print(conjunto)
conjunto.add(0)
print(conjunto)
conjunto.add(0)
lis1 = [1,2,3,4,1,2]
# convertimos a conjunto una lista
con1 = set(lis1)
con1.remove(4)
con1
## Método difference, realiza la diferencia entre 2 sets; sólo deja los diferentes
con1 = {1,2,3,4,5}
con2 = {10,5,2,3,40}
con3 = con1.difference(con2)
print(con3)
print(con3)
print(con3)
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# Union
a | b
# Intersección
a & b
# Diferencia
a - b
b - a
{1, 2, 3} == {4, 5, 6, 6}
'Natalia' in grupo
*********************************************************************************
Reutilizando Código
Las funciones
print("Hello world!")
range(2, 20)
print(str(12))
def my_func():
print("spam")
print("spam")
print("spam")
my_func()
El bloque de código dentro de cada función comienza con dos puntos (:) y está
indentado.
hello()
def hello():
print("Hello world!")
Argumentos
def print_with_exclamation(word):
print(word + "!")
print("Fin impresión de",word)
También puede definir funciones con más de un argumento; separarlos con comas.
print_sum_twice(5, 8)
print_sum_twice(5, 8)
def function(yes):
yes = yes + 1
print(yes)
function(7)
# Genera error debido a que yes sólo existe dentro de la funcion function
print(yes)
Técnicamente, los parámetros son las variables en una definición de función, y los
argumentos son los valores puestos en los parámetros cuando se llaman funciones.
# Complete los espacios en blanco para definir una función que imprima
# "yes", si su parámetro es un número par, y "Not" de lo contrario.
def even(x):
if x%2 == 0:
print("Yes")
else:
print("No")
even(201)
def even(x):
if x%2 == 0:
return "Yes"
else:
return "No"
even(3)
Ciertas funciones, como int o str, devuelven un valor que se puede usar más
adelante. Para hacer esto con las funciones definidas, se puede usar la declaración
return.
r = max()
print(r)
Una vez return obtiene un valor de una función, deja de ejecutarse inmediatamente.
Cualquier código después de la declaración return nunca sucederá. Por ejemplo:
del(add_numbers)
print(add_numbers(4, 5))
Comentarios
def shout(word):
"""
Print a word with an
exclamation mark following it.
"""
print(word + "!")
shout("spam")
Aunque se crean de manera diferente a las variables normales, las funciones son
como cualquier otro tipo de valor. Se pueden asignar y reasignar a variables, y
luego hacer referencia a ellos con esos nombres.
a = 10
b = 34
operation = multiply
type(operation)
print(operation(a, b))
a = 5
b = 10
print(do_twice(add, a, b))
def square(x):
return x * x
test(square, 42)
Modulos
Los módulos son piezas de código que otras personas han escrito para cumplir tareas
comunes, como generar números aleatorios, realizar operaciones matemáticas, etc.
import random
for i in range(5):
value = random.randint(1, 6)
print(value)
print(pi)
Profundización Funciones
def saludar():
print("Hola este print se llama desde la función saludar")
saludar()
def dibujar_tabla_del_5():
for i in range(10):
print("5 x",i,"=",i*5)
dibujar_tabla_del_5()
def test(n=12):
return n * 100
test(345)
print(n)
m = 10
def test():
print(m)
test()
m = 10
def test(m):
for i in range(m):
print("5 x",i,"=",i*5)
test(m)
def test():
print(l)
l=20
test()
del l
def test():
o=5
print(o)
test()
o=10
test()
print(o)
o=10
test()
# n Goblal
n=5
def test():
# n de la función
n=10
return n
print(test())
print(n)
del n
Argumentos y Parametros
def resta(a,b):
return a-b
x = 10
y = 20
print(resta(x,y))
print(resta(1,2))
print(resta(b=2,a=10))
resta()
def resta(a=None,b=None):
if a == None or b == None:
print("Error, se deben enviar dos números a la función")
return
else:
return a-b
resta(a=1,b=0.5)
resta()
Argumentos indeterminados
def indeterminados_posicion(*args):
print(args)
for arg in args:
print(arg)
indeterminados_posicion(1,"Hola",[1,2,3,4,5],"Otro texto",[1,1,1],1.90)
# Le indicamos que los argumentos los queremos crear con nombre y valor
# agregando ** y normalmente se utiliza la palabra kwargs que significa
# kw = keyword y args= argumentos para indicar que son parejas de datos
def indeterminados_por_nombre(**kwargs):
print(kwargs)
indeterminados_por_nombre(n=1,c="Hola",l=[1,2,3,4,5])
Funciones recursivas
def cuenta_atras(num):
num -= 1
if num > 0:
print("Quedan",num,"segundos")
cuenta_atras(num)
else:
print("Explosión!!!")
# Este print esta por fuera del if y dentro de la función cuenta_atras
# Siempre se ejecuta
print("fin de la fxn",num)
cuenta_atras(10)
Funciones integradas
n = int("10")
n
f = float("10.5")
f
print(bin(10))
print(hex(10))
print(int('0b1010',2))
print(int('0xa',16))
print(abs(10))
print(abs(-10))
print(round(5.8))
print(round(5.4))
eval('2+5')
n = 10
eval('n*10-5')
len("Una cadena")
len([])
help()