jueves, 7 de enero de 2021

Clasificador con Word2Vec

El siguiente ejemplo utiliza un dataset de productos de supermercado, y crear un clasificador para predecir la categoría del producto usando el nombre. 

El dataset proviene de un web-scraping realizado en una página de un supermercado, y tiene la siguiente estructura:












Para lograr esto se utiliza el algoritmo de word2vec para transformar el texto en una matriz que represente los features o variables. En este ejemplo no se explica la teoría de word2vec, luego haré otro post sobre eso.


El proceso sigue estos pasos:


PASO 1: Entrenar Word2vec

Se entrena un modelo usando Word2vec,  y se genera un diccionario (word vector) que tiene un vector numérico por cada palabra.  Conceptualmente sería así:


















viernes, 7 de agosto de 2020

List Comprehension en Nested For Loop

Ejemplo de for loop anidado de la forma tradicional y mismo ejemplo en formato "list comprehension":

script:

familia = {
            'hermanas': ['sofi','flor'],
            'hermanos': ['pablo', 'pedro'], 
            }

# TRADICIONAL
nombres = []
for grupo in familia: 
    for nombre in familia[grupo]: 
        nombres.append(nombre)
print(nombres)

# LIST COMPREHENSION
nombres = [nombres for grupo in familia for nombres in familia[grupo]] 
print(nombres)

jueves, 18 de junio de 2020

Igualdad en Decimales

Si se evalúa la igualdad de números decimales en Python, se puede encontrar con diferencias como:
(0.1 + 0.1 + 0.1) == 0.3  --> False

Esto pasa porque algunos decimales no pueden ser representados en formato binario, es decir en base 2.
Varias soluciones simples pueden implementarse según el escenario, como usar la función round.
Una forma más general es usar la función isclose de la librería math que usa los parámetros de tolerancia abs_tol y rel_tol.

Para documentación de la librería math, ver Referencia No.1, y el PEP-485 en la Referencia No.2

script:
import math
a = 0.1 + 0.1 + 0.1
b = 0.3
print(math.isclose(a, b, abs_tol=0.0001, rel_tol=0.0001))
#True

a = 99999999.01
b = 99999999.02
print(math.isclose(a, b, abs_tol=0.0001, rel_tol=0.0001))
#True

a = 0.01
b = 0.02
print(math.isclose(a, b, abs_tol=0.0001, rel_tol=0.0001))
#False



lunes, 15 de junio de 2020

Comparar variables (is Vs ==)

Para evaluar si dos variables (var1 y var2) tienen el mismo contenido, se utiliza var1 == var2. Pero si el contenido de esas variables está en el rango desde -5 hasta 256, puede usarse var1 is var2 que es mas eficiente.

Esto es así porque Python asigna la misma dirección de memoria a las variables, cuando los valores están dentro de este rango (ver referencia 1), y el operador "is" no compara el contenido, sino la dirección de memoria, que es más eficiente. 

Es decir, Python asigna el mismo id de memoria a todas las variables cuyo valor sea igual a 1, y asignará otro id de memoria para todas las variables cuyo valor sea igual a 2, y así hará lo mismo para los valores desde -5 hasta 256. Esto lo podemos comprobar si creamos las variablaes var1=1 y var2=1, y luego  imprimimos los ids usando id(var1)id(var2).

Por tal razón siempre será mas eficiente, en terminos de tiempo de ejecucion, usar el operador is, cuando los valores esten dentro del rango descrito.

miércoles, 3 de junio de 2020

Funcion para cargar un dataset

El siguiente script crea un pandas.DataFrame evaluando el tipo de dato que recibe (bytes, str, path) y luego lo lee usando pandas.read_csv.


script:
import os
from io import StringIO
import pandas as pd


def load_data(data):
    if isinstance(data, pd.DataFrame):
        return data
    elif isinstance(data, bytes):
        return pd.read_csv(StringIO(str(data, 'utf-8')), encoding='utf-8', sep=',')
    elif len(data) <= 260 and os.path.exists(str(data)):
        return pd.read_csv(data, encoding='utf-8', sep=',')
    elif isinstance(data, str):
        return pd.read_csv(StringIO(data), encoding='utf-8', sep=',')

domingo, 20 de octubre de 2019

DataFrame to Postgresql

El siguiente script crea y popula una tabla en postgresql usando un DataFrame como origen.

Notas:
La funcion to_sql maneja el create table y los tipos de datos de las columas.
El parámetro if_exists de la funcion to_sql permite estos argumentos: fail, replace, append


Conceptualmente sería así:










jueves, 17 de octubre de 2019

Consultar clima con openweathermap

El siguiente script consulta el clima en el servicio openweathermap y lo guarda en una base postgresql. El script sigue estos pasos:

1. Si es la primera ejecución, consulta latitud y longitud al servicio ipinfo.io y guarda este dato en un archivo geopoint.yaml. Si no es la primera vez, levanta el archivo geopoint.yaml.

2. Usando la latitud y longitud, consulta la temperatura y humedad al servicio openwathermap, que es suministrada en formato json

3. Guarda los datos en una base potgresql

NOTAS:
- Para ejemplo de una REST Api que guarda info en postgresql, ver nota publicada AQUI.
- Este script requiere una api_id provista por https://openweathermap.org/