Skip to main content
The estimators return population totals. For modelling (what drives a condition to be harvested, how stands grow, which trees die), you need the plot-level records themselves, paired across measurements. pyFIA builds three such tables. They return rows and columns only: nothing is expanded and no modelling choice is made for you.

Stand attributes per acre of condition

Each tree’s TPA_UNADJ is divided by the share of its plot footprint (microplot, subplot or macroplot) that lies in its condition, so values are per acre of condition. Basal area reproduces FIADB’s COND.BALIVE. Pass min_dia=5 for merchantable-size attributes, or plot_cns= to compute any set of plots, including earlier measurements.

Condition pairs

The at-risk set is defined at time 1: every time-1 condition in at_risk_land gets a row for each time-2 condition its land became, from SUBP_COND_CHNG_MTRX. CHNG_AREA_SHARE is the pair’s share of the plot area, and t2_OUTCOME says what the land became (forest, nonforest, water, nonsampled, no_t2_condition). Condition attributes come at both times with t1_ and t2_ prefixes; add more with columns=. Expanded by the plot’s EXPNS and adjustment factor, CHNG_AREA_SHARE reproduces area_change(), so unit-level models and published change estimates share one definition of the land.

Tree fates

Each row is a tree with its GRM COMPONENT and FATE (survivor, ingrowth, cut, mortality, diversion, reversion), its interval weight TPAGROW_UNADJ and the annual rates TPAREMV_UNADJ and TPAMORT_UNADJ, its diameters over the interval, and its TREE attributes at both times. Weighted by the plot’s EXPNS and the adjustment factor for SUBPTYP_GRM, the CUT and DIVERSION rows reproduce removals() and the MORTALITY rows mortality().

Putting them together

The tables share keys, so time-1 stand attributes join onto condition pairs by the time-1 plot and condition:
Compute stands on the time-1 plots (plot_cns=pairs["PREV_PLT_CN"].unique()) when the pairs come from a different evaluation. Label codes with the reference lookups, prefixing time-1 and time-2 labels:
join_reference raises on a code the reference table doesn’t define, so a stale lookup can’t pass unnoticed.

Record where results came from

Save the stamp with anything derived from the database. provenance(checksum=True) adds the file’s SHA-256. The builders also carry an EVALID column when the database is clipped to one evaluation.

See also