100 articles · 8 breeds · tools · topics

official statistic

Swine inventory, all farm types (PSA, 2013-2020 scheme)

The national herd as counted on the first morning of January each year, under the farm-type classification PSA used until 2020. Its own highest reading is a January 2020 one, after ASF arrived and before it reached the commercial sector in force. It is NOT the highest the national herd has been: the successor series begins three years earlier and counts higher, which is why nothing here calls this table a peak. PSA still labels its final year preliminary and has not published the table since; the successor series counts by farm size instead and the two schemes must not be joined.

Source stopped · G-9 yearly Machine-retrieved heads

Download this series

What this series says

Computed from the rows during the build, over live rows only — a withdrawn figure is one this site could not stand behind, and reprinting it as a record high would be republishing it under a different heading.

Latest

12,795,721

0.7%

2020. heads.

Highest

12,795,721

2020

Lowest

11,801,656

2014

Range

994,065

Highest minus lowest, across every published row.

Coverage

100%

8 of 8 rows carry a figure.

Span

6y

2013-01-01 to 2020-01-01

Freshness budget

732d

The rule: 366 days for a annual source, times 2 — 732 days. A budget at one cadence fires the moment a release is a day late, and a gate that fires on healthy data is one people learn to ignore.

Last read

2026-08-21

The last date somebody actually opened the source behind these rows.

Every published row

Swine inventory, all farm types (PSA, 2013-2020 scheme)

heads

11,800,00012,000,00012,200,00012,400,00012,600,00012,800,00012,845,42411,751,953201320202014201620172019

Reading it: the line breaks wherever the source published no figure, and each of those runs is shaded. The vertical axis is fitted to the data and both bounds are labelled; it does not start at zero, because ₱150 to ₱260 on a zero-based axis is a flat line and a fitted one is the same fact made legible.

Rows, blanks and columns

Coverage

8 rows, 2013-01-01 to 2020-01-01. 8 carry a figure.

Which optional columns it carries

Beyond the period, the value, the source and the access date, which every row in this archive has. Counted from the rows, so a column that stops being filled stops being listed.

  • first_seen — 8 rows. the date this archive first held a row for that key, set once.
  • receipt_id — 8 rows. the content-addressed receipt proving which document it came from.

Freshness

The publisher stopped. Nothing is carried forward past the last reading, and the date it went quiet is itself the finding.

The rule: 366 days for a annual source, times 2 — 732 days. A budget at one cadence fires the moment a release is a day late, and a gate that fires on healthy data is one people learn to ignore.

Whose survey, read how, out of which document

official statistic

PSA OpenSTAT — Philippine Statistics Authority statistical database

Every row carries the exact page or document it was read from, and the date somebody opened it — not just the agency. Those URLs are in the download, one per row, because "PSA OpenSTAT — Philippine Statistics Authority statistical database" is not a citation anybody can follow.

How it was retrieved

A PXWeb query against PSA OpenSTAT. The table is addressed by its full path, and every dimension this series pins names the code AND the label that code must still read. Both are re-read from the live table's own metadata before anything is written, and a label that has moved refuses the run instead of returning a different commodity at a believable peso figure.

Field Value What guards it
Table 2E/LP/INV/OLD/0072E4FINL4 The full path from DB/ down, never the basename: 0042M4ARN09.px exists under two folders, one stops in 2021 and the other runs to 2026, and nothing in a response says which answered.
Age Classification 0 — "ALL AGES" The label is re-read on every run. A code that changed meaning refuses.
Farm Type 0 — "Total" The label is re-read on every run. A code that changed meaning refuses.
Units heads PSA's own PX header, verbatim. Two production tables one geography level apart declare "metric ton, liveweight" and "metric ton"; reading the second as the first would put a claim on this site the source does not make.
Period the table has no period dimension and its rows are annual, as of January 1 The dimension is resolved by name, never by position, and the live value labels have to look like the style declared here.
Geography the table has no geography dimension

The documents behind these rows

1 document were read to build this series, each hashed on the exact bytes received. The newest 1 are below; the rest are on the provenance page . Download one, hash it, and either it matches or the publisher has reissued it.

Document Read on Bytes Rows sha256
scripts/fetch-psa-swine.mjs 2026-08-21 617 8 f89f11988fcc74a5…

The most recent 8

a decade of a yearly series. The whole thing is in the downloads below — this table is the end of it.

Period Value Source read on
2020 12,795,721 2026-08-21
2019 12,709,248 2026-08-21
2018 12,604,441 2026-08-21
2017 12,427,790 2026-08-21
2016 12,478,711 2026-08-21
2015 11,999,722 2026-08-21
2014 11,801,656 2026-08-21
2013 11,843,051 2026-08-21

All of these rows cite: https://openstat.psa.gov.ph/PXWeb/api/v1/en/DB/2E/LP/INV/OLD/0072E4FINL4.px

Four files, free, with attribution

Every row carries its source, its URL and the date somebody actually opened it, and the attribution line is repeated on every row rather than in a header — because the unit of loss is the row, not the file.

File Format Size Rows What is in it
swine-inventory-legacy-total.csv text/csv 3 KB 8 Published rows only, one row per period. Retracted rows are excluded, so an average taken over this file is correct without filtering. Null values are the token NA.
full/swine-inventory-legacy-total.csv text/csv 3 KB 8 Every row this archive has ever held, including withdrawn ones, with a status column and the retraction date and reason. Use this to audit the archive, not to compute on.
swine-inventory-legacy-total.json application/json 4 KB 8 The same rows as the full CSV, as JSON, with the coverage summary and the licence.
swine-inventory-legacy-total.parquet application/vnd.apache.parquet 2 KB 8 The published rows with types: the numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV has to write.

Sizes: the real ones, from the same call that produced the bytes the endpoint serves. There is deliberately no Parquet of the full file — the withdrawn rows are the ones nobody may compute on without looking.

Or the whole archive at once

Every series stacked under one schema, typed, with real nulls. It is not this series — kept in its own block so nobody takes the whole archive by mistake.

baboyph-industry.parquet

Please link back

Attribution is the only condition, and it is what keeps a figure traceable once it has been copied twice.

Plain text

Baboy PH state-of-the-industry archive, series "swine-inventory-legacy-total". CC BY 4.0. https://baboyph.com/data/swine-inventory-legacy-total

BibTeX

@misc{baboyph-swine-inventory-legacy-total,
  title        = {Swine inventory, all farm types (PSA, 2013-2020 scheme)},
  author       = {{Baboy PH}},
  howpublished = {\url{https://baboyph.com/data/swine-inventory-legacy-total}},
  note         = {heads. CC BY 4.0.},
  urldate      = {2026-08-21},
}

Straight at the data

https://baboyph.com/data/swine-inventory-legacy-total.csv

Licence: CC BY 4.0. The figures themselves are official statistics published by the agencies named above; what this archive adds is the retrieval, the provenance on every row, and the refusals.