nepito / ideas

0 stars 0 forks source link

Frictionless Data y Mimesis #44

Open nepito opened 4 months ago

nepito commented 4 months ago

Para especificar valores posibles para una tabla de datos ficticios utilizando el datapackage.json en el contexto de Frictionless Data, puedes definir un esquema (schema) en el archivo datapackage.json que incluya restricciones y valores posibles (constraints) para cada campo de la tabla. Esto es útil para validar los datos y asegurar que cumplen con las especificaciones definidas.

A continuación, te muestro cómo podrías hacerlo paso a paso:

1. Estructura Básica del datapackage.json:

El archivo datapackage.json describe el paquete de datos, incluyendo los recursos (resources) que contienen los datos y los esquemas que definen las estructuras y restricciones de los datos.

2. Definir el Esquema de la Tabla:

Dentro del datapackage.json, puedes definir el esquema de la tabla en la sección schema. Aquí puedes especificar los campos y las restricciones, incluyendo los posibles valores.

Ejemplo Completo:

Supongamos que queremos definir una tabla de datos ficticios sobre empleados con los siguientes campos:

Aquí tienes un ejemplo de cómo se vería el datapackage.json:

{
  "name": "empleados",
  "title": "Datos Ficticios de Empleados",
  "resources": [
    {
      "name": "empleados",
      "path": "empleados.csv",
      "schema": {
        "fields": [
          {
            "name": "id",
            "type": "integer",
            "constraints": {
              "required": true,
              "unique": true
            }
          },
          {
            "name": "nombre",
            "type": "string",
            "constraints": {
              "required": true
            }
          },
          {
            "name": "edad",
            "type": "integer",
            "constraints": {
              "required": true,
              "minimum": 18,
              "maximum": 65
            }
          },
          {
            "name": "departamento",
            "type": "string",
            "constraints": {
              "required": true,
              "enum": ["IT", "HR", "Sales", "Marketing"]
            }
          }
        ]
      }
    }
  ]
}

Explicación del Ejemplo:

Validación de los Datos:

Al utilizar este datapackage.json, puedes validar un archivo CSV de datos ficticios para asegurarte de que cumple con las especificaciones definidas. Si los datos no cumplen con las restricciones (por ejemplo, si edad está fuera del rango especificado o si departamento tiene un valor no permitido), la validación fallará.

Generación de Datos Ficticios:

Puedes usar herramientas como Mimesis para generar los datos ficticios y luego asegurarte de que cumplen con el esquema definido en el datapackage.json. Aquí tienes un ejemplo de cómo podrías generar estos datos utilizando Mimesis:

from mimesis import Person, Text
from mimesis.enums import Gender
import csv

person = Person('es')
text = Text('es')

with open('empleados.csv', 'w', newline='') as csvfile:
    fieldnames = ['id', 'nombre', 'edad', 'departamento']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    for i in range(1, 101):
        writer.writerow({
            'id': i,
            'nombre': person.full_name(gender=Gender.MALE),
            'edad': person.age(minimum=18, maximum=65),
            'departamento': text.word()  # Aquí podrías ajustar para usar los valores permitidos
        })

Para asegurarte de que los valores de departamento son uno de los permitidos (IT, HR, Sales, Marketing), puedes ajustar la generación de datos:

from random import choice

departments = ['IT', 'HR', 'Sales', 'Marketing']

with open('empleados.csv', 'w', newline='') as csvfile:
    fieldnames = ['id', 'nombre', 'edad', 'departamento']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    for i in range(1, 101):
        writer.writerow({
            'id': i,
            'nombre': person.full_name(gender=Gender.MALE),
            'edad': person.age(minimum=18, maximum=65),
            'departamento': choice(departments)
        })

Este enfoque te permite generar datos ficticios que cumplen con las restricciones y valores posibles definidos en el datapackage.json.

nepito commented 4 months ago
from mimesis import Schema
from mimesis.locales import Locale
from mimesis.providers import Person, Datetime
from mimesis.schema import Field
import pandas as pd

# Definir un generador de campos
_ = Field(locale=Locale.ES)

# Definir el esquema para los datos ficticios
schema = Schema(schema=lambda: {
    'id': _('uuid'),
    'nombre': _('full_name', gender=Gender.MALE),
    'edad': _('age', minimum=18, maximum=65),
    'departamento': _('choice', items=['IT', 'HR', 'Sales', 'Marketing']),
    'fecha_contratacion': _('datetime', start=2000, end=2023, fmt='%Y-%m-%d')
})

# Generar una lista de datos ficticios
data = schema.create(iterations=100)

# Convertir la lista de datos en un DataFrame de pandas
df = pd.DataFrame(data)

# Mostrar el DataFrame
print(df.head())
nepito commented 4 months ago

Estos son los Field que podemos utilizar:

image

from mimesis import Generic
generic = Generic()
generic.

Tal vez podría ir por aquí una implementación:

a = lambda: {campo["name"]: field("numeric.float_number") for campo in campos}