<jupyter_start><jupyter_text>Trabajando con diccionariosEn otros lenguajes pueden llamarse "hash maps"<jupyter_code>estudiante = {
    'nombre' : 'Diego',
    'apellido' : 'López',
    'edad' : 26,
    'cursos' : ['Historia','Geografía']
}
# Las llaves deben ser objetos inmutables: números, strings, tuplas

estudiante.keys() # Sólo llaves
estudiante.values() # Sólo valores
estudiante.items() # En pares


# Esto es útil para hacer loops
for key, value in estudiante.items():
    print(key)
# Acceso directo, pero propenso a errores
estudiante['apellido']
# Método diseñado para diccionarios
estudiante.get('teléfono', 'No disponible')
# Agregar directamente un nuevo key-value
estudiante['teléfono'] = '55 5555 55555'
# Método diseñado para diccionarios
estudiante.get('teléfono', 'No disponible')
# Actualizar un diccionario, utilizo otro diccionario

estudiante.update({'nombre' : 'Angie',
                  'apellido' : 'Pérez',})

estudiante
# Para eliminiar un campo
# help("del")
del estudiante['nombre']
estudiante<jupyter_output><empty_output><jupyter_text>Clases en PythonUna clase es un tipo de objeto.```pythonclass Perro:    def __init__(self, talla, nariz):        self.size = talla        self.nose = nariz    pass```Una instancia (instance, en inglés) es un ejemplo de objeto.```python pug es una instancia del objeto Perropug = Perro(30, "chata")``` Las Clases en Python son un bloque fundamental de la construcción de programas en Python.  Permiten agrupar lógicamente nuestros datos y funciones para reutilizarlas posteriormente y construir sobre estas clases.  No serán utilizadas frecuentemente en este curso<jupyter_code># Automatizar ciertos procesos

# self es la instancia, o el constructor en otros lenguajes.
# self es un argumento "fantasma", los demás son argumentos normales

# Las clases inician con mayúscula

class Empleado:
    def __init__(self, nombre, apellido, salario):
        self.nombre = nombre
        self.apellido = apellido
        self.salario = salario
        self.email = nombre + '.' + apellido + '@empresa.com'
    #    
    def nom_completo(self):
        print(self.nombre + ' ' + self.apellido)
        
# Tiene que venir (self) que es la instancia para que todo funione.
empleado_1 = Empleado('Diego', 'López', 1000)
empleado_1
empleado_1.email
print(empleado_1.nombre + ' ' + empleado_1.apellido)

# En vez de hacer esto puedo crear un método dentro de la clase.
empleado_1.nom_completo()
Empleado.nom_completo(empleado_1)

# Aquí no sabe qué instancia queremos correr dentro del método
# Hay que ponerlo.
# Ejemplo Pipes<jupyter_output><NAME><jupyter_text>Introducción a Numpy y la estructura Dataframe<jupyter_code>import numpy as np

# Se abrevia generalmente para acceder a sus método más rápido

# Por convención, ciertas librerías utilizan abreviaturas estándar.<jupyter_output><empty_output><jupyter_text>Numerical Python (Numpy)Una de las librerías más utilizadas para manejo de datos.Más rápido que utilizar listas y cuenta con muchos métodos. La unidad básica es un **numpy array**:  Una forma de vector, similar a una lista pero con más funciones<jupyter_code>type(np.array([1,2,3,4]))
type([1,2,3,4])
# Array (es un tipo de lista, iterable y permite operaciones vectoriales)

numeros = np.array([1,2,3,4])
floats = np.array([1.3,2.5,3.7,4.9])
strings = np.array(['a','b','c','d'])
print(numeros.dtype)
print(floats.dtype)
print(strings.dtype)
# Operaciones vectoriales
numeros * 5
# En cambio con una lista se repite 5 veces
[1,2,3,4]*5
numeros.shape
# Para matrices defino dos listas

A = np.array([[1,2],[3,4]])
print(A)
A.shape
# Para tener ayuda sobre un objeto
# ?A
# ?A.shape<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10371979364648384, 'fraction_numerical': 0.015476513711648113, 'mean_word_length': 4.75625, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '240631', 'license': 'MIT', 'n_tokens_mistral': 1366, 'n_tokens_neox': 1349, 'n_words': 386, 'path': 'ses_03/sesion_02_final.ipynb', 'repo_name': 'diego-eco/curso_python', 'size': '3688'}