"The field is always populated" is folklore until you profile it. This playbook uses AI-generated profiling scripts to measure nulls, formats, duplicates, and referential breaks in source extracts — then converts every finding into a migration or data-quality requirement, so surprises surface in analysis instead of in cutover week.
Workflow area: Data & Evidence · Tier: Core · Hands-on time: ~35 minutes
Every migration and integration project carries the same buried risk: requirements written against what stakeholders believe the data looks like, not what it actually contains. The system owner swears customer IDs are unique; the extract says 3% are duplicated. Profiling used to demand a data engineer and a week; with an LLM writing the pandas or Power Query for you, it demands an afternoon and the discipline to turn findings into numbered requirements rather than a shrug.
Get the extract and its paperwork. Request the source extract plus three facts in writing: extraction date, row count at source, and any filters applied. Verify the file's row count matches. Without this, every finding is contestable.
Generate the profiling script. Attach the file (or just its column headers and ten pseudonymized sample rows, if the data must stay put) to Claude or ChatGPT:
You are helping a business analyst profile a source extract
ahead of a migration. File: [e.g. "vendors.csv, 48,112 rows,
expected one row per vendor"].
Write a Python/pandas script that reports, per column:
1. Null and blank-string counts and percentages.
2. Distinct value count; top 10 values with frequencies for
any column under 50 distinct values.
3. Format consistency for dates, phones, postal codes, and
IDs — list every distinct pattern found with counts.
4. Duplicate analysis on [KEY COLUMN(S)]: exact duplicates
and same-key-different-values conflicts, with examples.
5. Referential check: values in [FK COLUMN] with no match in
[REFERENCE FILE/LIST].
6. Range checks: dates outside [PLAUSIBLE RANGE], negative
amounts, zero-length strings.
Output a findings table: column, check, result, severity
(INFO/WARN/CRITICAL). Flag anything that would break a
migration mapping as CRITICAL. Do not modify the data.
Run it and read the findings like an analyst, not an auditor. Typical output:
FINDINGS — vendors.csv (48,112 rows, extracted 2026-07-31)
| Column | Check | Result | Sev |
| vendor_id | duplicates | 1,447 ids on 2+ rows; | CRITICAL |
| | | 212 with conflicting | |
| | | bank details | |
| tax_id | nulls | 9.4% null (4,522 rows) | CRITICAL |
| country | formats | "DE", "Germany", | WARN |
| | | "GERMANY" all present | |
| created_on | range | 38 dates in 1900-01-01 | WARN |
| pay_terms | distinct | 61 values incl. "NET30",| |
| | | "Net 30", "30 days" | WARN |
For each CRITICAL, pull five example rows and look at them. Duplicated vendor IDs with conflicting bank details is not a data note — it is a fraud-control conversation.
Take findings to the data owner before writing anything. Every anomaly has one of three explanations: known-and-intentional (the 1900 dates are a legacy "unknown" convention), known-and-tolerated (duplicates from an old merger, cleanup never funded), or news. The owner's answers decide which findings become requirements and which become documented conventions. Log who said what.
Convert findings into numbered requirements. One finding, one testable requirement, with the profile as evidence:
DQ-04: Prior to migration, the 1,447 duplicate vendor_id
groups shall be resolved to a single surviving record per
vendor, per the dedup rules in Appendix C. Verification:
post-migration profile shows zero duplicate vendor_ids.
Evidence: profile 2026-07-31, finding F-01.
DQ-07: The migration mapping shall normalize country to
ISO 3166-1 alpha-2; unmappable values route to the
exception queue, not to a default. Evidence: F-03.
Ask the AI to draft these from the findings table — then edit severity, ownership, and verification method yourself, because those are judgment calls.
Version the profile and schedule the re-run. Save script, findings, and owner responses with the extract date. Re-run on the cutover extract — the delta between profiles is your late-breaking risk report.
Source extracts are among the most sensitive artifacts a BA handles — vendor bank details, customer identifiers, salary fields — so profile them only in approved environments, pseudonymize before any upload, and prefer the script-only pattern where the AI never sees a single real row.
Profiling converts data folklore into counts, and counts into requirements — the project that measures its nulls and duplicates in week two writes the dedup requirement calmly; the one that doesn't discovers the same numbers during cutover, at maximum possible cost.