Excel and CSV Data Analysis
bytedance/deer-flow
Analyzes uploaded Excel and CSV files with SQL through DuckDB, producing schema inspections, statistical summaries and exports to CSV, JSON or Markdown.
Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.
$ npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ricardoherediaj/football-analytics-tutorials football-match-report --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ricardoherediaj/football-analytics-tutorials.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/football-match-report .claude/skills/football-match-report && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "football-match-report" agent skill from https://github.com/ricardoherediaj/football-analytics-tutorials/tree/main/skills/football-match-report into .claude/skills/football-match-report/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "football-match-report", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ricardoherediaj/football-analytics-tutorials/tree/main/skills/football-match-reportType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ricardoherediaj/football-analytics-tutorials football-match-report --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ricardoherediaj/football-analytics-tutorials.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/football-match-report .agents/skills/football-match-report && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "football-match-report" agent skill from https://github.com/ricardoherediaj/football-analytics-tutorials/tree/main/skills/football-match-report into .agents/skills/football-match-report/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "football-match-report", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ricardoherediaj/football-analytics-tutorials football-match-report --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ricardoherediaj/football-analytics-tutorials.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/football-match-report .cursor/skills/football-match-report && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "football-match-report" agent skill from https://github.com/ricardoherediaj/football-analytics-tutorials/tree/main/skills/football-match-report into .cursor/skills/football-match-report/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "football-match-report", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ricardoherediaj/football-analytics-tutorials.git --path skills/football-match-report--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ricardoherediaj/football-analytics-tutorials football-match-report --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ricardoherediaj/football-analytics-tutorials.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/football-match-report .gemini/skills/football-match-report && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "football-match-report" agent skill from https://github.com/ricardoherediaj/football-analytics-tutorials/tree/main/skills/football-match-report into .gemini/skills/football-match-report/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "football-match-report", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ricardoherediaj/football-analytics-tutorials football-match-reportInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ricardoherediaj/football-analytics-tutorials.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/football-match-report .github/skills/football-match-report && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "football-match-report" agent skill from https://github.com/ricardoherediaj/football-analytics-tutorials/tree/main/skills/football-match-report into .github/skills/football-match-report/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "football-match-report", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ricardoherediaj/football-analytics-tutorials football-match-report --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ricardoherediaj/football-analytics-tutorials.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/football-match-report .opencode/skills/football-match-report && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "football-match-report" agent skill from https://github.com/ricardoherediaj/football-analytics-tutorials/tree/main/skills/football-match-report into .opencode/skills/football-match-report/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "football-match-report", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
football-match-reportBuild post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.
Football Match Report is an agent skill from ricardoherediaj/football-analytics-tutorials. Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `references/metrics.md`, `scripts/render_report.py` and `scripts/scrape_match.py`).
It sits in Data & Analytics, covering CSV and tabular files. The repository describes itself as: Open-source tutorials and code snippets for football analytics. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 7ae8653. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
uvpythonpipplaywrightFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
whoscored.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Football Match Report loads about 2.7k tokens when it runs, and up to ~3.9k if it reads all its reference files. Until then it costs about 34 tokens; SKILL.md has 1,214 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from ricardoherediaj/football-analytics-tutorials at commit 7ae8653, republished under its MIT licence (© ricardoherediaj). 1,214 words, ~2,702 tokens.
.claude/skills/football-match-report/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.Turns any WhoScored match URL into a two-page post-match team report by merging two data sources:
The FotMob match id is auto-resolved from the WhoScored match date + team
names — a single WhoScored URL is all you need. Both sources are required
for the complete report; a FotMob-only scrape (--fotmob-id) renders a
reduced report (shots/momentum/stats) without the event panels.
Charts follow the Post-Match-Report-2.0 blueprint (Adnan Ahmed): UEFA pitch, black background, shirt numbers inside player nodes (circle = starter, box = sub), line-height markers, xT momentum.
Two commands, end to end:
python scripts/scrape_match.py "<whoscored-url>" --out ./data
python scripts/render_report.py --data ./data --out ./reportA third command adds the player-level reports (Top Players dashboard, per-player dashboards, per-player stats CSV):
uv run football-match-report players --data ./data --out ./reportDon't use for: season-long datasets (use soccerdata/StatsBomb open data),
live in-play streams, or non-WhoScored competitions (Understat etc.).
uv (or pip).uv sync --extra scrape (or pip install -e ".[scrape]").uv run playwright install chromium
(WhoScored is bot-walled; the script launches headless Chromium to read
the embedded matchCentreData JSON)./api/data/matchDetails) is used
for shots/xG/momentum/colors and does not require a token.python scripts/scrape_match.py \
"https://www.whoscored.com/matches/1873310/live/international-fifa-club-world-cup-2025-salzburg-real-madrid" \
--out ./dataProduces data/{matchdict.json, events.csv, shots.csv, meta.json, xt_grid.csv}.
The FotMob match id is auto-resolved from date + team names. Pass
--fotmob-id <id> to skip resolution, or --no-browser to reuse a cached
matchdict.json. Any match works — teams, colors, scores and stats all
come from the scraped data; nothing is hardcoded per match.
python scripts/render_report.py --data ./data --out ./reportProduces two 4x3 report figures:
report/match_report_1.png — Team report: passing networks, shot map
with xG stats bar, defensive blocks, goalkeeper saves, progressive passes,
xT momentum, progressive carries, match stats.report/match_report_2.png — Zones report: final-third entries, box
entries, Zone 14 & half-spaces, crosses, pass-end-zone heatmaps, high
turnovers, chance-creating zones, congestion map.uv run football-match-report players --data ./data --out ./report
# or, only specific players:
uv run football-match-report players --data ./data --out ./report \
--players "Lamine Yamal,Mikel Oyarzabal"Produces:
report/match_report_3.png — Top Players dashboard (4x3): top ball
progressor pass maps, passes received by the center-forward, top
defender actions, goalkeeper pass maps + Top10 stacked bar charts
(ball progressors, shot-sequence involvement, defenders, threat
creators via xT).report/players/<name>.png — one 2x3 individual dashboard per
starter (or the names in --players): pass map, carries & take-ons,
shot map with xG/xGOT, passes received, defensive actions, touches
heatmap with distance covered.report/player_stats.csv — merged wide per-player stat table.uv run football-match-report scrape "<whoscored-url>" --out ./data
uv run football-match-report render --data ./data --out ./report| Task | Command |
|---|---|
| Scrape any match (WhoScored + FotMob auto-merged) | python scripts/scrape_match.py "<whoscored-url>" --out ./data |
| Render both report pages | python scripts/render_report.py --data ./data --out ./report |
| Render player-level reports (top players + per player + CSV) | uv run football-match-report players --data ./data --out ./report |
| Limit per-player dashboards to specific names | ... players --players "Lamine Yamal,Mikel Oyarzabal" |
| Explicit FotMob id | ... --fotmob-id 4685754 |
| FotMob-only reduced bundle (no browser) | python scripts/scrape_match.py --fotmob-id 4685754 --out ./data |
| Skip browser (reuse cache) | ... --no-browser |
| Run tests | uv run pytest |
| Lint | uv run ruff check src tests |
/matches/. If the user only has a FotMob link or id,
--fotmob-id still works but event panels degrade.events.csv
exists with 500+ rows and meta.json has teams.home.name.match_report_1.png and match_report_2.png exist.vision_analyze in Hermes) for empty panels or
overlapping text. The most common failure is a missing FotMob id, which
empties the shot map, xT momentum and GK panels — re-scrape with
--fotmob-id.See references/metrics.md for definitions and interpretation notes.
playwright install chromium was skipped, the script exits with install
instructions. --no-browser only works when matchdict.json already
exists in the data dir.x*1.05, y*0.68) — the blueprint convention. Both teams
attack toward x=105 in the raw data; the away team's axes are inverted
for display and home shots are flipped in the shot map.--fotmob-id explicitly (from the FotMob URL #<id>).playerIdNameDictionary; without matchdict.json only counts are shown.playerName (fallback: shortName); if a player's name
differs between sources, xG shows 0. Without shots.csv the individual
shot map falls back to WhoScored events (positions but no xG).player_stats.csv and
the per-player dashboards — bench/roster players with zero events are
skipped by design.Total_Area_Covered (convex hull
guard) instead of crashing the heatmap.scrape_match.py prints per-step status lines and a final
✅ Done in Xs. Bundle ready in ....render_report.py prints ✅ <path> for both PNGs.match_report_1.png: every panel populated, black background, team
colors consistent (home left, away right), shirt numbers legible inside
nodes, xT momentum in the center row.match_report_2.png: all 12 zone panels populated with data.uv run pytest passes (offline, uses synthetic match data).© ricardoherediaj, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (scripts, references) in skills/football-match-report of ricardoherediaj/football-analytics-tutorials.
Open the folder on GitHubat commit 7ae8653
Football Match Report next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Football Match Report this skillricardoherediaj/football-analytics-tutorials | 119 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Excel and CSV Data Analysisbytedance/deer-flow | 84k | 4 repos | ~2.2k | Automated safety check: Pass | MIT | |
| CSV Data Summarizercoffeefuelbump/csv-data-summarizer-claude-skill | 468 | 2 repos | ~1.4k | Automated safety check: Pass | None | |
| Exploratory Data AnalysisOleafly/Oleafly | 212 | 2 repos | ~3.4k | Automated safety check: Notes | MIT | |
| Raccoon DataanalysisSenseTime-Copilot/raccoon-dataanalysis-skill | 137 | — | ~1.9k | Automated safety check: Pass | None | |
| CSV Data Analysis5zjk5/prompt-engineering | 127 | — | ~2.6k | Automated safety check: Pass | None |
bytedance/deer-flow
Analyzes uploaded Excel and CSV files with SQL through DuckDB, producing schema inspections, statistical summaries and exports to CSV, JSON or Markdown.
coffeefuelbump/csv-data-summarizer-claude-skill
Analyzes CSV files, generates summary stats, and plots quick visualizations using Python and pandas.
Oleafly/Oleafly
Perform bounded, local exploratory analysis of explicitly supported scientific files.
SenseTime-Copilot/raccoon-dataanalysis-skill
Raccoon (小浣熊) Data Analysis - Remote code interpreter and data visualization service powered by SenseTime.
5zjk5/prompt-engineering
This skill should be used when users need to analyze CSV or Excel files, understand data patterns, generate statistical summaries, or create data visualizations.
duckduckgo/tracker-radar-collector
Iteratively improves cookie-popup button regex patterns in button-patterns.js against labelled-button-texts.csv.
Categories
Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL. Football Match Report is an agent skill from ricardoherediaj/football-analytics-tutorials. Build post-match team + player reports (24-chart dashboard, per-player dashboards, stats CSV) from a WhoScored URL.
Football Match Report fits situations like: tasks that involve CSV and tabular files.
Run `npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a claude-code`. Or copy the skill folder (skills/football-match-report in ricardoherediaj/football-analytics-tutorials) into .claude/skills/football-match-report in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a codex`. Or copy the skill folder (skills/football-match-report in ricardoherediaj/football-analytics-tutorials) into .agents/skills/football-match-report in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ricardoherediaj/football-analytics-tutorials --skill football-match-report -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/football-match-report, .gemini/skills/football-match-report, .github/skills/football-match-report and .opencode/skills/football-match-report in your project.
Going by SKILL.md and its folder, Football Match Report needs Python for the scripts in its folder and the command-line tools its instructions call (uv, python, pip and playwright). Our summary lists: Python 3.
SKILL.md names 1 domain. In commands or code: whoscored.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Football Match Report is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Football Match Report: Excel and CSV Data Analysis (bytedance/deer-flow, 84k stars), CSV Data Summarizer (coffeefuelbump/csv-data-summarizer-claude-skill, 468 stars), Exploratory Data Analysis (Oleafly/Oleafly, 212 stars) and Raccoon Dataanalysis (SenseTime-Copilot/raccoon-dataanalysis-skill, 137 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ricardoherediaj (a GitHub user) maintains it in ricardoherediaj/football-analytics-tutorials, which has 119 GitHub stars. The repository was last updated on August 8, 2026.
Source: ricardoherediaj/football-analytics-tutorials on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.