Hub documentation
fenic
fenic
fenic es un marco de DataFrames inspirado en PySpark, diseñado para crear aplicaciones de IA y agentes de producción. fenic ofrece soporte para leer conjuntos de datos directamente desde Hugging Face Hub.

Primeros pasos
Para empezar, instala fenic con pip:
pip install fenic
Crear una sesión
Instancia una sesión de fenic con la configuración predeterminada (suficiente para leer conjuntos de datos y otras operaciones no semánticas):
import fenic as fc
session = fc.Session.get_or_create(fc.SessionConfig())Resumen
fenic es un marco de procesamiento de datos con una opinión definida que combina:
- API de DataFrame: operaciones inspiradas en PySpark para la manipulación de datos familiar
- Operaciones semánticas: Operaciones integradas de IA/LLM que incluyen funciones semánticas, embeddings y clustering
- Integración de modelos: soporte nativo para proveedores de IA (Anthropic, OpenAI, Cohere, Google)
- Optimización de consultas: Optimización automática mediante transformaciones del plan lógico
Leer desde Hugging Face Hub
fenic puede leer conjuntos de datos directamente desde Hugging Face Hub usando el protocolo hf://. Esta funcionalidad está integrada en la interfaz DataFrameReader de fenic.
Formatos admitidos
fenic admite la lectura de los siguientes formatos desde Hugging Face:
- Archivos Parquet (
.parquet) - Archivos CSV (
.csv)
Lectura de conjuntos de datos
Para leer un conjunto de datos desde el Hugging Face Hub:
import fenic as fc
session = fc.Session.get_or_create(fc.SessionConfig())
# Read a CSV file from a public dataset
df = session.read.csv("hf://datasets/datasets-examples/doc-formats-csv-1/data.csv")
# Read Parquet files using glob patterns
df = session.read.parquet("hf://datasets/cais/mmlu/astronomy/*.parquet")
# Read from a specific dataset revision
df = session.read.parquet("hf://datasets/datasets-examples/doc-formats-csv-1@~parquet/**/*.parquet")Lectura con gestión de esquemas
# Read multiple CSV files with schema merging
df = session.read.csv("hf://datasets/username/dataset_name/*.csv", merge_schemas=True)
# Read multiple Parquet files with schema merging
df = session.read.parquet("hf://datasets/username/dataset_name/*.parquet", merge_schemas=True)Nota: En fenic, un esquema es el conjunto de nombres de columnas y sus tipos de datos. Cuando se habilita
merge_schemas, fenic intenta reconciliar las diferencias entre archivos rellenando las columnas faltantes con valores nulos y ampliando los tipos de datos cuando es posible. Algunos diseños de datos aún no se pueden fusionar; consulte la documentación de fenic sobre las limitaciones de la fusión de esquemas CSV y las limitaciones de la fusión de esquemas Parquet.
Autenticación
Para leer conjuntos de datos privados, debes establecer tu token de Hugging Face como variable de entorno:
export HF_TOKEN="your_hugging_face_token_here"
Formato de ruta
El formato de ruta de Hugging Face en fenic sigue esta estructura:
hf://{repo_type}/{repo_id}/{path_to_file}También puede especificar revisiones o versiones del conjunto de datos:
hf://{repo_type}/{repo_id}@{revision}/{path_to_file}Características:
- Admite patrones glob (
*,**) - Revisiones/Versiones de conjuntos de datos usando la notación
@:- Commit específico:
@d50d8923b5934dc8e74b66e6e4b0e2cd85e9142e - Rama:
@refs/convert/parquet - Alias de rama:
@~parquet
- Commit específico:
- Requiere la variable de entorno
HF_TOKENpara conjuntos de datos privados
Mezcla de fuentes de datos
fenic te permite combinar múltiples fuentes de datos en una sola operación de lectura, incluyendo la mezcla de diferentes protocolos:
# Mix HF and local files in one read call
df = session.read.parquet([
"hf://datasets/cais/mmlu/astronomy/*.parquet",
"file:///local/data/*.parquet",
"./relative/path/data.parquet"
])Esta flexibilidad te permite combinar sin problemas datos del Hugging Face Hub y archivos locales en tu pipeline de procesamiento de datos.
Procesar datos de Hugging Face
Una vez cargado desde Hugging Face, puedes usar la API completa de DataFrame de fenic:
Operaciones básicas de DataFrame
import fenic as fc
session = fc.Session.get_or_create(fc.SessionConfig())
# Load IMDB dataset from Hugging Face
df = session.read.parquet("hf://datasets/imdb/plain_text/train-*.parquet")
# Filter and select
positive_reviews = df.filter(fc.col("label") == 1).select("text", "label")
# Group by and aggregate
label_counts = df.group_by("label").agg(
fc.count("*").alias("count")
)Operaciones impulsadas por IA
Para usar operaciones semánticas y de incrustación, configure los modelos de lenguaje y de incrustación en su SessionConfig. Una vez configurado:
import fenic as fc
# Requires OPENAI_API_KEY to be set for language and embedding calls
session = fc.Session.get_or_create(
fc.SessionConfig(
semantic=fc.SemanticConfig(
language_models={
"gpt-4o-mini": fc.OpenAILanguageModel(
model_name="gpt-4o-mini",
rpm=60,
tpm=60000,
)
},
embedding_models={
"text-embedding-3-small": fc.OpenAIEmbeddingModel(
model_name="text-embedding-3-small",
rpm=60,
tpm=60000,
)
},
)
)
)
# Load a text dataset from Hugging Face
df = session.read.parquet("hf://datasets/imdb/plain_text/train-00000-of-00001.parquet")
# Add embeddings to text columns
df_with_embeddings = df.select(
"*",
fc.semantic.embed(fc.col("text")).alias("embedding")
)
# Apply semantic functions for sentiment analysis
df_analyzed = df_with_embeddings.select(
"*",
fc.semantic.analyze_sentiment(
fc.col("text"),
model_alias="gpt-4o-mini", # Optional: specify model
).alias("sentiment")
)Ejemplo: Análisis del conjunto de datos MMLU
import fenic as fc
# Requires OPENAI_API_KEY to be set for semantic calls
session = fc.Session.get_or_create(
fc.SessionConfig(
semantic=fc.SemanticConfig(
language_models={
"gpt-4o-mini": fc.OpenAILanguageModel(
model_name="gpt-4o-mini",
rpm=60,
tpm=60000,
)
},
)
)
)
# Load MMLU astronomy subset from Hugging Face
df = session.read.parquet("hf://datasets/cais/mmlu/astronomy/*.parquet")
# Process the data
processed_df = (df
# Filter for specific criteria
.filter(fc.col("subject") == "astronomy")
# Select relevant columns
.select("question", "choices", "answer")
# Add difficulty analysis using semantic.map
.select(
"*",
fc.semantic.map(
"Rate the difficulty of this question from 1-5: {{question}}",
question=fc.col("question"),
model_alias="gpt-4o-mini" # Optional: specify model
).alias("difficulty")
)
)
# Show results
processed_df.show()