{
  "$schema": "https://datapackage.org/profiles/2.0/datapackage.json",
  "name": "baboyph-state-of-the-industry",
  "id": "https://baboyph.com/data",
  "title": "Baboy PH — state of the Philippine swine industry",
  "description": "Every figure this site publishes about Philippine pig farming, with the source, the date it was read and the retraction record for anything withdrawn. Rows are appended and never deleted; a wrong row is retracted in place and stays downloadable in the files whose name begins full/. A null is a published absence, written NA, never zero and never interpolated.",
  "homepage": "https://baboyph.com/data",
  "version": "2026.8.22",
  "keywords": [
    "Philippines",
    "pig farming",
    "hog farmgate price",
    "pork price",
    "swine inventory",
    "African swine fever",
    "presyo ng baboy"
  ],
  "licenses": [
    {
      "name": "CC-BY-4.0",
      "path": "https://creativecommons.org/licenses/by/4.0/",
      "title": "CC BY 4.0"
    }
  ],
  "contributors": [
    {
      "title": "Baboy PH",
      "path": "https://baboyph.com",
      "roles": [
        "dataCurator"
      ]
    }
  ],
  "sources": [
    {
      "title": "Agrilife PH",
      "path": "https://agrilife.ph/"
    },
    {
      "title": "BAI — Livestock, Poultry and Feed Ingredients weekly price monitoring",
      "path": "https://www.bai.gov.ph/Reports/GetSpecific?id=19"
    },
    {
      "title": "Baboy PH editorial synthesis",
      "path": "https://baboyph.com/about"
    },
    {
      "title": "Bangko Sentral ng Pilipinas — peso-dollar reference rate",
      "path": "https://www.bsp.gov.ph/statistics/external/pesodollar.xlsx"
    },
    {
      "title": "Bureau of Animal Industry",
      "path": "https://www.bai.gov.ph/"
    },
    {
      "title": "BusinessMirror",
      "path": "https://businessmirror.com.ph/"
    },
    {
      "title": "BusinessWorld",
      "path": "https://www.bworldonline.com/"
    },
    {
      "title": "PSA OpenSTAT — Philippine Statistics Authority statistical database",
      "path": "https://openstat.psa.gov.ph/"
    },
    {
      "title": "Philippine Statistics Authority — Swine Situation Report",
      "path": "https://psa.gov.ph/livestock-poultry-iprs"
    },
    {
      "title": "PubMed Central — peer-reviewed literature",
      "path": "https://pmc.ncbi.nlm.nih.gov/"
    },
    {
      "title": "SINAG — Samahang Industriya ng Agrikultura",
      "path": "https://sinag.org.ph/"
    },
    {
      "title": "USDA FAS — Production, Supply and Distribution (PSD) livestock database",
      "path": "https://apps.fas.usda.gov/psdonline/app/index.html#/app/downloads"
    },
    {
      "title": "World Bank Commodity Price Data (“the Pink Sheet”) — monthly historical workbook",
      "path": "https://www.worldbank.org/en/research/commodity-markets"
    },
    {
      "title": "eFeedLink — EFL AG-DATA (Philippine live hog price quotes)",
      "path": "https://www.efeedlink.com/"
    },
    {
      "title": "pig333 / 3tres3 — Swine News",
      "path": "https://www.3tres3.com/en/latest_swine_news/"
    }
  ],
  "resources": [
    {
      "name": "prices",
      "path": "https://baboyph.com/data/prices.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 5750,
      "hash": "sha256:8ac69ded7f18cef8aaedb3a15e4d2b4efb720182695dbc1d501042beb92eb4a0",
      "title": "Headline liveweight farmgate price",
      "description": "The curated quarterly figure this site quotes as its headline price, assembled by hand from PSA releases and trade reporting before the machine-retrieved series below existed. It also carries this archive's retraction record: rows the site once published, could not source, and withdrew in the July 2026 audit. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "prices.full",
      "path": "https://baboyph.com/data/full/prices.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 9795,
      "hash": "sha256:80ac355780eb2bce69945cb8e33b61623a2e1ed615467125714f5a9891405b78",
      "title": "Headline liveweight farmgate price — including withdrawn rows",
      "description": "The curated quarterly figure this site quotes as its headline price, assembled by hand from PSA releases and trade reporting before the machine-retrieved series below existed. It also carries this archive's retraction record: rows the site once published, could not source, and withdrew in the July 2026 audit. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "prices.parquet",
      "path": "https://baboyph.com/data/prices.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4400,
      "hash": "sha256:25b090eb245cd3a51119b299f042df9983acd4674da5a3968ceeb404f50f23b8",
      "title": "Headline liveweight farmgate price — Parquet",
      "description": "The curated quarterly figure this site quotes as its headline price, assembled by hand from PSA releases and trade reporting before the machine-retrieved series below existed. It also carries this archive's retraction record: rows the site once published, could not source, and withdrew in the July 2026 audit. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "prices.json",
      "path": "https://baboyph.com/data/prices.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 10804,
      "hash": "sha256:967b9625a0a4c5babedc81f03d9ea8ad241628b0a44f74b651856b915c3fd429",
      "title": "Headline liveweight farmgate price — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "asf-active",
      "path": "https://baboyph.com/data/asf-active.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 1503,
      "hash": "sha256:0355ac4e62fed9a23f78dd3c8f3334baf87648579ae7371d0239b75cebef5b82",
      "title": "ASF active barangays",
      "description": "The national count of barangays with active African swine fever, as BAI reported it. The source stopped — no national figure has been published since 8 May 2026 — so the count is left where it stopped rather than carried forward. Individual outbreaks are still reported and are recorded separately. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "asf-active.full",
      "path": "https://baboyph.com/data/full/asf-active.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 5926,
      "hash": "sha256:c08b1aac8b4f076696741e1a593065d5d33418b91bca378081fe925f3274101f",
      "title": "ASF active barangays — including withdrawn rows",
      "description": "The national count of barangays with active African swine fever, as BAI reported it. The source stopped — no national figure has been published since 8 May 2026 — so the count is left where it stopped rather than carried forward. Individual outbreaks are still reported and are recorded separately. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "asf-active.parquet",
      "path": "https://baboyph.com/data/asf-active.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2534,
      "hash": "sha256:b1bf099d4db71cc37d4cbcb109f591e7419a92f5be9abf70c676021f277bdc95",
      "title": "ASF active barangays — Parquet",
      "description": "The national count of barangays with active African swine fever, as BAI reported it. The source stopped — no national figure has been published since 8 May 2026 — so the count is left where it stopped rather than carried forward. Individual outbreaks are still reported and are recorded separately. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "asf-active.json",
      "path": "https://baboyph.com/data/asf-active.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 6937,
      "hash": "sha256:6075833b68cfa32f9587381a613e54fc90c84d6887280a5474b758f1ed29172e",
      "title": "ASF active barangays — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "herd",
      "path": "https://baboyph.com/data/herd.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 3528,
      "hash": "sha256:75503b2b94bcf344c5c6662450020c2bbbf64df37da5240e0d6891a74d1ab197",
      "title": "National swine inventory",
      "description": "PSA's annual head count of the national herd, all classes. One reading a year, and the slowest-moving number on this site. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "herd.full",
      "path": "https://baboyph.com/data/full/herd.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 6100,
      "hash": "sha256:bfe37cd36b3bd15e2481fe5441bf478a557bf3f7cc3821899f11fdf512f2ad3d",
      "title": "National swine inventory — including withdrawn rows",
      "description": "PSA's annual head count of the national herd, all classes. One reading a year, and the slowest-moving number on this site. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "herd.parquet",
      "path": "https://baboyph.com/data/herd.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3335,
      "hash": "sha256:c058a8942ef6cc582178300e50386a01212a27375bb770e535be0c334542b6d5",
      "title": "National swine inventory — Parquet",
      "description": "PSA's annual head count of the national herd, all classes. One reading a year, and the slowest-moving number on this site. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "herd.json",
      "path": "https://baboyph.com/data/herd.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 6911,
      "hash": "sha256:d7cc39644a591726e45a01caa8e67f28e277fd22434f939f011e06b2ffb0f07e",
      "title": "National swine inventory — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-trend",
      "path": "https://baboyph.com/data/feed-trend.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 1280,
      "hash": "sha256:d1ee096160aeabc03fa25f40a6841e138b4bef9ec421bf8266659583687c0a68",
      "title": "Premium grower/finisher feed price",
      "description": "What a sack of premium grower/finisher feed costs per kilo, from dated retailer listings. One retailer on one day, and labelled as such: nobody publishes a national finished-feed price, and a trend line through a single point is not a trend. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-trend.full",
      "path": "https://baboyph.com/data/full/feed-trend.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 3997,
      "hash": "sha256:6c9136caab8d6b411ec5832689dfc86590db22dddc5a5bd179180a3d199ea6a5",
      "title": "Premium grower/finisher feed price — including withdrawn rows",
      "description": "What a sack of premium grower/finisher feed costs per kilo, from dated retailer listings. One retailer on one day, and labelled as such: nobody publishes a national finished-feed price, and a trend line through a single point is not a trend. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-trend.parquet",
      "path": "https://baboyph.com/data/feed-trend.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2662,
      "hash": "sha256:412316a1a09b841cd5e262e5134572b8f2994bc1cb1b648e850c205efeedd82f",
      "title": "Premium grower/finisher feed price — Parquet",
      "description": "What a sack of premium grower/finisher feed costs per kilo, from dated retailer listings. One retailer on one day, and labelled as such: nobody publishes a national finished-feed price, and a trend line through a single point is not a trend. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-trend.json",
      "path": "https://baboyph.com/data/feed-trend.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 4590,
      "hash": "sha256:2e93fbebefa182880ee063671a4d392db7e2213df05e77c66c6adbbef2fb6514",
      "title": "Premium grower/finisher feed price — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-average",
      "path": "https://baboyph.com/data/hog-farmgate-average.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 6493,
      "hash": "sha256:72fb82505650cdcdab99fea545f8883e0b6eca3a71590697b0e144cb9a2aef1e",
      "title": "Hog farmgate price, all farms (PSA)",
      "description": "PSA's monthly farmgate price for hogs for slaughter across all farm types. The newest of PSA's three populations — this table begins in 2025, where the other two reach back to 2010. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-average.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-average.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 6873,
      "hash": "sha256:0435b94221a3fc14fd42cf550624d5a276d3fe14078315a0cc7e4736088aadd9",
      "title": "Hog farmgate price, all farms (PSA) — including withdrawn rows",
      "description": "PSA's monthly farmgate price for hogs for slaughter across all farm types. The newest of PSA's three populations — this table begins in 2025, where the other two reach back to 2010. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-average.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-average.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2486,
      "hash": "sha256:30f13fb3df19f9c7fb7a28930046a87f7c15e7e419cd99eb4d26f32753058de0",
      "title": "Hog farmgate price, all farms (PSA) — Parquet",
      "description": "PSA's monthly farmgate price for hogs for slaughter across all farm types. The newest of PSA's three populations — this table begins in 2025, where the other two reach back to 2010. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-average.json",
      "path": "https://baboyph.com/data/hog-farmgate-average.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 8702,
      "hash": "sha256:12dfe9145ecc8d6d87807f4e9141f930b013b8ead34ec1b561b89055adff51b7",
      "title": "Hog farmgate price, all farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-household",
      "path": "https://baboyph.com/data/hog-farmgate-household.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 68078,
      "hash": "sha256:976281081189fb4100a81d1e159cc5f00ab63a87c0b3ef00c64eb658b4571a3f",
      "title": "Hog farmgate price, backyard farms (PSA)",
      "description": "PSA's monthly farmgate survey of household farms — the backyard population most people reading this site belong to. Monthly since January 2010, and the longest continuous price series here. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-household.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-household.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 71698,
      "hash": "sha256:c288e368d0f32c681e227ac6c8f7afa7d10147dd816de52ee9b5c48f49e9f924",
      "title": "Hog farmgate price, backyard farms (PSA) — including withdrawn rows",
      "description": "PSA's monthly farmgate survey of household farms — the backyard population most people reading this site belong to. Monthly since January 2010, and the longest continuous price series here. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-household.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-household.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4967,
      "hash": "sha256:9c3e071e3362eecd59795b3c17f55c1318d6dc5f6e6c887863960f67905da116",
      "title": "Hog farmgate price, backyard farms (PSA) — Parquet",
      "description": "PSA's monthly farmgate survey of household farms — the backyard population most people reading this site belong to. Monthly since January 2010, and the longest continuous price series here. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-household.json",
      "path": "https://baboyph.com/data/hog-farmgate-household.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 84588,
      "hash": "sha256:fe8708328ccb73d8ac7cec45a065e668366f84474af7553c12df40048ba1f772",
      "title": "Hog farmgate price, backyard farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-establishment",
      "path": "https://baboyph.com/data/hog-farmgate-establishment.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 70347,
      "hash": "sha256:bae0e860a5135ef6c22d576f58cc6052c466ab2ca8de916cc09ae9f1ac8cf75a",
      "title": "Hog farmgate price, commercial farms (PSA)",
      "description": "PSA's monthly farmgate survey of commercial establishments. The same commodity as the backyard series and a different population: the two are never averaged, and the gap between them is published as its own series instead. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-establishment.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 73967,
      "hash": "sha256:ba0f18d3ebcccf529fb407ae7f5a2a35ebd7e53aef0627da1c96174bdf85be2a",
      "title": "Hog farmgate price, commercial farms (PSA) — including withdrawn rows",
      "description": "PSA's monthly farmgate survey of commercial establishments. The same commodity as the backyard series and a different population: the two are never averaged, and the gap between them is published as its own series instead. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-establishment.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4739,
      "hash": "sha256:e349e2b789d6175a47e88cb295f784431d7b328bbe2dc85c3a94c10be031a3a8",
      "title": "Hog farmgate price, commercial farms (PSA) — Parquet",
      "description": "PSA's monthly farmgate survey of commercial establishments. The same commodity as the backyard series and a different population: the two are never averaged, and the gap between them is published as its own series instead. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment.json",
      "path": "https://baboyph.com/data/hog-farmgate-establishment.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 84584,
      "hash": "sha256:452b9665210da41d6e88e8bc15c5f0f92917882eacaf8d61ab35cb73161b16d5",
      "title": "Hog farmgate price, commercial farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-average-regional",
      "path": "https://baboyph.com/data/hog-farmgate-average-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 773379,
      "hash": "sha256:fe46c6933a33134557a20ba8a6a1fb3f6b167cabc9fd90b278ca4ce164bcb881",
      "title": "Hog farmgate price by province, all farms (PSA)",
      "description": "The all-farms survey across every Philippine region and province. Every row carries its own PSA geolocation code, because a provincial figure that reaches a national chart unlabelled is undetectable in review — it just looks like a month where the price moved. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-farmgate-average-regional.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-average-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 811037,
      "hash": "sha256:937e4546df1fbb62d1bc56ab2df98cfdd26e04b1b52c24f1f8a8abdffba0f072",
      "title": "Hog farmgate price by province, all farms (PSA) — including withdrawn rows",
      "description": "The all-farms survey across every Philippine region and province. Every row carries its own PSA geolocation code, because a provincial figure that reaches a national chart unlabelled is undetectable in review — it just looks like a month where the price moved. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-average-regional.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-average-regional.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 14491,
      "hash": "sha256:6c69319fa67452d749564b5eb997d58caf9ff2c5dfe7c0dc491a0358e9f2f154",
      "title": "Hog farmgate price by province, all farms (PSA) — Parquet",
      "description": "The all-farms survey across every Philippine region and province. Every row carries its own PSA geolocation code, because a provincial figure that reaches a national chart unlabelled is undetectable in review — it just looks like a month where the price moved. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-farmgate-average-regional.json",
      "path": "https://baboyph.com/data/hog-farmgate-average-regional.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 899822,
      "hash": "sha256:912f21afe9de1c8f0298454e526e42c5fb976c47ad55ec849c9f05107d721a96",
      "title": "Hog farmgate price by province, all farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-household-regional",
      "path": "https://baboyph.com/data/hog-farmgate-household-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 8225497,
      "hash": "sha256:1d68a73e6f90371ef0b6e3eec3e23d0136a7113072142056a88bac3c6c3c5e44",
      "title": "Hog farmgate price by province, backyard farms (PSA)",
      "description": "The backyard survey across every Philippine region and province, monthly since 2010. The largest thing in this archive, and the reason a single national average is close to useless as a planning number: the dearest region and the cheapest are further apart than most people think the whole market moves in a year. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-farmgate-household-regional.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-household-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 8619555,
      "hash": "sha256:f594d491db7657030b7510d33e85b7a5192e099acbb8d2b5691ac617258d9a03",
      "title": "Hog farmgate price by province, backyard farms (PSA) — including withdrawn rows",
      "description": "The backyard survey across every Philippine region and province, monthly since 2010. The largest thing in this archive, and the reason a single national average is close to useless as a planning number: the dearest region and the cheapest are further apart than most people think the whole market moves in a year. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-household-regional.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-household-regional.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 93241,
      "hash": "sha256:b55a15683086d5d503226e7571492f21c130bde7dd6f58a16f2256687a9e608d",
      "title": "Hog farmgate price by province, backyard farms (PSA) — Parquet",
      "description": "The backyard survey across every Philippine region and province, monthly since 2010. The largest thing in this archive, and the reason a single national average is close to useless as a planning number: the dearest region and the cheapest are further apart than most people think the whole market moves in a year. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-farmgate-household-regional.json",
      "path": "https://baboyph.com/data/hog-farmgate-household-regional.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 9394868,
      "hash": "sha256:2ec42b9b583a7bfc77b329dd21d1aeb0dffb1aa72dc939a539d4da14ecd137fd",
      "title": "Hog farmgate price by province, backyard farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-establishment-regional",
      "path": "https://baboyph.com/data/hog-farmgate-establishment-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 8465345,
      "hash": "sha256:7e27c2b490cf75d183bb670e6a04b388f276ce0050eeb2a8369a5e8502bbac1d",
      "title": "Hog farmgate price by province, commercial farms (PSA)",
      "description": "The commercial survey across every Philippine region and province. Close to half its rows carry no figure, and that is not a gap in the retrieval: PSA publishes a provincial commercial price only where there are establishments to survey, and the blanks are where there are not. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment-regional.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-establishment-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 8859403,
      "hash": "sha256:3abc1c316a5fe76c942aaa488a99394b197d3051009d731cb5880ae76adc0a4c",
      "title": "Hog farmgate price by province, commercial farms (PSA) — including withdrawn rows",
      "description": "The commercial survey across every Philippine region and province. Close to half its rows carry no figure, and that is not a gap in the retrieval: PSA publishes a provincial commercial price only where there are establishments to survey, and the blanks are where there are not. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment-regional.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-establishment-regional.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 61452,
      "hash": "sha256:0f888a7cbf02bb21899fcda691c3f2bc34ed43e397af19a2ad80d38156723cb7",
      "title": "Hog farmgate price by province, commercial farms (PSA) — Parquet",
      "description": "The commercial survey across every Philippine region and province. Close to half its rows carry no figure, and that is not a gap in the retrieval: PSA publishes a provincial commercial price only where there are establishments to survey, and the blanks are where there are not. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment-regional.json",
      "path": "https://baboyph.com/data/hog-farmgate-establishment-regional.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 9386363,
      "hash": "sha256:926e671c11d928f3efea0de332fef64b5a566f6a01732b7afbcfa4e74d1b0b7a",
      "title": "Hog farmgate price by province, commercial farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "swine-inventory-total",
      "path": "https://baboyph.com/data/swine-inventory-total.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 23011,
      "hash": "sha256:98dca0804915cc64e9cda2552ee9d6469ae61d0fa68b44e2ee7b2e31fe57bfde",
      "title": "Swine inventory, all farms (PSA)",
      "description": "PSA's count of every pig in the country on the first morning of each quarter, all farm classifications together, from 01 January 2010. It measures the herd rather than what the herd costs, which nothing else here does. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-total.full",
      "path": "https://baboyph.com/data/full/swine-inventory-total.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 24255,
      "hash": "sha256:6a42f981e68a94389900b15e8342500252cb2352501df05d9bc73a689eb8f494",
      "title": "Swine inventory, all farms (PSA) — including withdrawn rows",
      "description": "PSA's count of every pig in the country on the first morning of each quarter, all farm classifications together, from 01 January 2010. It measures the herd rather than what the herd costs, which nothing else here does. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "swine-inventory-total.parquet",
      "path": "https://baboyph.com/data/swine-inventory-total.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3263,
      "hash": "sha256:6cdaeb1dc8bf5c90cf03618950fb5c444896e760a604464193a8b9661e590e5a",
      "title": "Swine inventory, all farms (PSA) — Parquet",
      "description": "PSA's count of every pig in the country on the first morning of each quarter, all farm classifications together, from 01 January 2010. It measures the herd rather than what the herd costs, which nothing else here does. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-total.json",
      "path": "https://baboyph.com/data/swine-inventory-total.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 29134,
      "hash": "sha256:f4641e14c7dc82f3bb63978f93e5cb12764ea800c6755733b945f619844a1719",
      "title": "Swine inventory, all farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "swine-inventory-smallhold",
      "path": "https://baboyph.com/data/swine-inventory-smallhold.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 23768,
      "hash": "sha256:b2e5019225ce040ba0021d1def8061e4d6b012add78730fa3a0d29f63bd23026",
      "title": "Swine inventory, smallhold farms (PSA)",
      "description": "The backyard herd counted on its own. Close to four fifths of the national inventory sits in this classification, which is why a commercial-farm figure quoted as a national one is wrong by a margin nobody checks. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-smallhold.full",
      "path": "https://baboyph.com/data/full/swine-inventory-smallhold.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 25012,
      "hash": "sha256:715be370b4f5ce291019e595fb85aaed3a3b7602eff4e6ecf2c12862abea516e",
      "title": "Swine inventory, smallhold farms (PSA) — including withdrawn rows",
      "description": "The backyard herd counted on its own. Close to four fifths of the national inventory sits in this classification, which is why a commercial-farm figure quoted as a national one is wrong by a margin nobody checks. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "swine-inventory-smallhold.parquet",
      "path": "https://baboyph.com/data/swine-inventory-smallhold.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3273,
      "hash": "sha256:5922ad6a66eff30afbe49dbf31c03bdf1e0e2cf0cfaba92b1fe9aeeb05001aa1",
      "title": "Swine inventory, smallhold farms (PSA) — Parquet",
      "description": "The backyard herd counted on its own. Close to four fifths of the national inventory sits in this classification, which is why a commercial-farm figure quoted as a national one is wrong by a margin nobody checks. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-smallhold.json",
      "path": "https://baboyph.com/data/swine-inventory-smallhold.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 29109,
      "hash": "sha256:70a57b18e2eb35cdf5df33a3f7ebcca1942081152d3e5612efbb74b1f4bcc4df",
      "title": "Swine inventory, smallhold farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "swine-inventory-semicommercial",
      "path": "https://baboyph.com/data/swine-inventory-semicommercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 24706,
      "hash": "sha256:eed16fdf2aff2b4cb50a14313e52e5cc9e2ce3dad2df453dc27ba1dc828a747f",
      "title": "Swine inventory, semi-commercial farms (PSA)",
      "description": "The smallest of the three classifications and the one that swings hardest. PSA created it when it retired the old Backyard/Commercial split, so it has no counterpart in the 2013-2020 series. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-semicommercial.full",
      "path": "https://baboyph.com/data/full/swine-inventory-semicommercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 25950,
      "hash": "sha256:15eae339045fbca62be6bd761a9d29e678a80a5a22e24c99c0c9609b3373aa44",
      "title": "Swine inventory, semi-commercial farms (PSA) — including withdrawn rows",
      "description": "The smallest of the three classifications and the one that swings hardest. PSA created it when it retired the old Backyard/Commercial split, so it has no counterpart in the 2013-2020 series. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "swine-inventory-semicommercial.parquet",
      "path": "https://baboyph.com/data/swine-inventory-semicommercial.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3232,
      "hash": "sha256:d6c816a5c8249c0be6e8d00320e0478e4c9035c1cd5c31df0aca65700c8c3b52",
      "title": "Swine inventory, semi-commercial farms (PSA) — Parquet",
      "description": "The smallest of the three classifications and the one that swings hardest. PSA created it when it retired the old Backyard/Commercial split, so it has no counterpart in the 2013-2020 series. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-semicommercial.json",
      "path": "https://baboyph.com/data/swine-inventory-semicommercial.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 29068,
      "hash": "sha256:6e25e22d3fe7d4b048c087fa9828f30801a79f585cb689864e5a5a4c469cb5d0",
      "title": "Swine inventory, semi-commercial farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "swine-inventory-commercial",
      "path": "https://baboyph.com/data/swine-inventory-commercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 23969,
      "hash": "sha256:a7a07ba07405a0a5ada2555abf8a23024ee4073b732354762d242a5ffbdb71f4",
      "title": "Swine inventory, commercial farms (PSA)",
      "description": "The commercial herd on the same quarterly morning. Read beside the smallhold count rather than instead of it: the two populations came back from African swine fever at visibly different speeds. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-commercial.full",
      "path": "https://baboyph.com/data/full/swine-inventory-commercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 25213,
      "hash": "sha256:03ed2185173a8f73b14b24724baa7c10300df237850c985e9e8536fbe7ad3a8e",
      "title": "Swine inventory, commercial farms (PSA) — including withdrawn rows",
      "description": "The commercial herd on the same quarterly morning. Read beside the smallhold count rather than instead of it: the two populations came back from African swine fever at visibly different speeds. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "swine-inventory-commercial.parquet",
      "path": "https://baboyph.com/data/swine-inventory-commercial.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3263,
      "hash": "sha256:af64bd046eb849af2a9d5a4bba922013922e18452e7b9bd9d5094dd56edd5fcf",
      "title": "Swine inventory, commercial farms (PSA) — Parquet",
      "description": "The commercial herd on the same quarterly morning. Read beside the smallhold count rather than instead of it: the two populations came back from African swine fever at visibly different speeds. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-commercial.json",
      "path": "https://baboyph.com/data/swine-inventory-commercial.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 29114,
      "hash": "sha256:4cc5ef53dbbd8bb0f44fcc9abe841474c7c23bd7607f370e4a998f591baf0751",
      "title": "Swine inventory, commercial farms (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "swine-inventory-legacy-total",
      "path": "https://baboyph.com/data/swine-inventory-legacy-total.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 2941,
      "hash": "sha256:2df283f2965b77e33591164f4d68d62bf9c2700befcd0dfb99385251fcce81fb",
      "title": "Swine inventory, all farm types (PSA, 2013-2020 scheme)",
      "description": "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. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-total.full",
      "path": "https://baboyph.com/data/full/swine-inventory-legacy-total.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 3123,
      "hash": "sha256:6e6526ad19efff404861b3ea775adb3c07088c1328e32f40076b8412c38582c5",
      "title": "Swine inventory, all farm types (PSA, 2013-2020 scheme) — including withdrawn rows",
      "description": "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. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-total.parquet",
      "path": "https://baboyph.com/data/swine-inventory-legacy-total.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2279,
      "hash": "sha256:1fceb8b7432378941930094eaf2248043be5ab6c8e21d469081db3dfb2dc2db0",
      "title": "Swine inventory, all farm types (PSA, 2013-2020 scheme) — Parquet",
      "description": "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. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-total.json",
      "path": "https://baboyph.com/data/swine-inventory-legacy-total.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 4048,
      "hash": "sha256:ebf7bccb471e6f50567eb46fe8e3d8ada54cc71213ad04055658d4a5d89f458c",
      "title": "Swine inventory, all farm types (PSA, 2013-2020 scheme) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "swine-inventory-legacy-backyard",
      "path": "https://baboyph.com/data/swine-inventory-legacy-backyard.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 3005,
      "hash": "sha256:68551ff0056155a681ab115d3633bd11ff428cb6ebfc950f36720e1446821607",
      "title": "Swine inventory, backyard farms (PSA, 2013-2020 scheme)",
      "description": "The backyard half of the retired classification. Not the same population as the smallhold series, which is exactly why they are kept apart: PSA moved the boundary when it replaced the scheme, so a farm that counted as backyard in 2020 is not necessarily smallhold now. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-backyard.full",
      "path": "https://baboyph.com/data/full/swine-inventory-legacy-backyard.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 3187,
      "hash": "sha256:46625f48f256ae3574aece799db1b7f3521e79290bec9e8cb4c755ea16d81715",
      "title": "Swine inventory, backyard farms (PSA, 2013-2020 scheme) — including withdrawn rows",
      "description": "The backyard half of the retired classification. Not the same population as the smallhold series, which is exactly why they are kept apart: PSA moved the boundary when it replaced the scheme, so a farm that counted as backyard in 2020 is not necessarily smallhold now. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-backyard.parquet",
      "path": "https://baboyph.com/data/swine-inventory-legacy-backyard.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2272,
      "hash": "sha256:dc7be275524aa1fa535736cb928d870b6f39f1327bb8e0c32f5349e846a484fb",
      "title": "Swine inventory, backyard farms (PSA, 2013-2020 scheme) — Parquet",
      "description": "The backyard half of the retired classification. Not the same population as the smallhold series, which is exactly why they are kept apart: PSA moved the boundary when it replaced the scheme, so a farm that counted as backyard in 2020 is not necessarily smallhold now. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-backyard.json",
      "path": "https://baboyph.com/data/swine-inventory-legacy-backyard.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 4052,
      "hash": "sha256:e68713af440b8aa2c93929d5e3428575ef4adc19b1b41e1124151206ea96b5ec",
      "title": "Swine inventory, backyard farms (PSA, 2013-2020 scheme) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "swine-inventory-legacy-commercial",
      "path": "https://baboyph.com/data/swine-inventory-legacy-commercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 3053,
      "hash": "sha256:51d5a899097f0cf75421b2751fa9e8237f1b966fb787bf8d0cae9b187aea4a9f",
      "title": "Swine inventory, commercial farms (PSA, 2013-2020 scheme)",
      "description": "The commercial half of the retired classification, 2013 to 2020. Its successor splits the same farms across Semi-Commercial and Commercial, so the old and new lines do not meet and are never drawn as one. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-commercial.full",
      "path": "https://baboyph.com/data/full/swine-inventory-legacy-commercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 3235,
      "hash": "sha256:3c30174874ab88871223209f2a54cc8b20bf853a35ccf699f452b5927c8566fe",
      "title": "Swine inventory, commercial farms (PSA, 2013-2020 scheme) — including withdrawn rows",
      "description": "The commercial half of the retired classification, 2013 to 2020. Its successor splits the same farms across Semi-Commercial and Commercial, so the old and new lines do not meet and are never drawn as one. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-commercial.parquet",
      "path": "https://baboyph.com/data/swine-inventory-legacy-commercial.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2287,
      "hash": "sha256:ea6a1daa32d1838775859df3266552f42681f5fc80a8c7fda004fa8ea0fca7b0",
      "title": "Swine inventory, commercial farms (PSA, 2013-2020 scheme) — Parquet",
      "description": "The commercial half of the retired classification, 2013 to 2020. Its successor splits the same farms across Semi-Commercial and Commercial, so the old and new lines do not meet and are never drawn as one. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "swine-inventory-legacy-commercial.json",
      "path": "https://baboyph.com/data/swine-inventory-legacy-commercial.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 4062,
      "hash": "sha256:eeec04cd19e85c8b2dd6621d7f7c629cf6bf1e16d8fdac8de44377fef73a1fd0",
      "title": "Swine inventory, commercial farms (PSA, 2013-2020 scheme) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-production-national",
      "path": "https://baboyph.com/data/hog-production-national.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 42185,
      "hash": "sha256:868c2de9acd8018f2fa578a9407b43087b4c3ad44f1d1be6121b4d97c5b46629",
      "title": "Hog production volume (PSA)",
      "description": "Quarterly hog production in liveweight tonnes, back to 1997. The commodity sits two dots deep in PSA's dimension: `LIVESTOCK1/` at depth zero is the sum over hogs, cattle, carabao, goats and dairy, and reading that as hogs overstates production by roughly a third. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-production-national.full",
      "path": "https://baboyph.com/data/full/hog-production-national.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 44347,
      "hash": "sha256:b90ddbde1cb070058b01aa18667be8c3c445e6ffc38ed2d99995f75f2ddb8df4",
      "title": "Hog production volume (PSA) — including withdrawn rows",
      "description": "Quarterly hog production in liveweight tonnes, back to 1997. The commodity sits two dots deep in PSA's dimension: `LIVESTOCK1/` at depth zero is the sum over hogs, cattle, carabao, goats and dairy, and reading that as hogs overstates production by roughly a third. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-production-national.parquet",
      "path": "https://baboyph.com/data/hog-production-national.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3957,
      "hash": "sha256:ea796bbe3eafa25bc4de149a839e16be9484aa54317803fd16b679ed35c5edff",
      "title": "Hog production volume (PSA) — Parquet",
      "description": "Quarterly hog production in liveweight tonnes, back to 1997. The commodity sits two dots deep in PSA's dimension: `LIVESTOCK1/` at depth zero is the sum over hogs, cattle, carabao, goats and dairy, and reading that as hogs overstates production by roughly a third. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-production-national.json",
      "path": "https://baboyph.com/data/hog-production-national.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 51855,
      "hash": "sha256:d10550381f03c5dbbfbec3bdb35b05ed9ddb12be8dfbcba73bd12ed0d5f5ea01",
      "title": "Hog production volume (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-production-regional",
      "path": "https://baboyph.com/data/hog-production-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 669566,
      "hash": "sha256:a11629d1c457cdc66ac7610f3f61361d9a5db6bddb7850f3ba7e3075b571a58e",
      "title": "Hog production volume by region (PSA)",
      "description": "The same quarterly volume across all eighteen regions, back to 2000. PSA declares its unit here as plain metric ton where the national table of the same commodity says metric ton liveweight, so the two are charted together only with that difference stated. The regional split is the only way to watch the ASF collapse arrive one region at a time. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-production-regional.full",
      "path": "https://baboyph.com/data/full/hog-production-regional.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 703948,
      "hash": "sha256:065a99c8c73428ca008c7943ea09e9fd14775b349de114fc6b641f131b5f1e8c",
      "title": "Hog production volume by region (PSA) — including withdrawn rows",
      "description": "The same quarterly volume across all eighteen regions, back to 2000. PSA declares its unit here as plain metric ton where the national table of the same commodity says metric ton liveweight, so the two are charted together only with that difference stated. The regional split is the only way to watch the ASF collapse arrive one region at a time. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-production-regional.parquet",
      "path": "https://baboyph.com/data/hog-production-regional.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 17722,
      "hash": "sha256:ed9eaf4669bd31f7867d6df7b683ea52ee55e588cda34fd230e595599c973237",
      "title": "Hog production volume by region (PSA) — Parquet",
      "description": "The same quarterly volume across all eighteen regions, back to 2000. PSA declares its unit here as plain metric ton where the national table of the same commodity says metric ton liveweight, so the two are charted together only with that difference stated. The regional split is the only way to watch the ASF collapse arrive one region at a time. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date",
          "geo"
        ]
      }
    },
    {
      "name": "hog-production-regional.json",
      "path": "https://baboyph.com/data/hog-production-regional.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 817750,
      "hash": "sha256:d0846813e49c6f0ec9ff658237547380f0c0839e87003efce7a3deba8cc36731",
      "title": "Hog production volume by region (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-slaughtered",
      "path": "https://baboyph.com/data/hog-slaughtered.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 49887,
      "hash": "sha256:6e6aea77a72bc184d89c4e57cfce3a90836004fa12a1b3aadb7675eeef68f5fd",
      "title": "Hogs slaughtered in slaughterhouses (PSA)",
      "description": "Hogs slaughtered in registered slaughterhouses each quarter since 1987. Registered is the word doing the work here: backyard slaughter falls outside it, so this follows the commercial chain rather than what the country eats. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-slaughtered.full",
      "path": "https://baboyph.com/data/full/hog-slaughtered.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 52769,
      "hash": "sha256:e403776027185b51e7094c35aa3be5ec5d561f86471ef1f55c43215eb781c1db",
      "title": "Hogs slaughtered in slaughterhouses (PSA) — including withdrawn rows",
      "description": "Hogs slaughtered in registered slaughterhouses each quarter since 1987. Registered is the word doing the work here: backyard slaughter falls outside it, so this follows the commercial chain rather than what the country eats. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-slaughtered.parquet",
      "path": "https://baboyph.com/data/hog-slaughtered.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4409,
      "hash": "sha256:df7f0ccda4ef086fc5ff1a932ae52227173ec8e8b3ab966462586d203e1c2ced",
      "title": "Hogs slaughtered in slaughterhouses (PSA) — Parquet",
      "description": "Hogs slaughtered in registered slaughterhouses each quarter since 1987. Registered is the word doing the work here: backyard slaughter falls outside it, so this follows the commercial chain rather than what the country eats. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-slaughtered.json",
      "path": "https://baboyph.com/data/hog-slaughtered.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 66394,
      "hash": "sha256:640678985d1fc048d8a035ced3dee7f9420bf384b6cd29630bbcfdfd426bc504",
      "title": "Hogs slaughtered in slaughterhouses (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-retail-psa-kasim",
      "path": "https://baboyph.com/data/pork-retail-psa-kasim.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 36665,
      "hash": "sha256:3a61dda6bf58b77354b5535aa6920c3fab0ef3cf84a46db39aa80e20b517a005",
      "title": "Pork kasim retail price (PSA)",
      "description": "PSA's monthly national average retail price for fresh pork kasim. Set against `hog-farmgate-average` it gives the farmer's share directly, and the gap is wider than most people assume. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-kasim.full",
      "path": "https://baboyph.com/data/full/pork-retail-psa-kasim.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 38557,
      "hash": "sha256:8ec8dabbeb7eb63706abd39a8051721fe83812a0e082822bc07e84e2790bfdaa",
      "title": "Pork kasim retail price (PSA) — including withdrawn rows",
      "description": "PSA's monthly national average retail price for fresh pork kasim. Set against `hog-farmgate-average` it gives the farmer's share directly, and the gap is wider than most people assume. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-retail-psa-kasim.parquet",
      "path": "https://baboyph.com/data/pork-retail-psa-kasim.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3808,
      "hash": "sha256:11936e24815b6da91a6ad236587cb22d4eaf1f027b0f8188638486e4bda97676",
      "title": "Pork kasim retail price (PSA) — Parquet",
      "description": "PSA's monthly national average retail price for fresh pork kasim. Set against `hog-farmgate-average` it gives the farmer's share directly, and the gap is wider than most people assume. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-kasim.json",
      "path": "https://baboyph.com/data/pork-retail-psa-kasim.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 45799,
      "hash": "sha256:05f94df373ba8ab82259d6df4d89f7d689c18c514574001317a6fa63f8a9123c",
      "title": "Pork kasim retail price (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-retail-psa-liempo",
      "path": "https://baboyph.com/data/pork-retail-psa-liempo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 37080,
      "hash": "sha256:d6e98aa590618f41702096162057c8bfcbad385754de32445fab9497b4f54b15",
      "title": "Pork liempo retail price (PSA)",
      "description": "Monthly national average for fresh liempo, the dearest of the four cuts PSA prices and the one that moves most with import volume. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-liempo.full",
      "path": "https://baboyph.com/data/full/pork-retail-psa-liempo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 38972,
      "hash": "sha256:7d174c8c010dfe19d99678876e90317336422fb6aa84f15bbc70622019bf55c4",
      "title": "Pork liempo retail price (PSA) — including withdrawn rows",
      "description": "Monthly national average for fresh liempo, the dearest of the four cuts PSA prices and the one that moves most with import volume. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-retail-psa-liempo.parquet",
      "path": "https://baboyph.com/data/pork-retail-psa-liempo.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3796,
      "hash": "sha256:6378abca7685013eedb46f131583dd009b57e45970aa28272069d294f05f52ed",
      "title": "Pork liempo retail price (PSA) — Parquet",
      "description": "Monthly national average for fresh liempo, the dearest of the four cuts PSA prices and the one that moves most with import volume. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-liempo.json",
      "path": "https://baboyph.com/data/pork-retail-psa-liempo.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 45911,
      "hash": "sha256:d91645e6ac1bea7255bab58c3a3857a8d42114220378da1f3e3dceb0ecfb7fa4",
      "title": "Pork liempo retail price (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-retail-psa-meat-with-bones",
      "path": "https://baboyph.com/data/pork-retail-psa-meat-with-bones.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40785,
      "hash": "sha256:70d7a785565e0a89e2d71c1cef2545a92b8ba603b9190199c879fb7c93b941d1",
      "title": "Pork meat with bones retail price (PSA)",
      "description": "Monthly national average for fresh pork sold bone-in. The cheapest of the four, and the one most households actually put in the basket. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-meat-with-bones.full",
      "path": "https://baboyph.com/data/full/pork-retail-psa-meat-with-bones.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 42677,
      "hash": "sha256:b2139e15efa2c990d9ac193659ee238f8e152eb10291453a1fa04c015f32d391",
      "title": "Pork meat with bones retail price (PSA) — including withdrawn rows",
      "description": "Monthly national average for fresh pork sold bone-in. The cheapest of the four, and the one most households actually put in the basket. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-retail-psa-meat-with-bones.parquet",
      "path": "https://baboyph.com/data/pork-retail-psa-meat-with-bones.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3817,
      "hash": "sha256:ae1ec22ea72fb923746102c0af17257ca206038b47f82ffae83b99d60842734f",
      "title": "Pork meat with bones retail price (PSA) — Parquet",
      "description": "Monthly national average for fresh pork sold bone-in. The cheapest of the four, and the one most households actually put in the basket. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-meat-with-bones.json",
      "path": "https://baboyph.com/data/pork-retail-psa-meat-with-bones.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 46889,
      "hash": "sha256:b6b25b1dcd36eeb272f79df6872f7d6ce85c548e93de467573d658c3be71eb2d",
      "title": "Pork meat with bones retail price (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-retail-psa-pata-fore",
      "path": "https://baboyph.com/data/pork-retail-psa-pata-fore.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 38525,
      "hash": "sha256:af1555737918dbffac07207d2b1a9ddb7a5f2ab40d4ea23cb1f915b58601fb5e",
      "title": "Pork pata (fore) retail price (PSA)",
      "description": "Monthly national average for fresh front pata. Worth keeping because it tracks the other cuts least closely, which makes it a check on whether a swing is the whole market or just one cut. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-pata-fore.full",
      "path": "https://baboyph.com/data/full/pork-retail-psa-pata-fore.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40417,
      "hash": "sha256:d3a27e4ddf5b01eeed0c45e7f8c5f1f566f101c7bda01b345422113b2d75dd5b",
      "title": "Pork pata (fore) retail price (PSA) — including withdrawn rows",
      "description": "Monthly national average for fresh front pata. Worth keeping because it tracks the other cuts least closely, which makes it a check on whether a swing is the whole market or just one cut. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-retail-psa-pata-fore.parquet",
      "path": "https://baboyph.com/data/pork-retail-psa-pata-fore.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3807,
      "hash": "sha256:1fcdf4d9577cc71938f0ed3fc2ef645d650cca5136b706238e0869a478cfba90",
      "title": "Pork pata (fore) retail price (PSA) — Parquet",
      "description": "Monthly national average for fresh front pata. Worth keeping because it tracks the other cuts least closely, which makes it a check on whether a swing is the whole market or just one cut. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-psa-pata-fore.json",
      "path": "https://baboyph.com/data/pork-retail-psa-pata-fore.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 46451,
      "hash": "sha256:443f6039e16c3017c939c6b0d738b29835b7352779d867a9c658c636beb26188",
      "title": "Pork pata (fore) retail price (PSA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-wholesale-sabit-ulo",
      "path": "https://baboyph.com/data/pork-wholesale-sabit-ulo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 39136,
      "hash": "sha256:d36f357175a7b286c5f710447a6e90d481b5d70f21f9397b08c9103b1064eea4",
      "title": "Wholesale hog price, sabit ulo (BAI)",
      "description": "BAI's weekly wholesale price for sabit ulo, read out of the price monitoring PDF one dated report at a time. A wholesale price, several market levels above the farmgate price a raiser is paid — never the same line. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-wholesale-sabit-ulo.full",
      "path": "https://baboyph.com/data/full/pork-wholesale-sabit-ulo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41118,
      "hash": "sha256:67883667e8376d500683e100aed4d6476c3161b5a45fd19a1eb743b7d4f530cf",
      "title": "Wholesale hog price, sabit ulo (BAI) — including withdrawn rows",
      "description": "BAI's weekly wholesale price for sabit ulo, read out of the price monitoring PDF one dated report at a time. A wholesale price, several market levels above the farmgate price a raiser is paid — never the same line. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-wholesale-sabit-ulo.parquet",
      "path": "https://baboyph.com/data/pork-wholesale-sabit-ulo.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5067,
      "hash": "sha256:3992fe18b1ce77c4c6d5a32c999c65597ceb7d1da6a20dbfff0ddcb45061d27c",
      "title": "Wholesale hog price, sabit ulo (BAI) — Parquet",
      "description": "BAI's weekly wholesale price for sabit ulo, read out of the price monitoring PDF one dated report at a time. A wholesale price, several market levels above the farmgate price a raiser is paid — never the same line. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-wholesale-sabit-ulo.json",
      "path": "https://baboyph.com/data/pork-wholesale-sabit-ulo.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50254,
      "hash": "sha256:96ece514fe18eec2eb5b045e20310ed76cd1c4f5ff19f73ad8c636a6dcf83f25",
      "title": "Wholesale hog price, sabit ulo (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-retail-liempo",
      "path": "https://baboyph.com/data/pork-retail-liempo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 38122,
      "hash": "sha256:a895d4410c601923755fa6507c8fca0b9e11884c7790a72f0160caed827d4d13",
      "title": "Retail pork liempo price (BAI)",
      "description": "What liempo costs at retail, weekly, from BAI's price monitoring. This is the number that shows up in the news when pork prices are a story, and it is roughly twice what the farmgate series beside it says a raiser was paid the same week. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-liempo.full",
      "path": "https://baboyph.com/data/full/pork-retail-liempo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40104,
      "hash": "sha256:270b9729c23f32b30e949bc1a033cc3bdec54f3768887fd8b85ccbfbb01f0f52",
      "title": "Retail pork liempo price (BAI) — including withdrawn rows",
      "description": "What liempo costs at retail, weekly, from BAI's price monitoring. This is the number that shows up in the news when pork prices are a story, and it is roughly twice what the farmgate series beside it says a raiser was paid the same week. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-retail-liempo.parquet",
      "path": "https://baboyph.com/data/pork-retail-liempo.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5627,
      "hash": "sha256:d9781b9272c0f11754379fa7d5ba13715b29408b5db0607df60df24f23eab294",
      "title": "Retail pork liempo price (BAI) — Parquet",
      "description": "What liempo costs at retail, weekly, from BAI's price monitoring. This is the number that shows up in the news when pork prices are a story, and it is roughly twice what the farmgate series beside it says a raiser was paid the same week. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-liempo.json",
      "path": "https://baboyph.com/data/pork-retail-liempo.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 51283,
      "hash": "sha256:faf445568fe58c1295e9b11b06944cbfefe3097207ae3a795e093c900f804b14",
      "title": "Retail pork liempo price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-retail-kasim",
      "path": "https://baboyph.com/data/pork-retail-kasim.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 38769,
      "hash": "sha256:20e193851aad6d87001d17831100403a780e26b30d39d0beabf26d8beb41d4b9",
      "title": "Retail pork kasim price (BAI)",
      "description": "What kasim costs at retail, weekly, from BAI's price monitoring. Cheaper than liempo every week of the archive, and the cut most households actually buy. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-kasim.full",
      "path": "https://baboyph.com/data/full/pork-retail-kasim.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40751,
      "hash": "sha256:e1f825c5dbbfb05e8f583c644797d33e71a044eb437f47b8d83dc29ce9a744b7",
      "title": "Retail pork kasim price (BAI) — including withdrawn rows",
      "description": "What kasim costs at retail, weekly, from BAI's price monitoring. Cheaper than liempo every week of the archive, and the cut most households actually buy. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-retail-kasim.parquet",
      "path": "https://baboyph.com/data/pork-retail-kasim.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5692,
      "hash": "sha256:c90ea95a017e08ea42b3b7cf737810ad54369dc3390c0cb3ec7159f893be2a0e",
      "title": "Retail pork kasim price (BAI) — Parquet",
      "description": "What kasim costs at retail, weekly, from BAI's price monitoring. Cheaper than liempo every week of the archive, and the cut most households actually buy. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-retail-kasim.json",
      "path": "https://baboyph.com/data/pork-retail-kasim.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 52308,
      "hash": "sha256:211f892c815cefd261430b82663dc4fd3b4704937c054a81e32eff59d2bb521b",
      "title": "Retail pork kasim price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-frozen-liempo",
      "path": "https://baboyph.com/data/pork-frozen-liempo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41605,
      "hash": "sha256:792bc2d25228fb04ea147e66b3c78b199f805a19fda73880b408cbc4b353aee5",
      "title": "Retail frozen liempo price (BAI)",
      "description": "BAI's weekly price for frozen liempo, which it prices in its own table beside the fresh cut. A different product at a different price, not a second opinion on the same one. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-frozen-liempo.full",
      "path": "https://baboyph.com/data/full/pork-frozen-liempo.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 43587,
      "hash": "sha256:1504af6d471056ae5dc7096d346e0824e5e676e63bf7eb809ea865e6057251b7",
      "title": "Retail frozen liempo price (BAI) — including withdrawn rows",
      "description": "BAI's weekly price for frozen liempo, which it prices in its own table beside the fresh cut. A different product at a different price, not a second opinion on the same one. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-frozen-liempo.parquet",
      "path": "https://baboyph.com/data/pork-frozen-liempo.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5901,
      "hash": "sha256:4e8978e85e383434ccd70036a038d5ad8d2293261351806bf3c5d80fe319fbb1",
      "title": "Retail frozen liempo price (BAI) — Parquet",
      "description": "BAI's weekly price for frozen liempo, which it prices in its own table beside the fresh cut. A different product at a different price, not a second opinion on the same one. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-frozen-liempo.json",
      "path": "https://baboyph.com/data/pork-frozen-liempo.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 55245,
      "hash": "sha256:45720cdf109bf723be9e2e4a001ac938e3de0f38345b02d6d6be1be61cf3e031",
      "title": "Retail frozen liempo price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "pork-frozen-kasim",
      "path": "https://baboyph.com/data/pork-frozen-kasim.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41209,
      "hash": "sha256:5818856c40cca7364a874f278409409139821751cdfd0230572c460be9d50008",
      "title": "Retail frozen kasim price (BAI)",
      "description": "BAI's weekly price for frozen kasim. The cheapest pork in the report most weeks, and the one imports compete on. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-frozen-kasim.full",
      "path": "https://baboyph.com/data/full/pork-frozen-kasim.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 43191,
      "hash": "sha256:0cf40da62a945756ffccb49f2951134a2199d7c0479986ef68e1a2ea4026b913",
      "title": "Retail frozen kasim price (BAI) — including withdrawn rows",
      "description": "BAI's weekly price for frozen kasim. The cheapest pork in the report most weeks, and the one imports compete on. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "pork-frozen-kasim.parquet",
      "path": "https://baboyph.com/data/pork-frozen-kasim.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5673,
      "hash": "sha256:55d6f4e4c27fd3239d508a2577a4fb98d5a7239bd917e0c74c427afeba5db798",
      "title": "Retail frozen kasim price (BAI) — Parquet",
      "description": "BAI's weekly price for frozen kasim. The cheapest pork in the report most weeks, and the one imports compete on. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "pork-frozen-kasim.json",
      "path": "https://baboyph.com/data/pork-frozen-kasim.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 55212,
      "hash": "sha256:6def74ebf82ceb0267afa129208f07e8e0daede6690d0fb94d4ca42557ec5364",
      "title": "Retail frozen kasim price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-bai-backyard",
      "path": "https://baboyph.com/data/hog-farmgate-bai-backyard.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 54378,
      "hash": "sha256:dd618f0dc4fa7128e9de690de1eddd9b081122204582add532cb807b3e01665c",
      "title": "Hog farmgate price, backyard (BAI weekly)",
      "description": "BAI's own weekly farmgate price for backyard hogs — a second agency measuring what PSA measures, at four times the cadence. BAI stopped printing a figure in this column after 22 July 2024 and has printed N/A every week since; the dated blanks are kept, because when a source went quiet is itself a fact. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-bai-backyard.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-bai-backyard.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 56360,
      "hash": "sha256:58f39c726696ea4cee91643c539cba1064d4ecde89203a1d24b3fe7c979b443a",
      "title": "Hog farmgate price, backyard (BAI weekly) — including withdrawn rows",
      "description": "BAI's own weekly farmgate price for backyard hogs — a second agency measuring what PSA measures, at four times the cadence. BAI stopped printing a figure in this column after 22 July 2024 and has printed N/A every week since; the dated blanks are kept, because when a source went quiet is itself a fact. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-bai-backyard.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-bai-backyard.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5946,
      "hash": "sha256:38db270f6998712c8ced87d403c6070d56e1d7c20f125c0a9fa72264cb3364ad",
      "title": "Hog farmgate price, backyard (BAI weekly) — Parquet",
      "description": "BAI's own weekly farmgate price for backyard hogs — a second agency measuring what PSA measures, at four times the cadence. BAI stopped printing a figure in this column after 22 July 2024 and has printed N/A every week since; the dated blanks are kept, because when a source went quiet is itself a fact. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-bai-backyard.json",
      "path": "https://baboyph.com/data/hog-farmgate-bai-backyard.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 66311,
      "hash": "sha256:a80e37abd3aa8a7050f92991d10754824ef1c1324749cf159b7dccf9010d39ee",
      "title": "Hog farmgate price, backyard (BAI weekly) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-bai-commercial",
      "path": "https://baboyph.com/data/hog-farmgate-bai-commercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 49810,
      "hash": "sha256:d2f21ffa93dd4094af45dc1b63d75d8fabdaa4a15266c2b71358577f5d8b7606",
      "title": "Hog farmgate price, commercial (BAI weekly)",
      "description": "BAI's own weekly farmgate price for commercial hogs. It ran thirteen months longer than the backyard column beside it and stopped the same way, after 25 August 2025. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-bai-commercial.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-bai-commercial.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 51792,
      "hash": "sha256:4af14309337e9f252ca38a8f2e01b01cc644addc4817d322ba327c18ea0fd8a0",
      "title": "Hog farmgate price, commercial (BAI weekly) — including withdrawn rows",
      "description": "BAI's own weekly farmgate price for commercial hogs. It ran thirteen months longer than the backyard column beside it and stopped the same way, after 25 August 2025. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-bai-commercial.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-bai-commercial.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5631,
      "hash": "sha256:6982013ca9b575f17e79ab68e33c5a6a3130a726e9d69c2ca53deb2317a0b3aa",
      "title": "Hog farmgate price, commercial (BAI weekly) — Parquet",
      "description": "BAI's own weekly farmgate price for commercial hogs. It ran thirteen months longer than the backyard column beside it and stopped the same way, after 25 August 2025. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-bai-commercial.json",
      "path": "https://baboyph.com/data/hog-farmgate-bai-commercial.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 60725,
      "hash": "sha256:d5ba0774d86854d391a074fb97281b6e64cea62eaec1f1a98b2d61e331ed6b15",
      "title": "Hog farmgate price, commercial (BAI weekly) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-average-quarterly",
      "path": "https://baboyph.com/data/hog-farmgate-average-quarterly.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 2787,
      "hash": "sha256:944341eb607c5aa05e5d9c11143b3c785d66335100779064645f77a7ef335786",
      "title": "Hog farmgate price, all farms — quarterly mean",
      "description": "The quarterly mean of PSA's all-farms monthly rows, computed from this archive with the arithmetic attached to every row. A quarter missing a month has no mean and says which month is missing. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-average-quarterly.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-average-quarterly.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 2933,
      "hash": "sha256:e05ed3aa88df06dd2bf8beeabd5f9bacea9f0000e6217383591f70af0c2d6689",
      "title": "Hog farmgate price, all farms — quarterly mean — including withdrawn rows",
      "description": "The quarterly mean of PSA's all-farms monthly rows, computed from this archive with the arithmetic attached to every row. A quarter missing a month has no mean and says which month is missing. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-average-quarterly.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-average-quarterly.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2553,
      "hash": "sha256:8fc25888eb0176a2f66561280535387a22e5c7b8c0bd41b7b277f0948e474c57",
      "title": "Hog farmgate price, all farms — quarterly mean — Parquet",
      "description": "The quarterly mean of PSA's all-farms monthly rows, computed from this archive with the arithmetic attached to every row. A quarter missing a month has no mean and says which month is missing. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-average-quarterly.json",
      "path": "https://baboyph.com/data/hog-farmgate-average-quarterly.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 3369,
      "hash": "sha256:8ebba95362a7f7182f2e5e762da11919951f43969f781e877e71177a3df1caec",
      "title": "Hog farmgate price, all farms — quarterly mean — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-household-quarterly",
      "path": "https://baboyph.com/data/hog-farmgate-household-quarterly.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 29959,
      "hash": "sha256:6fe97007b9877a9728bab932d543353f1ba98a5cc8f8956251606f6131029780",
      "title": "Hog farmgate price, backyard — quarterly mean",
      "description": "The quarterly mean of PSA's backyard monthly rows. This is the shape the headline figure is quoted in, and computing it here rather than by hand is what makes a stale headline something a gate can notice. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-household-quarterly.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-household-quarterly.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 31185,
      "hash": "sha256:bc32765b8b13f7495e15d2f69d9db9edb146392f7412aa3dc492b6546ff1c6fc",
      "title": "Hog farmgate price, backyard — quarterly mean — including withdrawn rows",
      "description": "The quarterly mean of PSA's backyard monthly rows. This is the shape the headline figure is quoted in, and computing it here rather than by hand is what makes a stale headline something a gate can notice. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-household-quarterly.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-household-quarterly.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4735,
      "hash": "sha256:3d23c996ff353edbcfd7236584a109aa6f165646c166780af33e2d3d9aa7db9a",
      "title": "Hog farmgate price, backyard — quarterly mean — Parquet",
      "description": "The quarterly mean of PSA's backyard monthly rows. This is the shape the headline figure is quoted in, and computing it here rather than by hand is what makes a stale headline something a gate can notice. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-household-quarterly.json",
      "path": "https://baboyph.com/data/hog-farmgate-household-quarterly.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 29734,
      "hash": "sha256:521bb6eeba01fadcabc6e8a0fb3a7f049b1d7ff62473db6111376d77405d324b",
      "title": "Hog farmgate price, backyard — quarterly mean — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "hog-farmgate-establishment-quarterly",
      "path": "https://baboyph.com/data/hog-farmgate-establishment-quarterly.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 33116,
      "hash": "sha256:2b5812da3ce42eac64e2718dda824c1489bbdc918df7a6a845a93156a70a06d3",
      "title": "Hog farmgate price, commercial — quarterly mean",
      "description": "The quarterly mean of PSA's commercial monthly rows. Sixteen quarters between 2010 and 2013 have no mean at all, because PSA published nothing for those months and the average of the months it did publish is a different quantity. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment-quarterly.full",
      "path": "https://baboyph.com/data/full/hog-farmgate-establishment-quarterly.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 34342,
      "hash": "sha256:246355b535ed985c27ad8b51b359cb44eb1551c0d3d107fabfdf5ae08bbd9154",
      "title": "Hog farmgate price, commercial — quarterly mean — including withdrawn rows",
      "description": "The quarterly mean of PSA's commercial monthly rows. Sixteen quarters between 2010 and 2013 have no mean at all, because PSA published nothing for those months and the average of the months it did publish is a different quantity. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment-quarterly.parquet",
      "path": "https://baboyph.com/data/hog-farmgate-establishment-quarterly.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4906,
      "hash": "sha256:df85e87ebc4579727027bd0973190e1f1c62596cb0dadfa987f1ad313b6771d1",
      "title": "Hog farmgate price, commercial — quarterly mean — Parquet",
      "description": "The quarterly mean of PSA's commercial monthly rows. Sixteen quarters between 2010 and 2013 have no mean at all, because PSA published nothing for those months and the average of the months it did publish is a different quantity. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "hog-farmgate-establishment-quarterly.json",
      "path": "https://baboyph.com/data/hog-farmgate-establishment-quarterly.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 32054,
      "hash": "sha256:dc76fb32446a8c1cce865e17bce24596ef5e522c77209e75342082f8619de88f",
      "title": "Hog farmgate price, commercial — quarterly mean — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "backyard-commercial-spread",
      "path": "https://baboyph.com/data/backyard-commercial-spread.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 86783,
      "hash": "sha256:b8469f6cd7ab06f4f875e60b264078f0685b33fd5ab584d368438e1b51413198",
      "title": "Backyard-to-commercial price gap",
      "description": "Backyard farmgate minus commercial farmgate, monthly, computed from two PSA populations that neither agency subtracts from each other. A difference between two sources is a real artifact; an average of them would be a price nobody surveyed. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "backyard-commercial-spread.full",
      "path": "https://baboyph.com/data/full/backyard-commercial-spread.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 90403,
      "hash": "sha256:498833a49edec30a69e871794932e5560d7e450142d7e5ee5f31eb21ee5f3ce7",
      "title": "Backyard-to-commercial price gap — including withdrawn rows",
      "description": "Backyard farmgate minus commercial farmgate, monthly, computed from two PSA populations that neither agency subtracts from each other. A difference between two sources is a real artifact; an average of them would be a price nobody surveyed. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "backyard-commercial-spread.parquet",
      "path": "https://baboyph.com/data/backyard-commercial-spread.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 7344,
      "hash": "sha256:6f5fd2b5f46ced6d1e5429bb2d759c246fd2cd06265c99fcfc930f5b790930ac",
      "title": "Backyard-to-commercial price gap — Parquet",
      "description": "Backyard farmgate minus commercial farmgate, monthly, computed from two PSA populations that neither agency subtracts from each other. A difference between two sources is a real artifact; an average of them would be a price nobody surveyed. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "backyard-commercial-spread.json",
      "path": "https://baboyph.com/data/backyard-commercial-spread.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 88179,
      "hash": "sha256:a52889e35b1bc9e7fd005c364e0d1315d048f2d3f7118d422590c988500b8b16",
      "title": "Backyard-to-commercial price gap — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-corn-yellow",
      "path": "https://baboyph.com/data/feed-ingredient-corn-yellow.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40040,
      "hash": "sha256:e13922d1cfbdda8f62a909fb88c23bf3d95e159dd6e68e6d9f45c8a8b86e3e30",
      "title": "Yellow corn wholesale price (BAI)",
      "description": "The single biggest line in a hog ration and the one that moves a sack price fastest. Weekly since January 2023, and the only official Philippine corn price published more often than monthly. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-corn-yellow.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-corn-yellow.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 42040,
      "hash": "sha256:99edb3e2ff7a4cdeca7383debc2d72f5281bbc35ec2b4e63cb212b25adcf1468",
      "title": "Yellow corn wholesale price (BAI) — including withdrawn rows",
      "description": "The single biggest line in a hog ration and the one that moves a sack price fastest. Weekly since January 2023, and the only official Philippine corn price published more often than monthly. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-corn-yellow.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-corn-yellow.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4512,
      "hash": "sha256:18e3c9bc785f5b8c54be870255733a7e3a4d2b47c486d2ebb9f1e3b5f0ccf52b",
      "title": "Yellow corn wholesale price (BAI) — Parquet",
      "description": "The single biggest line in a hog ration and the one that moves a sack price fastest. Weekly since January 2023, and the only official Philippine corn price published more often than monthly. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-corn-yellow.json",
      "path": "https://baboyph.com/data/feed-ingredient-corn-yellow.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50246,
      "hash": "sha256:31f173279968a99ab1a3589436832cf6f46f90aa603e0ee7a65d82e4ce6add25",
      "title": "Yellow corn wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-sbm-argentina",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-argentina.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 51086,
      "hash": "sha256:00569177a9b243c94e94ac25b8f44d259899d4188d0b0ae2941baf79d981ca78",
      "title": "Soybean meal (Argentina) wholesale price (BAI)",
      "description": "Argentine soybean meal, the cheaper of the two imported protein sources BAI tracked. BAI stopped printing this column after 2025-10-20 and has printed N/A every week since. The readings and the dated nulls that follow them are both kept, so the week it went quiet is itself citable. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-argentina.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-sbm-argentina.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 53086,
      "hash": "sha256:2e038d5701a28008595143d10186e6234d386d2a8d149142a30eba019e49c883",
      "title": "Soybean meal (Argentina) wholesale price (BAI) — including withdrawn rows",
      "description": "Argentine soybean meal, the cheaper of the two imported protein sources BAI tracked. BAI stopped printing this column after 2025-10-20 and has printed N/A every week since. The readings and the dated nulls that follow them are both kept, so the week it went quiet is itself citable. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-argentina.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-argentina.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5224,
      "hash": "sha256:17ec375e457400c41ecf0dd174b873c9a5c285a339583f0727334530fdb8e49d",
      "title": "Soybean meal (Argentina) wholesale price (BAI) — Parquet",
      "description": "Argentine soybean meal, the cheaper of the two imported protein sources BAI tracked. BAI stopped printing this column after 2025-10-20 and has printed N/A every week since. The readings and the dated nulls that follow them are both kept, so the week it went quiet is itself citable. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-argentina.json",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-argentina.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 61352,
      "hash": "sha256:962df9c050f5c25fd0077ecca624a736d1ecf68ef833419eb5e66258be03ad5a",
      "title": "Soybean meal (Argentina) wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-sbm-fullfat",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-fullfat.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41390,
      "hash": "sha256:e2323db9ac2451a6693eda06c6dab1ae719ab203fbaa8d36a98637891488350f",
      "title": "Soybean meal (full fat) wholesale price (BAI)",
      "description": "Full-fat soya, which carries its own oil and so prices well above the extracted meals beside it. Weekly and unbroken since January 2023. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-fullfat.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-sbm-fullfat.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 43390,
      "hash": "sha256:464efe60fd72bbc85c791ca77bf51030cfde2cbc41a4dc0509fa853b07833c16",
      "title": "Soybean meal (full fat) wholesale price (BAI) — including withdrawn rows",
      "description": "Full-fat soya, which carries its own oil and so prices well above the extracted meals beside it. Weekly and unbroken since January 2023. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-fullfat.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-fullfat.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4458,
      "hash": "sha256:b00b239cca7579cceb7a660449fd46d6567b822dc01e1f4a306ba4fbcd75c0b3",
      "title": "Soybean meal (full fat) wholesale price (BAI) — Parquet",
      "description": "Full-fat soya, which carries its own oil and so prices well above the extracted meals beside it. Weekly and unbroken since January 2023. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-fullfat.json",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-fullfat.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 51620,
      "hash": "sha256:994873db4166f3eda7ec35220b2552c1c22de2f0302eb521f354839c9f82f96c",
      "title": "Soybean meal (full fat) wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-sbm-us",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-us.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 39072,
      "hash": "sha256:a1573c6112a6a70c260f8a71588259949b08ee76ebd18c902a9500ca09f7236f",
      "title": "Soybean meal (US) wholesale price (BAI)",
      "description": "US soybean meal, the protein benchmark most Philippine formulations are actually costed against. The one to watch beside yellow corn: between them they are most of the cost of a grower ration. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-us.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-sbm-us.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41072,
      "hash": "sha256:d7fff4173b702608d19598e82ad365f1f53d66b1b3f3cca3f6b115cd6f28f3dc",
      "title": "Soybean meal (US) wholesale price (BAI) — including withdrawn rows",
      "description": "US soybean meal, the protein benchmark most Philippine formulations are actually costed against. The one to watch beside yellow corn: between them they are most of the cost of a grower ration. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-us.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-us.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4563,
      "hash": "sha256:804229d98590c8b942ea680f8ca6cc5b8e98320bfdf6073f5f83086d8e4e30c5",
      "title": "Soybean meal (US) wholesale price (BAI) — Parquet",
      "description": "US soybean meal, the protein benchmark most Philippine formulations are actually costed against. The one to watch beside yellow corn: between them they are most of the cost of a grower ration. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-sbm-us.json",
      "path": "https://baboyph.com/data/feed-ingredient-sbm-us.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50905,
      "hash": "sha256:7711a626edf11f2e98aeb54e0c4485d58072ad09575720729604cdebaed76b83",
      "title": "Soybean meal (US) wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-feedwheat",
      "path": "https://baboyph.com/data/feed-ingredient-feedwheat.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 39166,
      "hash": "sha256:88ec64feb67e7462ad8a1f79566c4c555350e9c3477a2b21897baba998f06400",
      "title": "Feedwheat wholesale price (BAI)",
      "description": "Feed-grade wheat, the usual partial substitute when corn runs dear. Weekly and unbroken since January 2023, which makes the corn-to-wheat spread computable for every week of the series. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-feedwheat.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-feedwheat.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41166,
      "hash": "sha256:c3bbc281c9400e27ea2efb552214d48af59f44f881573d4b82264bc38c319454",
      "title": "Feedwheat wholesale price (BAI) — including withdrawn rows",
      "description": "Feed-grade wheat, the usual partial substitute when corn runs dear. Weekly and unbroken since January 2023, which makes the corn-to-wheat spread computable for every week of the series. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-feedwheat.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-feedwheat.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4495,
      "hash": "sha256:9659c0abfd389b6488058ab9c49d2eab483d68bfa7ef6daf35716fb31bd1da1f",
      "title": "Feedwheat wholesale price (BAI) — Parquet",
      "description": "Feed-grade wheat, the usual partial substitute when corn runs dear. Weekly and unbroken since January 2023, which makes the corn-to-wheat spread computable for every week of the series. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-feedwheat.json",
      "path": "https://baboyph.com/data/feed-ingredient-feedwheat.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50014,
      "hash": "sha256:659fe414ba000decdd4ba45288e24d20737ab89e6b48f0584dd028a9ec154bbb",
      "title": "Feedwheat wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-feedwheat-others",
      "path": "https://baboyph.com/data/feed-ingredient-feedwheat-others.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 58998,
      "hash": "sha256:e97e5f3af64c6ffc5107eef1c1ab3815382d45a689f0b05669cbfd04e2dd0106",
      "title": "Feedwheat (other origins) wholesale price (BAI)",
      "description": "A second feedwheat line BAI printed for other origins. It stopped after 2024-08-12 — the first of the three ingredient columns to go quiet, and the longest dead. Its readings stand, followed by dated nulls carrying the report id that printed each blank. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-feedwheat-others.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-feedwheat-others.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 60998,
      "hash": "sha256:c32f04e795fb4560907b5b3f41eb434611b492936975ec019b6363e11806ed5e",
      "title": "Feedwheat (other origins) wholesale price (BAI) — including withdrawn rows",
      "description": "A second feedwheat line BAI printed for other origins. It stopped after 2024-08-12 — the first of the three ingredient columns to go quiet, and the longest dead. Its readings stand, followed by dated nulls carrying the report id that printed each blank. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-feedwheat-others.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-feedwheat-others.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5601,
      "hash": "sha256:e4d213788234f8bce87f637cdfdd4f4a7aa0948d654e30ad1f37f92d77ca6b17",
      "title": "Feedwheat (other origins) wholesale price (BAI) — Parquet",
      "description": "A second feedwheat line BAI printed for other origins. It stopped after 2024-08-12 — the first of the three ingredient columns to go quiet, and the longest dead. Its readings stand, followed by dated nulls carrying the report id that printed each blank. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-feedwheat-others.json",
      "path": "https://baboyph.com/data/feed-ingredient-feedwheat-others.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 68797,
      "hash": "sha256:fa8001404b504de2484a2f2952364b7b6007ca247a5e8bb4c83add431dd3f9c5",
      "title": "Feedwheat (other origins) wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-local-fishmeal",
      "path": "https://baboyph.com/data/feed-ingredient-local-fishmeal.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 51219,
      "hash": "sha256:53b9ca19d1afdf4c830212d9b3e6c432c74f16f955ba7a039cc5f108fcbc53e8",
      "title": "Local fishmeal wholesale price (BAI)",
      "description": "Domestically produced fishmeal, the dearest protein in the table. It is also the only series in this archive whose source contradicts itself: on thirteen weeks BAI printed two different This Week prices for it inside one document, and every one of those weeks is a dated null naming each figure and the column that carried it. It stopped after 2026-05-18. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-local-fishmeal.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-local-fishmeal.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 53219,
      "hash": "sha256:c84f86dd00db1e987d4ce068f252c3a9217ca9cb701c2de898bbd696fe79aeb0",
      "title": "Local fishmeal wholesale price (BAI) — including withdrawn rows",
      "description": "Domestically produced fishmeal, the dearest protein in the table. It is also the only series in this archive whose source contradicts itself: on thirteen weeks BAI printed two different This Week prices for it inside one document, and every one of those weeks is a dated null naming each figure and the column that carried it. It stopped after 2026-05-18. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-local-fishmeal.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-local-fishmeal.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5744,
      "hash": "sha256:ba4c00a6a8a4dd3d0e349cdb91e448159f42e46434d6129bd4cbdf890245d1ad",
      "title": "Local fishmeal wholesale price (BAI) — Parquet",
      "description": "Domestically produced fishmeal, the dearest protein in the table. It is also the only series in this archive whose source contradicts itself: on thirteen weeks BAI printed two different This Week prices for it inside one document, and every one of those weeks is a dated null naming each figure and the column that carried it. It stopped after 2026-05-18. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-local-fishmeal.json",
      "path": "https://baboyph.com/data/feed-ingredient-local-fishmeal.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 60882,
      "hash": "sha256:fd563481d8a8acf71cae534e5cf989df922be919d358a5825586ad64770cbb96",
      "title": "Local fishmeal wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-coco-oil",
      "path": "https://baboyph.com/data/feed-ingredient-coco-oil.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 39093,
      "hash": "sha256:0f96a6b719cd3f5f7814007a267df05b61783e2ca0347665d971897ac115eae4",
      "title": "Coconut oil wholesale price (BAI)",
      "description": "Coconut oil as an energy source, and the most volatile line in the table by a wide margin — it has doubled and halved inside the life of this series. A ration that leans on it is exposed to the copra market rather than the grain market. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-coco-oil.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-coco-oil.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41093,
      "hash": "sha256:f25057c9590d524362e01ec6741f3e6f5d675cb15965b7585a22207b729e6f0a",
      "title": "Coconut oil wholesale price (BAI) — including withdrawn rows",
      "description": "Coconut oil as an energy source, and the most volatile line in the table by a wide margin — it has doubled and halved inside the life of this series. A ration that leans on it is exposed to the copra market rather than the grain market. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-coco-oil.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-coco-oil.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4525,
      "hash": "sha256:8e99c9d14f2690f36a9eeef19a0deca78e812fe95306f128b51023e73e561dba",
      "title": "Coconut oil wholesale price (BAI) — Parquet",
      "description": "Coconut oil as an energy source, and the most volatile line in the table by a wide margin — it has doubled and halved inside the life of this series. A ration that leans on it is exposed to the copra market rather than the grain market. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-coco-oil.json",
      "path": "https://baboyph.com/data/feed-ingredient-coco-oil.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50268,
      "hash": "sha256:8b4e68bca2a247d6e8aa3a2c75a80e53a5e26e53c5f2d218831ffd7d2457facf",
      "title": "Coconut oil wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-copra-meal",
      "path": "https://baboyph.com/data/feed-ingredient-copra-meal.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 39583,
      "hash": "sha256:b68330c6043bae9171b8455aa1625c1e8798d4a21a3c5664b0fb06b2077da2e8",
      "title": "Copra meal wholesale price (BAI)",
      "description": "The cheapest protein source BAI tracks and the one most Philippine backyard rations actually use, because it is local. Weekly and unbroken since January 2023. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-copra-meal.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-copra-meal.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41583,
      "hash": "sha256:7d0d387a9816c1baaff95fef6d76c1e3ceec7db84a7ed25748ade0aec2f71ce7",
      "title": "Copra meal wholesale price (BAI) — including withdrawn rows",
      "description": "The cheapest protein source BAI tracks and the one most Philippine backyard rations actually use, because it is local. Weekly and unbroken since January 2023. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-copra-meal.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-copra-meal.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4533,
      "hash": "sha256:e6d04532da933a347f4a0e9c5d7ea027a4a398e91bd4adf3720485864fab1a6c",
      "title": "Copra meal wholesale price (BAI) — Parquet",
      "description": "The cheapest protein source BAI tracks and the one most Philippine backyard rations actually use, because it is local. Weekly and unbroken since January 2023. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-copra-meal.json",
      "path": "https://baboyph.com/data/feed-ingredient-copra-meal.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50110,
      "hash": "sha256:01394616c42a538a08f5e0aa193f03239df9185608e993dc9a481fdf41b187ab",
      "title": "Copra meal wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-crude-palm-oil",
      "path": "https://baboyph.com/data/feed-ingredient-crude-palm-oil.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 48351,
      "hash": "sha256:fe83e7e538fac730ba226241ea8601bb8dd4973c2d2119418939bc72feb1ad52",
      "title": "Crude palm oil wholesale price (BAI)",
      "description": "Crude palm oil as a ration energy source. READ THE NULLS BEFORE THE FIGURES: BAI printed no price in this column between 2024-11-04 and 2026-01-05, then resumed. A staleness warning on this series has fired before and is not evidence of a parser fault. Two further weeks were printed as a zero peso price, which is a blank rendered as a number and is recorded as no figure. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-crude-palm-oil.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-crude-palm-oil.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 50351,
      "hash": "sha256:5f31476905c35342140ea8e082f01976dd7de23ed548be17878521f6d6541797",
      "title": "Crude palm oil wholesale price (BAI) — including withdrawn rows",
      "description": "Crude palm oil as a ration energy source. READ THE NULLS BEFORE THE FIGURES: BAI printed no price in this column between 2024-11-04 and 2026-01-05, then resumed. A staleness warning on this series has fired before and is not evidence of a parser fault. Two further weeks were printed as a zero peso price, which is a blank rendered as a number and is recorded as no figure. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-crude-palm-oil.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-crude-palm-oil.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 5360,
      "hash": "sha256:64667721a67d356fe8a9c20ecb0676f67c24f10205415ae315b5e36dd5517e59",
      "title": "Crude palm oil wholesale price (BAI) — Parquet",
      "description": "Crude palm oil as a ration energy source. READ THE NULLS BEFORE THE FIGURES: BAI printed no price in this column between 2024-11-04 and 2026-01-05, then resumed. A staleness warning on this series has fired before and is not evidence of a parser fault. Two further weeks were printed as a zero peso price, which is a blank rendered as a number and is recorded as no figure. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-crude-palm-oil.json",
      "path": "https://baboyph.com/data/feed-ingredient-crude-palm-oil.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 58114,
      "hash": "sha256:dd0ffe3aad3e93afa9b1efbd015ee41247e3a7659578637e605cfa0aaced5756",
      "title": "Crude palm oil wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-ddgs",
      "path": "https://baboyph.com/data/feed-ingredient-ddgs.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 36958,
      "hash": "sha256:45f68426407ce97d21195dc92b83eb50d8270ab6dc68ec5000be92715609c5b1",
      "title": "DDGS wholesale price (BAI)",
      "description": "Distillers dried grains with solubles, the ethanol by-product used as a mid-protein energy filler. Weekly and unbroken since January 2023. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-ddgs.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-ddgs.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 38958,
      "hash": "sha256:dcd9ab31410df05189ec7769e36a43ac1cb5d56f9b03221debc676aa26b868f1",
      "title": "DDGS wholesale price (BAI) — including withdrawn rows",
      "description": "Distillers dried grains with solubles, the ethanol by-product used as a mid-protein energy filler. Weekly and unbroken since January 2023. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-ddgs.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-ddgs.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4435,
      "hash": "sha256:032f294777528fafc4d7a00d32d13b336fe85e80dbebedc702f23a78c12a2605",
      "title": "DDGS wholesale price (BAI) — Parquet",
      "description": "Distillers dried grains with solubles, the ethanol by-product used as a mid-protein energy filler. Weekly and unbroken since January 2023. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-ddgs.json",
      "path": "https://baboyph.com/data/feed-ingredient-ddgs.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 49411,
      "hash": "sha256:ad9c8fe2c3bb1f15f04292f0fd0b5cf654b58c2b17d57096dce60dc372073099",
      "title": "DDGS wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-molasses",
      "path": "https://baboyph.com/data/feed-ingredient-molasses.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 38719,
      "hash": "sha256:2e0c8e59e73adff9afabd766bbeb9659db6cb6299016a2907ebcac10599f6bf5",
      "title": "Molasses wholesale price (BAI)",
      "description": "Cane molasses, used for palatability and as a binder rather than as a major energy contributor. Weekly and unbroken since January 2023, and the steadiest line in the table. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-molasses.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-molasses.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40719,
      "hash": "sha256:160997412368ed907d3ac99541cf8f0a697140c03ffed014d59a0a4f2f81955c",
      "title": "Molasses wholesale price (BAI) — including withdrawn rows",
      "description": "Cane molasses, used for palatability and as a binder rather than as a major energy contributor. Weekly and unbroken since January 2023, and the steadiest line in the table. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-molasses.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-molasses.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4430,
      "hash": "sha256:4e60169fadf33b336858dab67173f3d305cc728af1b5d4b7ed3746db68846143",
      "title": "Molasses wholesale price (BAI) — Parquet",
      "description": "Cane molasses, used for palatability and as a binder rather than as a major energy contributor. Weekly and unbroken since January 2023, and the steadiest line in the table. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-molasses.json",
      "path": "https://baboyph.com/data/feed-ingredient-molasses.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 49888,
      "hash": "sha256:fb7988866dd051bac9c2f12d96a21f62e593da23df76715830498c1e6697f8a1",
      "title": "Molasses wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-palm-olein",
      "path": "https://baboyph.com/data/feed-ingredient-palm-olein.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 39562,
      "hash": "sha256:be74db371f391255d81afdfa57897229b1b136e98134fa914362ddf4256f6727",
      "title": "Palm olein wholesale price (BAI)",
      "description": "The refined fraction of palm oil, priced above the crude line beside it. Weekly and unbroken since January 2023 — which is what makes the crude-versus-refined spread readable even across the fourteen months the crude column was blank. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-palm-olein.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-palm-olein.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 41562,
      "hash": "sha256:bce45d7a24d3ccb0c26016ae86ae98492f413e0c1b9e1962db97017a9b35d127",
      "title": "Palm olein wholesale price (BAI) — including withdrawn rows",
      "description": "The refined fraction of palm oil, priced above the crude line beside it. Weekly and unbroken since January 2023 — which is what makes the crude-versus-refined spread readable even across the fourteen months the crude column was blank. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-palm-olein.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-palm-olein.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4464,
      "hash": "sha256:079f788b4367578d4208efaaa6db7f966f8ff32c86994111bdcbc8107bc9cb11",
      "title": "Palm olein wholesale price (BAI) — Parquet",
      "description": "The refined fraction of palm oil, priced above the crude line beside it. Weekly and unbroken since January 2023 — which is what makes the crude-versus-refined spread readable even across the fourteen months the crude column was blank. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-palm-olein.json",
      "path": "https://baboyph.com/data/feed-ingredient-palm-olein.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50089,
      "hash": "sha256:742dbb0425e142bca54a5b28c1683841c7f790f573c3b8af2d85d792af7e3803",
      "title": "Palm olein wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-pollard-hard",
      "path": "https://baboyph.com/data/feed-ingredient-pollard-hard.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40683,
      "hash": "sha256:181c12ed3c7efdcb7e22281a1456b7052d2faa8fa26c1ff15b315bab1a749bb7",
      "title": "Pollard (hard) wholesale price (BAI)",
      "description": "Hard wheat pollard, the mill by-product that competes directly with rice bran for the same place in a backyard ration. Weekly and unbroken since January 2023. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-pollard-hard.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-pollard-hard.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 42683,
      "hash": "sha256:e2613a4242e515e024cedbed6adf4f01b8f12176cb4c6971625419bfbda43074",
      "title": "Pollard (hard) wholesale price (BAI) — including withdrawn rows",
      "description": "Hard wheat pollard, the mill by-product that competes directly with rice bran for the same place in a backyard ration. Weekly and unbroken since January 2023. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-pollard-hard.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-pollard-hard.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4519,
      "hash": "sha256:50bb5fd90e5e5ad585c2aeb8a4206296c19e9c6e55b1bc7068008625ca36a2f0",
      "title": "Pollard (hard) wholesale price (BAI) — Parquet",
      "description": "Hard wheat pollard, the mill by-product that competes directly with rice bran for the same place in a backyard ration. Weekly and unbroken since January 2023. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-pollard-hard.json",
      "path": "https://baboyph.com/data/feed-ingredient-pollard-hard.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50572,
      "hash": "sha256:b49d33dea8d7746e6e7ed7cb77ff6c24abb4531b53f3335820d9f225c7cc1d70",
      "title": "Pollard (hard) wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "feed-ingredient-rice-bran-d1",
      "path": "https://baboyph.com/data/feed-ingredient-rice-bran-d1.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 40704,
      "hash": "sha256:93ffb8c1564d044f27c9bb10302c8fe7a79ac4b7771b0c314f2a7b44b400dc8d",
      "title": "Rice bran D1 wholesale price (BAI)",
      "description": "First-class rice bran, the grade most smallholders buy and the one whose price a raiser is most likely to check personally. The widest range in the table relative to its own level: it has more than doubled from trough to peak. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-rice-bran-d1.full",
      "path": "https://baboyph.com/data/full/feed-ingredient-rice-bran-d1.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 42704,
      "hash": "sha256:be49eabee9ab3319c022bbdb39485200eba5b50429f48d3938b649bb51160556",
      "title": "Rice bran D1 wholesale price (BAI) — including withdrawn rows",
      "description": "First-class rice bran, the grade most smallholders buy and the one whose price a raiser is most likely to check personally. The widest range in the table relative to its own level: it has more than doubled from trough to peak. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "feed-ingredient-rice-bran-d1.parquet",
      "path": "https://baboyph.com/data/feed-ingredient-rice-bran-d1.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 4784,
      "hash": "sha256:cb411c6500b58f076177795ca79b83ea2051e13d4259687a1dbd3ac88fd6f27c",
      "title": "Rice bran D1 wholesale price (BAI) — Parquet",
      "description": "First-class rice bran, the grade most smallholders buy and the one whose price a raiser is most likely to check personally. The widest range in the table relative to its own level: it has more than doubled from trough to peak. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "feed-ingredient-rice-bran-d1.json",
      "path": "https://baboyph.com/data/feed-ingredient-rice-bran-d1.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 50609,
      "hash": "sha256:27d17587aa4e57740a324dd1021f52a8cffbfccb80fc9b95462447a0b2614e2f",
      "title": "Rice bran D1 wholesale price (BAI) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "world-maize",
      "path": "https://baboyph.com/data/world-maize.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 257738,
      "hash": "sha256:10225a8af6632ac33d4d34f47f1a032f1e1d7f06faf8567292ffc1e98c1e1ee2",
      "title": "Maize world reference price (World Bank)",
      "description": "The world price of corn, monthly since 1960, from the World Bank's Pink Sheet. It is the number a Philippine feed miller's import cost is negotiated against, and it moves months before a sack price here does. Nominal US dollars — no inflation adjustment, and no peso conversion. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "world-maize.full",
      "path": "https://baboyph.com/data/full/world-maize.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 272158,
      "hash": "sha256:73a48a410dab6a78c37bbeb83a554a308a98b29c27b4c78301a1b30816901378",
      "title": "Maize world reference price (World Bank) — including withdrawn rows",
      "description": "The world price of corn, monthly since 1960, from the World Bank's Pink Sheet. It is the number a Philippine feed miller's import cost is negotiated against, and it moves months before a sack price here does. Nominal US dollars — no inflation adjustment, and no peso conversion. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "world-maize.parquet",
      "path": "https://baboyph.com/data/world-maize.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 11340,
      "hash": "sha256:dbca190476b573bf6cd2e78342850d30f3b0a3ceb8bad7a78dbc6111cc982523",
      "title": "Maize world reference price (World Bank) — Parquet",
      "description": "The world price of corn, monthly since 1960, from the World Bank's Pink Sheet. It is the number a Philippine feed miller's import cost is negotiated against, and it moves months before a sack price here does. Nominal US dollars — no inflation adjustment, and no peso conversion. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "world-maize.json",
      "path": "https://baboyph.com/data/world-maize.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 354177,
      "hash": "sha256:8b56ac4ff9d66a7bef2b212d26b19f42275bb7237b4de55b46711be667c7bb31",
      "title": "Maize world reference price (World Bank) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "world-soybean-meal",
      "path": "https://baboyph.com/data/world-soybean-meal.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 273269,
      "hash": "sha256:42b53d8e6562a408933086df4878583b1ca4e80e716e883cdfb053fc25a5925e",
      "title": "Soybean meal world reference price (World Bank)",
      "description": "The world price of the protein half of a hog ration, monthly since 1960, from the World Bank's Pink Sheet. BAI's Philippine soybean meal columns are landed prices quoted against this one. Nominal US dollars, not converted to pesos. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "world-soybean-meal.full",
      "path": "https://baboyph.com/data/full/world-soybean-meal.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 287689,
      "hash": "sha256:97f16e4428bb4a6db67c4dd475592ce6771106dea25cb25ae99caf00104173ba",
      "title": "Soybean meal world reference price (World Bank) — including withdrawn rows",
      "description": "The world price of the protein half of a hog ration, monthly since 1960, from the World Bank's Pink Sheet. BAI's Philippine soybean meal columns are landed prices quoted against this one. Nominal US dollars, not converted to pesos. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "world-soybean-meal.parquet",
      "path": "https://baboyph.com/data/world-soybean-meal.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 10564,
      "hash": "sha256:fd7da75c3bf2fa5965bf44c7a9e86f2f9f4bca51cb10041edaadbb6c1eff6cfc",
      "title": "Soybean meal world reference price (World Bank) — Parquet",
      "description": "The world price of the protein half of a hog ration, monthly since 1960, from the World Bank's Pink Sheet. BAI's Philippine soybean meal columns are landed prices quoted against this one. Nominal US dollars, not converted to pesos. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "world-soybean-meal.json",
      "path": "https://baboyph.com/data/world-soybean-meal.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 352964,
      "hash": "sha256:7f68f6c0702f2172401625f255f57f00546666f5f008f0ee5885147a3e81b9cb",
      "title": "Soybean meal world reference price (World Bank) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "usda-swine-meat-production",
      "path": "https://baboyph.com/data/usda-swine-meat-production.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 22648,
      "hash": "sha256:9ffd7ec504c30df2aed16486bf00927535bc69789950376fcb01dda84ba41090",
      "title": "Philippine pork production (USDA)",
      "description": "USDA's estimate of how much pork the Philippines produced, by market year since 1960. It disagrees with PSA's own production series and is published beside it rather than reconciled with it: the two use different methods and this archive does not average disagreeing sources. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-production.full",
      "path": "https://baboyph.com/data/full/usda-swine-meat-production.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 23874,
      "hash": "sha256:62a2e1f4142bc03cb5148dc46be66d060ab22770b3b6802be46329299150a2be",
      "title": "Philippine pork production (USDA) — including withdrawn rows",
      "description": "USDA's estimate of how much pork the Philippines produced, by market year since 1960. It disagrees with PSA's own production series and is published beside it rather than reconciled with it: the two use different methods and this archive does not average disagreeing sources. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "usda-swine-meat-production.parquet",
      "path": "https://baboyph.com/data/usda-swine-meat-production.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2865,
      "hash": "sha256:6fed29cbf28a8697c6c498e34ebcce31c8a4af455c047ec373fa72741c581508",
      "title": "Philippine pork production (USDA) — Parquet",
      "description": "USDA's estimate of how much pork the Philippines produced, by market year since 1960. It disagrees with PSA's own production series and is published beside it rather than reconciled with it: the two use different methods and this archive does not average disagreeing sources. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-production.json",
      "path": "https://baboyph.com/data/usda-swine-meat-production.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 25877,
      "hash": "sha256:ef9fd2f0e036f308edb22ec255a4565d50d939b193519068d07d077c49c2d97c",
      "title": "Philippine pork production (USDA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "usda-swine-meat-imports",
      "path": "https://baboyph.com/data/usda-swine-meat-imports.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 24955,
      "hash": "sha256:bb68b1ccd3e8abd2388ccc20a2e9e72e5a6ff32b840804990a261548cad687b7",
      "title": "Philippine pork imports (USDA)",
      "description": "How much pork USDA reckons the Philippines brought in, by market year since 1960. This is the number the import debate is actually about, and it is far larger relative to supply than PSA's import dependency ratio suggests — different methods, both named here, neither averaged. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-imports.full",
      "path": "https://baboyph.com/data/full/usda-swine-meat-imports.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 26181,
      "hash": "sha256:e0c6298b46f1976d509975f44668303c02384a5026d4e7e07ef8d09fb6d56a97",
      "title": "Philippine pork imports (USDA) — including withdrawn rows",
      "description": "How much pork USDA reckons the Philippines brought in, by market year since 1960. This is the number the import debate is actually about, and it is far larger relative to supply than PSA's import dependency ratio suggests — different methods, both named here, neither averaged. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "usda-swine-meat-imports.parquet",
      "path": "https://baboyph.com/data/usda-swine-meat-imports.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3055,
      "hash": "sha256:a7fb6807744a4b9fe4a08f842b39a6de00a55117ccacf800c874127ca885c5df",
      "title": "Philippine pork imports (USDA) — Parquet",
      "description": "How much pork USDA reckons the Philippines brought in, by market year since 1960. This is the number the import debate is actually about, and it is far larger relative to supply than PSA's import dependency ratio suggests — different methods, both named here, neither averaged. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-imports.json",
      "path": "https://baboyph.com/data/usda-swine-meat-imports.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 28979,
      "hash": "sha256:2bc2467e4074f5e193cc0669fb981113b78a24c257ecac0f63495ce4ecff8a46",
      "title": "Philippine pork imports (USDA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "usda-swine-meat-exports",
      "path": "https://baboyph.com/data/usda-swine-meat-exports.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 32690,
      "hash": "sha256:17e6bb49dac534a006af6b432b0ef0cbb421cac02dd75b9f98ffbf30da59200c",
      "title": "Philippine pork exports (USDA)",
      "description": "Philippine pork leaving the country, by market year since 1960. Nil or nearly nil in most of them, and USDA prints a literal zero both for a quantity that rounds to nothing and for one it does not estimate at all — every such row here says which it is not. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-exports.full",
      "path": "https://baboyph.com/data/full/usda-swine-meat-exports.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 33916,
      "hash": "sha256:11d7b13c493cdc592024c432c95548f3b8f34d39365ac42cf43a7fdafae1f405",
      "title": "Philippine pork exports (USDA) — including withdrawn rows",
      "description": "Philippine pork leaving the country, by market year since 1960. Nil or nearly nil in most of them, and USDA prints a literal zero both for a quantity that rounds to nothing and for one it does not estimate at all — every such row here says which it is not. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "usda-swine-meat-exports.parquet",
      "path": "https://baboyph.com/data/usda-swine-meat-exports.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2919,
      "hash": "sha256:efa8c7bb95042f18119903747e9ac460ef4578d4379473c2119c068908a0984b",
      "title": "Philippine pork exports (USDA) — Parquet",
      "description": "Philippine pork leaving the country, by market year since 1960. Nil or nearly nil in most of them, and USDA prints a literal zero both for a quantity that rounds to nothing and for one it does not estimate at all — every such row here says which it is not. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-exports.json",
      "path": "https://baboyph.com/data/usda-swine-meat-exports.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 37272,
      "hash": "sha256:fbb3927bd0219ed37736c0e1def542d534dec1681173550d66a9cb8d8a91f91a",
      "title": "Philippine pork exports (USDA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "usda-swine-meat-consumption",
      "path": "https://baboyph.com/data/usda-swine-meat-consumption.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 22848,
      "hash": "sha256:2c2f3089e2d35bd7285a57df0467277b5dc32b0a78046ed31ba446a40e3b7ede",
      "title": "Philippine pork consumption (USDA)",
      "description": "How much pork USDA reckons the country ate, by market year since 1960. Production plus imports minus exports and the stock change, which is why it moves with the import series rather than with the herd. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-consumption.full",
      "path": "https://baboyph.com/data/full/usda-swine-meat-consumption.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 24074,
      "hash": "sha256:37f920a0921e36959e9a0da85e32ccfd022fc855e5cae99e23d106f395693b90",
      "title": "Philippine pork consumption (USDA) — including withdrawn rows",
      "description": "How much pork USDA reckons the country ate, by market year since 1960. Production plus imports minus exports and the stock change, which is why it moves with the import series rather than with the herd. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "usda-swine-meat-consumption.parquet",
      "path": "https://baboyph.com/data/usda-swine-meat-consumption.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 2874,
      "hash": "sha256:4af1376da98717a17847e5203f755108b7b8f9b81adffa4828ba4f883e88bdfc",
      "title": "Philippine pork consumption (USDA) — Parquet",
      "description": "How much pork USDA reckons the country ate, by market year since 1960. Production plus imports minus exports and the stock change, which is why it moves with the import series rather than with the herd. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-consumption.json",
      "path": "https://baboyph.com/data/usda-swine-meat-consumption.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 25884,
      "hash": "sha256:a2d8ffbde8ff3b32cc3b2d142edf95310d3ece5f7b0a60c8489a32510b962b08",
      "title": "Philippine pork consumption (USDA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "usda-swine-meat-beginning-stocks",
      "path": "https://baboyph.com/data/usda-swine-meat-beginning-stocks.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 28469,
      "hash": "sha256:399f073c1840ef1915127aeab4404ea982a0a5d13bfdd5d8842820d75d5f2910",
      "title": "Philippine pork stocks at market-year open (USDA)",
      "description": "Cold-store pork on hand when the market year opened, by USDA market year. Small next to production in every year, and the reason the supply and use sides of the balance close. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-beginning-stocks.full",
      "path": "https://baboyph.com/data/full/usda-swine-meat-beginning-stocks.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 29695,
      "hash": "sha256:ac9bd7c64913d74dee0046c429cebe8442ec85e8f49b92fc495542519bcfae2b",
      "title": "Philippine pork stocks at market-year open (USDA) — including withdrawn rows",
      "description": "Cold-store pork on hand when the market year opened, by USDA market year. Small next to production in every year, and the reason the supply and use sides of the balance close. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "usda-swine-meat-beginning-stocks.parquet",
      "path": "https://baboyph.com/data/usda-swine-meat-beginning-stocks.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3038,
      "hash": "sha256:5bf7f5568b9c105336ff17eaada7186cfea9788a9051402fc2687c45bb374b86",
      "title": "Philippine pork stocks at market-year open (USDA) — Parquet",
      "description": "Cold-store pork on hand when the market year opened, by USDA market year. Small next to production in every year, and the reason the supply and use sides of the balance close. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-beginning-stocks.json",
      "path": "https://baboyph.com/data/usda-swine-meat-beginning-stocks.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 30892,
      "hash": "sha256:46d666bca4ee58ba419e2560e845bac3782e1274e2f1ef314265e9bc64982997",
      "title": "Philippine pork stocks at market-year open (USDA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "usda-swine-meat-ending-stocks",
      "path": "https://baboyph.com/data/usda-swine-meat-ending-stocks.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 27625,
      "hash": "sha256:2d9a30f16a5d119f4b8c51d34da3926e92c3d5651d4d0da9f710eec392f97bb7",
      "title": "Philippine pork stocks at market-year close (USDA)",
      "description": "Cold-store pork on hand when the market year closed. It is the following year's beginning stocks in every year USDA publishes both, which is one of the things worth checking about a balance sheet. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-ending-stocks.full",
      "path": "https://baboyph.com/data/full/usda-swine-meat-ending-stocks.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 28851,
      "hash": "sha256:b3738701aab10007362d8a185682c5673ae2e9dac25124485d145a747b1e0cf8",
      "title": "Philippine pork stocks at market-year close (USDA) — including withdrawn rows",
      "description": "Cold-store pork on hand when the market year closed. It is the following year's beginning stocks in every year USDA publishes both, which is one of the things worth checking about a balance sheet. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "usda-swine-meat-ending-stocks.parquet",
      "path": "https://baboyph.com/data/usda-swine-meat-ending-stocks.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 3037,
      "hash": "sha256:93e2b85905ed5b7b57de4f11aa9a32089e457be4c48eca1f02aae558bfeb69c0",
      "title": "Philippine pork stocks at market-year close (USDA) — Parquet",
      "description": "Cold-store pork on hand when the market year closed. It is the following year's beginning stocks in every year USDA publishes both, which is one of the things worth checking about a balance sheet. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "usda-swine-meat-ending-stocks.json",
      "path": "https://baboyph.com/data/usda-swine-meat-ending-stocks.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 30613,
      "hash": "sha256:941220c08e15ea20c5bef52ff5fec71b7db5ea5302e1a2b70cd09ccfb763f576",
      "title": "Philippine pork stocks at market-year close (USDA) — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "php-usd-average",
      "path": "https://baboyph.com/data/php-usd-average.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 317391,
      "hash": "sha256:5357d889af03d53778c3f7a216c64b14f55797e3b0032a27e5a8173f130fc71f",
      "title": "Peso-dollar rate, monthly average",
      "description": "What a US dollar cost in pesos, month by month since 1945, from BSP's own reference-rate table. It is the rate the archive's dollar-denominated feed prices convert at, and it is BSP's figure rather than the IMF's — the two disagree badly through the decontrol years and this archive does not splice sources together. Published rows only: retracted rows are excluded, so an average taken over this file is correct without filtering.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "php-usd-average.full",
      "path": "https://baboyph.com/data/full/php-usd-average.csv",
      "type": "table",
      "format": "csv",
      "mediatype": "text/csv",
      "encoding": "utf-8",
      "bytes": 335051,
      "hash": "sha256:5d240c2bc13f9f09f30bf2a9f3d8e350a2122befbb3ba04a11b27610334a1388",
      "title": "Peso-dollar rate, monthly average — including withdrawn rows",
      "description": "What a US dollar cost in pesos, month by month since 1945, from BSP's own reference-rate table. It is the rate the archive's dollar-denominated feed prices convert at, and it is BSP's figure rather than the IMF's — the two disagree badly through the decontrol years and this archive does not splice sources together. Every row this archive has ever held, with a status column and the retraction date and reason. Use it to audit the archive, not to compute on: a retracted row and the row that replaced it share a key, which is why this resource declares no primary key.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "status",
            "type": "string",
            "title": "Row status",
            "description": "Either published or retracted. A value rather than a boolean: an empty FALSE cell is indistinguishable from a missing column, whereas a status value looks wrong when it is wrong. Present only in the full files; the live files carry published rows only."
          },
          {
            "name": "date",
            "type": "date",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all.",
            "missingValues": [
              "NA"
            ]
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "date",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "retracted_on",
            "type": "date",
            "title": "Date withdrawn",
            "description": "Set on retracted rows only. Nothing is ever deleted from this archive: a wrong row is retracted in place, keeps its key, and stays downloadable in the full files."
          },
          {
            "name": "retraction_reason",
            "type": "string",
            "title": "Why it was withdrawn",
            "description": "Set on retracted rows only, in prose. Required by the archive: a silent retraction is a deletion."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "missingValues": [
          ""
        ]
      }
    },
    {
      "name": "php-usd-average.parquet",
      "path": "https://baboyph.com/data/php-usd-average.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 15326,
      "hash": "sha256:28d326799c9a52ad6673b93099c7ee5613dae60f8ec39e343b0b7926a2e26bfc",
      "title": "Peso-dollar rate, monthly average — Parquet",
      "description": "What a US dollar cost in pesos, month by month since 1945, from BSP's own reference-rate table. It is the rate the archive's dollar-denominated feed prices convert at, and it is BSP's figure rather than the IMF's — the two disagree badly through the decontrol years and this archive does not splice sources together. The same published rows as the CSV, with types: the three numeric columns are doubles and a missing figure is a real null rather than the NA token a CSV is forced to write. Snappy-compressed, which every Parquet reader decodes without an extra package.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ],
        "primaryKey": [
          "date"
        ]
      }
    },
    {
      "name": "php-usd-average.json",
      "path": "https://baboyph.com/data/php-usd-average.json",
      "format": "json",
      "mediatype": "application/json",
      "encoding": "utf-8",
      "bytes": 418788,
      "hash": "sha256:1bb0c6f637b08ebfec0bd9921033f011d708f2a789cd5118534bc4974cd3aceb",
      "title": "Peso-dollar rate, monthly average — JSON",
      "description": "The same rows as the full CSV, as JSON, with the coverage summary and the licence. Not declared tabular: it is one object with an observations array, so a Table Schema would describe a shape it does not have."
    },
    {
      "name": "baboyph-industry.parquet",
      "path": "https://baboyph.com/data/baboyph-industry.parquet",
      "type": "table",
      "format": "parquet",
      "mediatype": "application/vnd.apache.parquet",
      "bytes": 242844,
      "hash": "sha256:c5b2d90dd0df9f314c7aa5f0b7e56616a2364aaf77cca5b2d6c71aea7c14ffaa",
      "title": "The whole archive, long format, as Parquet",
      "description": "Every published row of every series in one typed file. This is the download to take if you want the archive whole: the equivalent CSV is 20.7 MB and this is a quarter of a megabyte. Same rows, same column order, real nulls, no primary key for the same reason the stacked CSV declares none.",
      "schema": {
        "fields": [
          {
            "name": "series",
            "type": "string",
            "title": "Series id",
            "description": "The archive id of the series this row belongs to, resolvable at https://baboyph.com/data/<series>. Column one of every file so that a single-series download and the whole-archive download have the identical shape."
          },
          {
            "name": "date",
            "type": "string",
            "title": "Period end",
            "description": "The date the reading REFERS TO, not the date it was retrieved. For an annual series this is the resolved reference date: a 31 March inventory filed under 2026 exports as 2026-03-31, not as the year end."
          },
          {
            "name": "period",
            "type": "string",
            "title": "Period as the source states it",
            "description": "The publisher’s own label for the period, such as Q1 2026 or 2026-07. Kept verbatim so a row can be found again in the publication it came from."
          },
          {
            "name": "value",
            "type": "number",
            "title": "The reading",
            "description": "NA means the source published no figure for this period. It is never 0 for unknown, never carried forward and never interpolated. Its unit is in the unit column and differs across series, so grouping by series without reading unit gives a nonsense answer."
          },
          {
            "name": "unit",
            "type": "string",
            "title": "Unit of the reading",
            "description": "What the value is measured in, as the source declares it: PHP/kg liveweight, head, metric ton. Carried on the row rather than in the filename because units differ within this archive and, for two PSA production tables of the same commodity, between tables."
          },
          {
            "name": "geo",
            "type": "string",
            "title": "Geography",
            "description": "The geography the reading covers. Empty on a series that has only ever had one. Codes and names follow PSA’s livestock vocabulary; https://baboyph.com/data/geography resolves them, and PSA’s retail price tables use a different numbering that is not translatable by arithmetic."
          },
          {
            "name": "kind",
            "type": "string",
            "title": "What kind of reading this is",
            "description": "How the figure was arrived at: which survey, or that it is derived. Empty on the oldest hand-built rows."
          },
          {
            "name": "rangeLow",
            "type": "number",
            "title": "Low end of a published range",
            "description": "Set when the source published a range. With a value present, the value is the midpoint and this pair is what stops that midpoint being read as a measurement; with value NA, the source published a range and this archive publishes no single figure for it."
          },
          {
            "name": "rangeHigh",
            "type": "number",
            "title": "High end of a published range",
            "description": "See rangeLow. The two are always set together or not at all."
          },
          {
            "name": "source_id",
            "type": "string",
            "title": "Source id",
            "description": "The publisher this row was read from, resolvable in the archive’s citation registry and rendered at https://baboyph.com/data/provenance."
          },
          {
            "name": "source_url",
            "type": "string",
            "title": "Source URL",
            "description": "The document or query this row came from. Swept monthly for liveness; a URL that has rotted is recorded and never causes a row to be withdrawn."
          },
          {
            "name": "accessed_on",
            "type": "string",
            "title": "Last read from the source",
            "description": "The most recent date the source was read for this row. Where it differs from the first reading of that row, the row has been re-read and still says the same thing."
          },
          {
            "name": "derivation",
            "type": "string",
            "title": "The arithmetic, for a computed row",
            "description": "Empty on a retrieved row. On a derived one it states what was computed from what: a synthesis figure without its arithmetic is exactly the unsourced number this archive exists to prevent."
          },
          {
            "name": "note",
            "type": "string",
            "title": "Note",
            "description": "Anything about this row a reader needs before using it. Prose, and the one place in a row where non-ASCII appears."
          },
          {
            "name": "citation",
            "type": "string",
            "title": "Attribution",
            "description": "The attribution line, repeated on every row. The unit of loss is the row, not the file: somebody pastes four lines into a group chat and a file-level header does not survive that."
          }
        ]
      }
    }
  ]
}
