S&P Global Xpressfeed — Onboarding Brief
Brief de la tâche "rapatrier les données S&P Global via SFTP + uploader sur Wasabi" — suite à la réception des credentials Xpressfeed par CAL et à la transmission à Wissal (email du 2026-04-13).
Contexte
- CAL a obtenu un abonnement académique S&P Global Xpressfeed pour le Master MaQI en décembre 2025 (ref contrat 001279092.0).
- Packages souscrits : Compustat+CIQ, Transcripts+Filings, GICRS, ESG
Physical Risk, Panjiva Supply Chain (voir
docs/cal/datasets-pipeline.mdpour le détail). - Plateforme = PC SFTP (remplace l'ancien EDX — voir le guide de
migration archivé dans
~/galaxies/knowledge/maqi/spglobal/pc_sftp_vs_edx_file_delivery_migration_guide.pdf). - Wissal Efdaoui (stagiaire MaQI) a été désignée par CAL pour opérer la pipeline de production (mail CAL \(\to\) support S&P 2026-04-13).
- Les fichiers tombent régulièrement sur le serveur SFTP ; il faut les rapatrier en local puis les pousser sur Wasabi avant expiration de la fenêtre de rétention S&P.
Paramètres techniques (migration guide v1.7)
| Champ | Valeur |
|---|---|
| Host (tous feeds sauf GICS) | sftp2.spglobal.com |
| Host (GICS Direct / GICS History) | sftp.gicsfiles.com |
| Port | 22 |
| Auth | password ou SSH RSA Public Key |
| Max connexions concurrentes | 20 |
| Timeout inactivité | 10 min |
| Fenêtre maintenance | Sam 12:00 UTC \(\to\) Dim 12:00 UTC |
| Username Xpressfeed | Ecol5648PC (porté par CAL — transférable à Wissal) |
| Password | transmis par téléphone par support.datafeed.mi@spglobal.com |
Livrables attendus
1. ~/dev/ESERIE/MaQI-perso/data-upload/justfile — nouvelles cibles
Ajouter les cibles suivantes au justfile existant (le pattern
backup / upload est déjà établi pour gdelt/causalitylink/ravenpack/databento).
# --- S&P Global (SFTP pull + Wasabi push) ---
# Configuration
sp_sftp_host := env("SP_SFTP_HOST", "sftp2.spglobal.com")
sp_sftp_user := env("SP_SFTP_USER", "Ecol5648PC")
sp_local := env("SP_LOCAL", home_directory() / "MaQI - data" / "spglobal")
sp_bucket := "maqi-spglobal"
# Pré-requis : remote rclone `spglobal:` dans ~/.config/rclone/rclone.conf
# type = sftp, host = sftp2.spglobal.com, user = Ecol5648PC, pass = obscured
# ou key_file pour SSH key auth (recommandé pour production).
# Inventorier ce qui est disponible sur le serveur SFTP
sp-list:
rclone lsd spglobal: --max-depth 2
# Pull incrémental SFTP → local (idempotent, ne retransfère que les nouveaux)
sp-pull:
mkdir -p "{{sp_local}}"
rclone sync spglobal: "{{sp_local}}" \
--transfers 8 --checkers 16 \
--progress \
--log-file="{{log_dir}}/sp-pull-$(date +%Y%m%d-%H%M).log"
# Push local → Wasabi bucket maqi-spglobal (création du bucket si absent)
sp-upload:
rclone mkdir maqi:{{sp_bucket}} 2>/dev/null || true
rclone sync "{{sp_local}}" maqi:{{sp_bucket}} \
--transfers 8 --checkers 16 --fast-list \
--progress \
--log-file="{{log_dir}}/sp-upload-$(date +%Y%m%d-%H%M).log"
# Pull + upload en chaîne (cron-friendly)
sp-sync: sp-pull sp-upload
# Vérifier la cohérence local / S3 (counts + sizes)
sp-status:
#!/usr/bin/env bash
set -euo pipefail
echo "=== Local ({{sp_local}}) ==="
if [ -d "{{sp_local}}" ]; then
du -sh "{{sp_local}}"
find "{{sp_local}}" -type f | wc -l | xargs echo "files:"
else
echo "NOT DOWNLOADED YET"
fi
echo ""
echo "=== Wasabi (maqi:{{sp_bucket}}) ==="
rclone size maqi:{{sp_bucket}} 2>/dev/null || echo "bucket empty or missing"
2. ~/.config/rclone/rclone.conf — remote spglobal:
Ajouter (sans commiter le password en clair — utiliser rclone obscure pour
chiffrer, ou référencer une clé SSH) :
[spglobal]
type = sftp
host = sftp2.spglobal.com
port = 22
user = Ecol5648PC
# Option A (password) :
pass = <rclone obscure> output
# Option B (SSH key, recommandé pour scripts non-interactifs) :
# key_file = ~/.ssh/spglobal_xpressfeed_ed25519
# key_use_agent = false
disable_hashcheck = false
3. Bucket Wasabi maqi-spglobal
- Créer le bucket sur Wasabi console (région
eu-central-1). - Étendre la policy
maqi-readwritepour inclurearn:aws:s3:::maqi-spglobaletarn:aws:s3:::maqi-spglobal/*(cf. policy existante dansdocs/cal/tech-solutions.mdet~/galaxies/knowledge/maqi/wasabi-maqi-data-upload.md).
4. Documentation (obligatoire — sprint "on documente bien tout")
| Fichier | Contenu |
|---|---|
docs/providers/spgmi-compustat.md | Fiche Compustat + CIQ PIT (schéma Explore/Validate/Negotiate/Decisions) |
docs/providers/spgmi-transcripts.md | Idem pour Transcripts + Machine Readable Filings |
docs/providers/spgmi-gicrs.md | Idem pour GICRS (Cross Reference) |
docs/providers/spgmi-esg-physical-risk.md | Idem pour ESG Physical Risk |
docs/providers/spgmi-panjiva.md | Idem pour Panjiva Supply Chain |
docs/providers/catalog.yaml | operational_status: validated, detail_doc: providers/<id>.md, last_reviewed: 2026-04-15 |
docs/providers/cartography.md | Mettre les 5 entrées S&P en statut 🟢 (validated) |
docs/wasabi/state.md | Ajouter ligne maqi-spglobal (+ bucket tree) |
docs/wasabi/data-structure.md | Schéma du bucket S&P (arborescence par package, format fichiers, exemple S3 key) |
docs/wasabi/sync-history.md | Nouvelle entrée "2026-04-15 — S&P Global initial SFTP pull + Wasabi upload" |
docs/adr/003-spglobal-sftp-pipeline.md | ADR sur le design de la pipeline \(SFTP\to{}Local\to{}Wasabi\) (fenêtre maintenance, rétention, idempotence, séparation credentials) |
5. Notebook démo — nouvelle cellule
Dans notebooks/maqi-data-demo.ipynb, ajouter une section 6 (avant le
health-check) :
- Lister le contenu du bucket
maqi-spglobalviafs.find()récursif. - Charger un échantillon de fichier Compustat en polars (format attendu : CSV gzippé ou XFFMT).
- Afficher schéma + head + row count.
- Ajouter les health-checks correspondants.
Contraintes
- Pas de credentials dans git. Le password S&P et la clé SSH restent hors repo. Référencer uniquement le nom du remote rclone.
- Pas de raw data dans le repo. Les données transitent par
~/MaQI - data/spglobal/(local) puiss3://maqi-spglobal/(Wasabi). Aucun fichier.csv/.xffmt/.gzdans le repo. - Non-redistribution. Licence académique — aucun extrait de contenu brut dans les docs publiques. Les fiches providers contiennent des résumés et des schémas, pas des lignes de données.
- Fenêtre maintenance. Éviter de lancer
sp-syncsamedi après-midi UTC. Documenter dans l'ADR. - Rotation IPs S&P. Utiliser le DNS (
sftp2.spglobal.com), pas les IPs en dur (elles rotent par trimestre). - Max 20 connexions concurrentes. Le flag
--transfers 8respecte.
Définition de terminé
- [ ] Remote rclone
spglobal:configuré,rclone lsd spglobal:retourne la liste des répertoires. - [ ] Cibles
sp-list,sp-pull,sp-upload,sp-sync,sp-statusajoutées au justfile de MaQI-perso, documentées dans son README. - [ ] Bucket Wasabi
maqi-spglobalcréé, policy IAM mise à jour. - [ ]
just sp-pullpuisjust sp-uploadexécutés avec succès (au moins une itération complète). - [ ]
rclone size maqi:maqi-spglobal> 0, structure vérifiable. - [ ] 5 fiches
docs/providers/spgmi-*.mdrédigées. - [ ]
catalog.yaml+cartography.mdmis à jour (statut validated). - [ ]
docs/wasabi/state.md,data-structure.md,sync-history.mdmis à jour. - [ ]
docs/adr/003-spglobal-sftp-pipeline.mdrédigé et indexé. - [ ] Notebook
maqi-data-demo.ipynbenrichi d'une section S&P avec lecture polars. - [ ] Commits locaux dans
~/dev/ESERIE/MaQI-persoet~/dev/ESERIE/MaQI-clone— pas de push, revue manuelle par Emmanuel avant.
Ressources
- PDF migration guide :
~/galaxies/knowledge/maqi/spglobal/pc_sftp_vs_edx_file_delivery_migration_guide.pdf - Hub vault :
~/galaxies/knowledge/maqi/spglobal/README.md - Inventaire contrat :
~/dev/ESERIE/MaQI/docs/cal/datasets-pipeline.md§"Payées \(\to\) S&P Global" - State Wasabi existant :
~/dev/ESERIE/MaQI-clone/docs/wasabi/state.md - Procédure Wasabi existante :
~/galaxies/knowledge/maqi/wasabi-maqi-data-upload.md - Setup rclone existant :
~/galaxies/knowledge/maqi/wasabi-maqi-setup.md - MaQI-perso justfile existant :
~/dev/ESERIE/MaQI-perso/data-upload/justfile - Email CAL \(\to\) Wissal 2026-04-13 (forward support S&P)
Séquencement
-
Sous-tâche 1 — Connexion SFTP (préalable, manuel + worker)
- Récupérer le password auprès de CAL (il est prêt à le transférer à Wissal).
- Configurer le remote rclone
spglobal:localement. rclone lsd spglobal:pour lister les répertoires.
-
Sous-tâche 2 — Justfile + pull local (worker)
- Ajouter les cibles au justfile MaQI-perso.
- Lancer
just sp-pullpour un premier rapatriement.
-
Sous-tâche 3 — Bucket Wasabi + upload (worker)
- Créer
maqi-spglobal, étendre la policy. just sp-upload.
- Créer
-
Sous-tâche 4 — Documentation (worker)
- Toutes les docs listées ci-dessus.
-
Sous-tâche 5 — Notebook (worker)
- Enrichir la démo Colab.
Les sous-tâches 1 et 2 doivent être séquentielles (la 1 débloque la 2). 3 peut tourner en parallèle de 4-5 dès que 2 a rapatrié un échantillon.