{ "spec": "epicfields.cube/1", "what": "The column dictionary for an Epic Fields field cube. Identical for every share, which is why it is served once here rather than copied into each one.", "passes.parquet": { "grain": "one row per Sentinel-2 pass that produced a usable raster, oldest first", "columns": { "date": "UTC date of the overpass, YYYY-MM-DD", "ndvi_mean": "mean NDVI over in-field pixels. FLOAT, computed from B04/B08 before any quantisation. This is the authoritative per-pass value.", "ndvi_sd": "standard deviation of in-field NDVI on this pass, from the 8-bit raster", "ndvi_p10": "10th percentile of in-field NDVI, from the raster", "ndvi_median": "median of in-field NDVI, from the raster", "ndvi_p90": "90th percentile of in-field NDVI, from the raster", "in_field_clear_pct": "percentage of in-field pixels the satellite actually returned on this pass", "gap_days": "days since the previous pass in this table. null on the first row.", "believed": "THREE values: 'yes' tested against both neighbours and kept; 'untested' an endpoint with no neighbour on one side, so the spike rule could not run; 'no' a spike, excluded from aggregates. Filtering == 'yes' excludes the untested endpoints as well as the spikes; != 'no' keeps them.", "scene_cloud_pct": "cloud fraction over the field on this pass, as a percentage", "dominant_scl_class": "most common Sentinel-2 scene classification class over the field", "kc_from_ndvi": "clamp(1.37 * ndvi_mean - 0.086, 0, inf). A function of this pass's field-mean NDVI and nothing else: no crop type, no canopy height, nothing measured on the crop." } }, "pixels.parquet": { "grain": "one row per in-field pixel", "columns": { "row": "row index into the cube grid, 0 at the north edge", "col": "column index into the cube grid, 0 at the west edge", "easting": "UTM easting of the pixel CENTRE, in the CRS named by manifest.grid.crs", "northing": "UTM northing of the pixel centre", "lon": "longitude of the pixel centre, EPSG:4326", "lat": "latitude of the pixel centre, EPSG:4326", "season_mean_ndvi": "mean NDVI for this pixel across believed passes. NaN where nothing was observed.", "season_sd_ndvi": "how much this pixel moved through the season", "n_observations": "how many believed passes actually saw this pixel. A low value means the mean and sd behind it rest on few observations." }, "note": "Both projected and geographic coordinates are given so you can write a georeferenced output without a reprojection library." }, "pixels_by_pass.parquet": { "grain": "one row per in-field pixel; one COLUMN per pass date", "columns": { "row": "row index into the cube grid", "col": "column index into the cube grid", "lon": "longitude of the pixel centre", "lat": "latitude of the pixel centre", "": "NDVI for that pixel on that pass. NaN where the satellite returned nothing.", "_SPIKE": "same, for a pass the spike rule rejected. The raster is real; the pass is not believed.", "_UNTESTED": "same, for an endpoint the spike rule could not test." }, "note": "Call columns() on this file before reading it -- the date columns cannot be guessed. Values are 8-bit at source, so the real resolution is about 0.0039 NDVI and a smaller difference is quantisation rather than measurement." }, "weather.parquet": { "grain": "one row per day over the window. Absent when the weather service could not answer.", "columns": { "date": "YYYY-MM-DD", "rain_mm": "daily rainfall. ABSENT as a column where there is no rainfall archive for the location -- withheld rather than modelled.", "tmin_c": "daily minimum air temperature", "tmax_c": "daily maximum air temperature", "et0_short_crop_mm": "FAO-56 reference evapotranspiration for a 0.12 m grass reference surface, from the gridded weather provider. Not measured on this field, and not the crop's water use." } }, "derived_daily.parquet": { "grain": "one row per day. MODELLED, not observed -- the only such table in a cube.", "columns": { "date": "YYYY-MM-DD", "interpolated": "'true' or 'false' -- whether this row sits on a measured pass", "days_from_pass": "days to the nearest measured pass. 0 means the row sits on a pass; a larger value is the distance over which kc_from_ndvi was interpolated or held flat.", "kc_from_ndvi": "the per-pass value above, linearly interpolated between passes and held flat outside them", "etc_from_ndvi_mm": "kc_from_ndvi * et0_short_crop_mm" } }, "observations.json": { "grain": "every Sentinel-2 overpass in the window, including the ones with no usable raster", "why": "So a gap is visible rather than silently absent. A season with 155 overpasses and 53 rasters is a cloudy season, and that is information." }, "disclaimer": "Epic Fields publishes this cube as measurements and clearly-labelled derivations. Any description, diagnosis, recommendation or conclusion drawn from it -- by an AI assistant or by anyone else -- is the work of whoever produced it and not of Epic Fields.\n\nLanguage models routinely produce fluent, specific and confident statements that the underlying data does not support: dates that are not in the record, events that were never observed, and figures that were never computed. This has already been observed with this data. Every number an assistant cites should be locatable in passes.parquet, weather.parquet or derived_daily.parquet; anything that cannot be found there was not measured here.\n\nEpic Fields makes no warranty of fitness for any purpose and accepts no liability for decisions taken on the basis of this data, or of anything generated from it." }