Spaces:
Runtime error
Runtime error
| import os | |
| from datetime import datetime | |
| from typing import Any, Dict, List | |
| import pandas as pd | |
| from dotenv import load_dotenv | |
| from huggingface_hub import HfApi | |
| from huggingface_hub.utils import logging | |
| from tqdm.auto import tqdm | |
| load_dotenv() | |
| HF_TOKEN = os.getenv("HF_TOKEN") | |
| assert HF_TOKEN is not None, "You need to set HF_TOKEN in your environment variables" | |
| USER_AGENT = os.getenv("USER_AGENT") | |
| assert ( | |
| USER_AGENT is not None | |
| ), "You need to set USER_AGENT in your environment variables" | |
| logger = logging.get_logger(__name__) | |
| api = HfApi(token=HF_TOKEN) | |
| MAX_DATASETS = None | |
| def has_card_data(dataset): | |
| return hasattr(dataset, "card_data") | |
| def check_dataset_has_dataset_info(dataset): | |
| return bool( | |
| has_card_data(dataset) | |
| and hasattr(dataset.card_data, "dataset_info") | |
| and dataset.card_data.dataset_info is not None | |
| ) | |
| def parse_single_config_dataset(data): | |
| config_name = data.get("config_name", "default") | |
| features = data.get("features", []) | |
| column_names = [feature.get("name") for feature in features] | |
| return { | |
| "config_name": config_name, | |
| "column_names": column_names, | |
| "features": features, | |
| } | |
| def parse_multiple_config_dataset(data: List[Dict[str, Any]]): | |
| return [parse_single_config_dataset(d) for d in data] | |
| def parse_dataset(dataset): | |
| hub_id = dataset.id | |
| likes = dataset.likes | |
| downloads = dataset.downloads | |
| tags = dataset.tags | |
| created_at = dataset.created_at | |
| last_modified = dataset.last_modified | |
| license = dataset.card_data.license | |
| language = dataset.card_data.language | |
| return { | |
| "hub_id": hub_id, | |
| "likes": likes, | |
| "downloads": downloads, | |
| "tags": tags, | |
| "created_at": created_at, | |
| "last_modified": last_modified, | |
| "license": license, | |
| "language": language, | |
| } | |
| def parsed_column_info(dataset_info): | |
| if isinstance(dataset_info, dict): | |
| return [parse_single_config_dataset(dataset_info)] | |
| elif isinstance(dataset_info, list): | |
| return parse_multiple_config_dataset(dataset_info) | |
| return None | |
| def ensure_list_of_strings(value): | |
| if value is None: | |
| return [] | |
| if isinstance(value, list): | |
| return [str(item) for item in value] | |
| return [str(value)] | |
| def refresh_data() -> List[Dict[str, Any]]: | |
| # current date as string | |
| now = datetime.now() | |
| # check if a file for the current date exists | |
| if os.path.exists(f"datasets_{now.strftime('%Y-%m-%d')}.parquet"): | |
| df = pd.read_parquet(f"datasets_{now.strftime('%Y-%m-%d')}.parquet") | |
| return df.to_dict(orient="records") | |
| # List all datasets | |
| datasets = list(api.list_datasets(limit=MAX_DATASETS, full=True)) | |
| # Filter datasets with dataset info | |
| datasets = [ | |
| dataset for dataset in tqdm(datasets) if check_dataset_has_dataset_info(dataset) | |
| ] | |
| parsed_datasets = [] | |
| for dataset in tqdm(datasets): | |
| try: | |
| datasetinfo = parse_dataset(dataset) | |
| column_info = parsed_column_info(dataset.card_data.dataset_info) | |
| parsed_datasets.extend({**datasetinfo, **info} for info in column_info) | |
| except Exception as e: | |
| print(f"Error processing dataset {dataset.id}: {e}") | |
| continue | |
| # Convert to DataFrame | |
| df = pd.DataFrame(parsed_datasets) | |
| # Ensure 'license', 'tags', and 'language' are lists of strings | |
| df["license"] = df["license"].apply(ensure_list_of_strings) | |
| df["tags"] = df["tags"].apply(ensure_list_of_strings) | |
| df["language"] = df["language"].apply(ensure_list_of_strings) | |
| # Ensure 'column_names' is a list | |
| df["column_names"] = df["column_names"].apply( | |
| lambda x: x if isinstance(x, list) else [] | |
| ) | |
| df = df.astype({"hub_id": "string", "config_name": "string"}) | |
| # save to parquet file with current date | |
| # df.to_parquet(f"datasets_{now.strftime('%Y-%m-%d')}.parquet") | |
| # # save to JSON file with current date | |
| # df.to_json( | |
| # f"datasets_{now.strftime('%Y-%m-%d')}.json", orient="records", lines=True | |
| # ) | |
| # return a list of dictionaries | |
| return df.to_dict(orient="records") | |