Привет! Меня зовут Ибрагим, я занимаюсь сбором данных для улучшения навыков кода LLM.
TL;DR
Я собрал датасет метаданных по ~40 млн публичных репозиториев GitHub. Внутри — звёзды, форки, лицензии, язык, описание, размер, дата создания и др. Схема по смыслу максимально совместима с GitHub API. Лицензия — MIT. Ниже — как скачать, что внутри и идеи использования. Собрал то, чего самому не хватало — делюсь, вдруг ещё кому жизнь упростит.
HF Datasets: ibragim-bad/github-repos-metadata-40M
Пример кода и простые визуализации: в GitHub-репозитории к датасету.
Подходит для: учебных проектов, быстрых прототипов, EDA, простых моделей, поиска/кластеризации.

А зачем?
Я давно ковыряю данные с GitHub и заметил, что полных публичных выгрузок по репозиториям почти нет: есть только GitHub Repos Database в BigQuery (~3 млн репозиториев и не все поля, плюс нужна учётка GCP). Можно еще пособирать популярные репозитории через GitHub API, но он быстро упирается в лимиты и включает только до 1k объектов даже с пагинацией. Поэтому я собрал собственный датасет GitHub репозиториев. Датасет отлично подходит для практики и учебных мини‑проектов: есть категориальные и числовые признаки, даты, пропуски и короткий текст — можно и EDA сделать, и фичи посчитать, и поиск/кластеризацию на описаниях сделать.
Как собирал данные
В качестве источника событий я использовал GH Archive. GH Archive — это открытый почасовой архив публичных событий GitHub (push, issue, pull request, star и т.д.) в JSON. Каждое событие содержит время и payload
, где часто лежат снапшоты связанных объектов (например, метаданные репозитория внутри PullRequestEvent
). Архив покрывает только публичную активность.
Я использовал два типа событий из GH Archive. События CreateEvent с ref_type=repository
дают метку created_at
и сам факт создания репозитория. События PullRequestEvent содержат в payload
снапшот метаданных репозитория (forks
, license
, language
, description
, size
, visibility
и счётчики); заодно из них я беру индекс pull request, чтобы грубо оценить количество PR. После извлечения я агрегирую записи по ключу owner/name
: для числовых и строковых полей оставляю последний валидный снапшот по хронологии событий, привожу типы, а отсутствующие значения оставляю null
. Важно учитывать, что watchers_count
в исторических снапшотах фактически равен stargazers_count
— это особенность данных GitHub на момент события.
Я подумал что может быть интересно посмотреть на репозитории на разных языках (естественных языках, не компьютерных) и для этого решил детектировать язык по описанию репозитория. Детекцию языка по описания репозитория сделал старой рабочей лошадкой: моделью fastText. Определяет 176 языков. Поля:
description_language
— ISO-код языка;description_language_score
— уверенность модели (0–1).
Так как описания часто короткие, качество детекции может быть не очень. Рекомендация, если используете description_language
, то можете фильтровать по порогу, например >= 0.5
(или жёстче под задачу).
Схема датасета
Поле |
Тип |
Описание |
---|---|---|
|
string |
|
|
string |
Основной язык (человекочитаемое значение) |
|
timestamp |
Время создания репозитория (UTC), если доступно |
|
string |
Описание репозитория |
|
string |
Код языка описания репозитория (ISO 639-1/2) |
|
float32 |
Уверенность детекции языка (0–1) |
|
string |
Ключ лицензии в формате, близком к SPDX |
|
int64 |
Текущее число форков |
|
int64 |
Число наблюдателей/звёзд (прим.: устаревшее |
|
int64 |
Размер репозитория (КБ, по данным GitHub) |
|
int64 |
Идентификатор последнего доступного pull request |
Примеры анализа данных
Вот небольшие статистики, которые есть в ноутбуке для анализа данных.



Идеи для учебных мини-проектов
Если интересно разобраться и посмотреть, можете просто скачать датасет с huggingface.
from datasets import load_dataset
ds = load_dataset("ibragim-bad/github-repos-metadata-40M", split="full")
Либо начать с готового кода в GitHub репозитории: ibragim-bad/github-repos-metadata-40M. Мне пришла пара идей, как можно использовать такой датасет.
EDA: топ-языки, рост репозиториев по годам/месяцам, соотношения звёзд/форков, распределение лицензий.
Фичи и простые модели: предсказать вероятность ≥N звёзд по ранним признакам; бининг по размерам/датам.
Поиск/кластеризация: эмбеддинги
description
(по языкам/темам), кластеризация проектов, поиск “похожих” репозиториев.Кросс-срезы: сравнение метрик по
language
,license_key
, видимости.
P.S
В качестве послесловия: если вы преподаёте или только начинаете путь в анализе данных, этот набор может пригодиться для практики на «живом» материале. Он свежий (сбор – середина июля), из реального мира, со своей естественной неполнотой и полностью открытый. Если будут пожелания – пишите: в свободное время смогу расширить и обогатить данные, если будет спрос. Буду признателен за обратную связь. Спасибо!
Timick
Ого, typescript однако удивил.