Services
The types of work I do, with examples.
Data Extraction, Cleaning and Processing
I build tools to pull data out of CSV, XML, JSON, PDF scans, and large exports, then clean it and remove duplicates. The output is a file or records loaded into your system, ready for your analysts to use.
For one client, I deduplicated records across names, companies, and locations in a 10.8M-row PostgreSQL database. Another sent 320,000 contact records in nine inconsistent CSV files, which I standardized into one format. For a third project, I extracted ~4,000 records from 117 old PDF book scans, using both the text layer and fresh OCR, and loaded them into PostgreSQL behind a search and lookup tool. For a researcher, I combined two dozen segments of a public dataset, split by topic and by two-year period across 1999–2002, into one 20k-row spreadsheet.
Data Analysis and Reporting
I analyze your data to answer your questions, delivering a report with figures, plus a spreadsheet or reproducible notebook when called for. I can also build the statistical models your work needs. This is what my B.S. in Statistics trained me to do.
For one client, I measured the effect of a food waste intervention using repeated-measures and subgroup analyses on survey data from three timepoints. I delivered the report, figures, and a Jupyter notebook. Another client was a law firm that needed to know whether to hire another phone agent; I classified the calls in its logs and plotted daily volume to find the peak periods.
In another project, two reference datasets measured the same attributes on incompatible scales, with no crosswalk between them. I extracted the records of one from scanned PDFs, and the other from an existing JSON document store, into PostgreSQL. I used empirical distributions for mappable attributes on both sides to build a percentile mapping model that enabled conversion from the old specification to the new one.
API Integration
I build tools to pull data from APIs and/or push it to APIs, in service of creating a reliable information system that just works. I'll read the documentation, do the hard work of establishing how the API actually behaves— handling pagination, rate limits, authentication, parallelized upload/download, & anything else it throws at me.
I've written clients for the Gmail API, the Populi & Atrium APIs, and the Google Sheets API among many others
ETL Pipelines
I build tooling to move data on a schedule from point A to point B with minimal supervision. It might be a single synchronization script, or a staged pipeline hosted in a Docker container on AWS. I can give it discrete, reproducible steps with a FastAPI control plane to give you visibility into every step of the process.
One platform I built pulls records repeatedly from external APIs into a PostgreSQL database through a shared framework. Another marketing analytics pipeline I built follows the same model from the command line, writing intermediate artifacts in Parquet or JSON. Both are containerized and covered by integration tests.
Data Migration
I build tools to move a business's records from one system to another without losing data or creating duplicates.
For one client, I migrated an entire CRM using nothing but the two vendors' APIs, staging with PostgreSQL. Another client was a small college that needed a tool to synchronize between a legacy platform and its replacement, so both systems could run in parallel during the changeover.
The most prominent project I've done is an async Python toolkit built against the Lawmatics API for a legal-tech client. Their business model requires a migration whenever they onboard a customer, so I built a reusable toolkit; I've conducted nine migrations with it to date. That client wrote me a letter of recommendation.
Semantic Analysis Using ML
I'm certified in ML, and I know how to apply those skills to textual and semantic tasks. I build semantic tools to surface insights or test hypotheses.
I've built a semantic search and ranking engine using transformer embeddings. It scores documents, using several matching strategies, and excludes matches against negative examples. Another tool I built combines embedding similarity with BM25 relevance scoring over a term cloud. This surfaces more distinctive passages than plain cosine similarity when every document uses similar language.