Methods

Illustrative, not for reserves reporting or investment decisions

Everything on this site is built from public regulator files that you download yourself. This page says exactly which files, how we clean them, and how the decline curve works, so you can check or reproduce any number. The code is open: github.com/Jay-Kimani/TidyWells.

Data sources

ProvinceFiles we readWhere from
AlbertaWell Licence, Well Infrastructure, Conventional Volumetrics (monthly)Petrinex public data. Volumetrics cover the current production year plus the previous four.
SaskatchewanWell Licence, Well Infrastructure, Conventional Volumetrics (monthly)Petrinex public data, same layout as Alberta.
British ColumbiaProduction Data (zone_prd), Well IndexBC Energy Regulator data centre.

We do not host or redistribute any of these files. The tools run on files you load yourself, and the web tool never uploads them. Published analysis contains only our own aggregate results. Petrinex's terms permit non-commercial use with Crown copyright acknowledged and require consent for commercial use. BC's site terms ask for written permission before reproducing material. We summarise these terms in good faith; this is not legal advice, so check the terms yourself before reusing any data.

Units and rates

Cleaning rules

Decline curve

How we tested it

We fit wells on their first 45 months and predicted the next 12 for up to 500 random wells per group that produced in at least 50 of 57 months (January 2022 to September 2026). See the backtest write-up for results. The script is posts/backtest.py. The Python and browser fits are checked against each other by an automated test, and the loaders are tested on small made-up files.

Known limits

Use it in Python

Not on PyPI yet. From a copy of the repository, run pip install ., then:

import tidywells as tw
vol   = tw.read_volumetrics("path/to/folder", province="AB")
infra = tw.read_well_infrastructure("Well Infrastructure-AB.csv.zip")
lic   = tw.read_well_licence("Well Licence-AB.csv.zip")
wells = tw.join_wells(vol, infra, lic)

s = tw.monthly_series(vol, well_id, "OIL")     # m3 per day, one value per month
t = [i / 12 for i in range(len(s))]            # time in years
fit = tw.fit_arps(t, s.values * 6.28981)       # bbl/d; returns qi, di, b, warnings