cjc0013 commited on
Commit
665aed7
·
verified ·
1 Parent(s): dba0a52

Update drone sightings base-event release

Browse files

Verified local release drone-sightings-base-events-uap-20260425-r1: 10 event clusters, 32 source rows, 0 verifier failures.

dataset_bundle/README.md CHANGED
@@ -3,6 +3,7 @@
3
  A small, review-oriented slice of U.S. public-source and FAA-reported drone sightings mapped against official covered-area registries.
4
 
5
  This release tracks reported drone sightings from public-source news stories and FAA preliminary UAS sighting reports; it does not prove intent, wrongdoing, threat, or a verified security breach.
 
6
 
7
  ## Included Files
8
 
@@ -10,6 +11,7 @@ This release tracks reported drone sightings from public-source news stories and
10
  - `monitored_areas.csv`
11
  - `event_sources.csv`
12
  - `daily_area_rollup.csv`
 
13
  - `public_release_manifest.json`
14
  - `methodology.md`
15
  - `limitations_and_blind_spots.md`
@@ -19,6 +21,7 @@ This release tracks reported drone sightings from public-source news stories and
19
  ## Caveats
20
 
21
  - This release tracks reported drone sightings from public-source news stories and official FAA UAS sighting reports; FAA reports are still preliminary sighting records, not verified federal incident findings.
 
22
  - A reported sighting does not by itself prove intent, threat, wrongdoing, or the presence of a hostile actor.
23
  - Events are plotted at the covered-area point or centroid, not at a freehand geocoded story location.
24
  - Some event dates use article publication dates as bounded proxies when an observed date is not extractable from the story.
 
3
  A small, review-oriented slice of U.S. public-source and FAA-reported drone sightings mapped against official covered-area registries.
4
 
5
  This release tracks reported drone sightings from public-source news stories and FAA preliminary UAS sighting reports; it does not prove intent, wrongdoing, threat, or a verified security breach.
6
+ It also includes a conservative UAP/drone language overlay so readers can distinguish official UAS records from ordinary drone language and sources that explicitly use mystery-drone, UFO, or UAP wording.
7
 
8
  ## Included Files
9
 
 
11
  - `monitored_areas.csv`
12
  - `event_sources.csv`
13
  - `daily_area_rollup.csv`
14
+ - `uap_language_overlay_report.json`
15
  - `public_release_manifest.json`
16
  - `methodology.md`
17
  - `limitations_and_blind_spots.md`
 
21
  ## Caveats
22
 
23
  - This release tracks reported drone sightings from public-source news stories and official FAA UAS sighting reports; FAA reports are still preliminary sighting records, not verified federal incident findings.
24
+ - UAP-adjacent labels are source-language overlap labels only; they do not verify that an object was a UAP, anomalous, or non-human.
25
  - A reported sighting does not by itself prove intent, threat, wrongdoing, or the presence of a hostile actor.
26
  - Events are plotted at the covered-area point or centroid, not at a freehand geocoded story location.
27
  - Some event dates use article publication dates as bounded proxies when an observed date is not extractable from the story.
dataset_bundle/daily_area_rollup.csv CHANGED
The diff for this file is too large to render. See raw diff
 
dataset_bundle/event_sources.csv CHANGED
The diff for this file is too large to render. See raw diff
 
dataset_bundle/events.csv CHANGED
The diff for this file is too large to render. See raw diff
 
dataset_bundle/limitations_and_blind_spots.md CHANGED
@@ -1,9 +1,12 @@
1
  # Limitations And Blind Spots
2
 
3
  - This release tracks reported drone sightings from public-source news stories and FAA preliminary UAS sighting reports; it does not prove intent, wrongdoing, threat, or a verified security breach.
 
4
  - This is a public-source and preliminary-reporting dataset, not a verified government incident ledger.
5
  - Stories behind paywalls, JavaScript-heavy pages, or blocked fetches can fall out of the slice.
6
  - Event points are covered-area centroids or official point locations, not narrative story coordinates.
7
  - Publication dates are used as bounded proxies when a direct observation date is not extractable.
8
  - Ambiguous multi-area stories stay in the internal review queue and are excluded from the public map.
9
- - Current gap: `port` has `370` monitored areas but no public events in this slice.
 
 
 
1
  # Limitations And Blind Spots
2
 
3
  - This release tracks reported drone sightings from public-source news stories and FAA preliminary UAS sighting reports; it does not prove intent, wrongdoing, threat, or a verified security breach.
4
+ - UAP-adjacent labels mean the source language overlaps with mystery-drone or UFO/UAP wording; they are not UAP determinations.
5
  - This is a public-source and preliminary-reporting dataset, not a verified government incident ledger.
6
  - Stories behind paywalls, JavaScript-heavy pages, or blocked fetches can fall out of the slice.
7
  - Event points are covered-area centroids or official point locations, not narrative story coordinates.
8
  - Publication dates are used as bounded proxies when a direct observation date is not extractable.
9
  - Ambiguous multi-area stories stay in the internal review queue and are excluded from the public map.
10
+ - Current gap: `airport` has `19407` monitored areas but no public events in this slice.
11
+ - Current gap: `port` has `370` monitored areas but no public events in this slice.
12
+ - Current gap: `power_plant` has `16104` monitored areas but no public events in this slice.
dataset_bundle/methodology.md CHANGED
@@ -8,11 +8,13 @@ This release shows a bounded set of U.S. public-source and FAA-reported drone si
8
  - News candidates are harvested through a bounded search layer and then fetched as raw article HTML for deterministic parsing.
9
  - Official FAA UAS sighting report rows are included only when a strict airport-code match resolves to one monitored airport.
10
  - Source records are matched only to covered-area registry entries and deduped into area-scoped events.
 
11
  - When a source mentions more than one plausible area and a single primary area cannot be resolved deterministically, the source is kept out of the public map.
12
 
13
  ## Source Window
14
- - Start: `2024-04-24`
15
  - End: `2026-04-24`
16
 
17
  ## What This Does Not Prove
18
- This release tracks reported drone sightings from public sources and FAA preliminary sighting reports; it does not prove intent, threat, wrongdoing, illegality, or the identity of any aircraft operator.
 
 
8
  - News candidates are harvested through a bounded search layer and then fetched as raw article HTML for deterministic parsing.
9
  - Official FAA UAS sighting report rows are included only when a strict airport-code match resolves to one monitored airport.
10
  - Source records are matched only to covered-area registry entries and deduped into area-scoped events.
11
+ - Each event also gets a deterministic source-language overlay that separates official UAS reports, ordinary drone-language reports, mystery-drone language, and explicit UFO/UAP language.
12
  - When a source mentions more than one plausible area and a single primary area cannot be resolved deterministically, the source is kept out of the public map.
13
 
14
  ## Source Window
15
+ - Start: `2023-01-01`
16
  - End: `2026-04-24`
17
 
18
  ## What This Does Not Prove
19
+ This release tracks reported drone sightings from public sources and FAA preliminary sighting reports; it does not prove intent, threat, wrongdoing, illegality, or the identity of any aircraft operator.
20
+ The UAP-adjacent overlay is a language classifier only; it does not verify that a reported object was anomalous or a UAP.
dataset_bundle/public_release_manifest.json CHANGED
@@ -1,21 +1,21 @@
1
  {
2
- "public_version": "drone-sightings-public-20260425-r7",
3
  "title": "Drone Sightings Near Covered U.S. Military and Civilian Areas",
4
- "release_date": "2026-04-25T09:31:32.437334+00:00",
5
- "source_run_name": "drone_sightings_24mo_faa_release_candidate_20260425_r4",
6
  "slice_description": "A small, review-oriented slice of U.S. public-source and FAA-reported drone sightings mapped against official covered-area registries.",
7
  "source_window": {
8
- "start_date": "2024-04-24",
9
  "end_date": "2026-04-24",
10
- "window_days": 730
11
  },
12
  "counts": {
13
- "events": 2508,
14
  "monitored_areas": 36702,
15
- "event_sources": 2551,
16
- "daily_area_rollup_rows": 2334,
17
- "article_candidates": 309,
18
- "article_fetch_failed": 7
19
  },
20
  "covered_area_counts_by_type": {
21
  "airport": 19407,
@@ -24,37 +24,53 @@
24
  "power_plant": 16104
25
  },
26
  "event_counts_by_type": {
27
- "airport": 2501,
28
- "military_installation": 6,
29
- "power_plant": 1
30
  },
31
  "event_counts_by_class": {
32
- "civilian": 2502,
33
- "military": 6
34
  },
35
  "quality_summary": {
36
- "unresolved_area_share": 0.09233,
37
- "review_article_count": 260,
38
- "weak_area_review_count": 39,
39
- "weak_area_context_review_count": 23,
40
- "weak_event_context_review_count": 20,
41
- "off_scope_review_count": 35,
42
- "false_match_canary_review_count": 1,
43
- "article_fetch_failure_share": 0.002486,
44
- "article_fetch_failure_count": 7,
45
  "news_search_failure_count": 0,
46
  "official_source_failure_count": 0,
47
  "source_unavailable_count": 0,
48
- "duplicate_cluster_share": 0.004785,
49
  "conflicting_area_cluster_count": 0,
50
- "review_conflicting_area_cluster_count": 1,
51
- "report_date_proxy_share": 0.000399
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  },
53
  "included_tables": [
54
  "events.csv",
55
  "monitored_areas.csv",
56
  "event_sources.csv",
57
  "daily_area_rollup.csv",
 
58
  "public_release_manifest.json",
59
  "methodology.md",
60
  "limitations_and_blind_spots.md",
@@ -63,6 +79,7 @@
63
  ],
64
  "caveats": [
65
  "This release tracks reported drone sightings from public-source news stories and official FAA UAS sighting reports; FAA reports are still preliminary sighting records, not verified federal incident findings.",
 
66
  "A reported sighting does not by itself prove intent, threat, wrongdoing, or the presence of a hostile actor.",
67
  "Events are plotted at the covered-area point or centroid, not at a freehand geocoded story location.",
68
  "Some event dates use article publication dates as bounded proxies when an observed date is not extractable from the story.",
 
1
  {
2
+ "public_version": "drone-sightings-base-events-uap-20260425-r1",
3
  "title": "Drone Sightings Near Covered U.S. Military and Civilian Areas",
4
+ "release_date": "2026-04-25T15:17:58.986193+00:00",
5
+ "source_run_name": "drone_sightings_curated_base_events_20260425_r6",
6
  "slice_description": "A small, review-oriented slice of U.S. public-source and FAA-reported drone sightings mapped against official covered-area registries.",
7
  "source_window": {
8
+ "start_date": "2023-01-01",
9
  "end_date": "2026-04-24",
10
+ "window_days": 1209
11
  },
12
  "counts": {
13
+ "events": 10,
14
  "monitored_areas": 36702,
15
+ "event_sources": 32,
16
+ "daily_area_rollup_rows": 10,
17
+ "article_candidates": 44,
18
+ "article_fetch_failed": 2
19
  },
20
  "covered_area_counts_by_type": {
21
  "airport": 19407,
 
24
  "power_plant": 16104
25
  },
26
  "event_counts_by_type": {
27
+ "military_installation": 10
 
 
28
  },
29
  "event_counts_by_class": {
30
+ "military": 10
 
31
  },
32
  "quality_summary": {
33
+ "unresolved_area_share": 0.272727,
34
+ "review_article_count": 12,
35
+ "weak_area_review_count": 2,
36
+ "weak_area_context_review_count": 0,
37
+ "weak_event_context_review_count": 2,
38
+ "off_scope_review_count": 1,
39
+ "false_match_canary_review_count": 0,
40
+ "article_fetch_failure_share": 0.045455,
41
+ "article_fetch_failure_count": 2,
42
  "news_search_failure_count": 0,
43
  "official_source_failure_count": 0,
44
  "source_unavailable_count": 0,
45
+ "duplicate_cluster_share": 0.9,
46
  "conflicting_area_cluster_count": 0,
47
+ "review_conflicting_area_cluster_count": 0,
48
+ "report_date_proxy_share": 0.5
49
+ },
50
+ "uap_language_overlay": {
51
+ "interpretation": "This is a source-language overlay. It labels whether sources use drone/UAS, mystery-drone, or explicit UFO/UAP language; it does not verify that a reported object was a drone or a UAP.",
52
+ "event_counts_by_uap_overlap_label": {
53
+ "drone_or_uas_report": 1,
54
+ "explicit_ufo_uap_language": 2,
55
+ "known_non_uap_drone_language": 2,
56
+ "uap_adjacent_drone_language": 5
57
+ },
58
+ "event_counts_by_language_family": {
59
+ "drone_or_uas_report": 1,
60
+ "explicit_ufo_uap_language": 2,
61
+ "known_operator_or_mundane_drone": 2,
62
+ "mystery_drone_language": 5
63
+ },
64
+ "uap_adjacent_event_count": 5,
65
+ "explicit_ufo_uap_event_count": 2,
66
+ "official_uas_event_count": 0
67
  },
68
  "included_tables": [
69
  "events.csv",
70
  "monitored_areas.csv",
71
  "event_sources.csv",
72
  "daily_area_rollup.csv",
73
+ "uap_language_overlay_report.json",
74
  "public_release_manifest.json",
75
  "methodology.md",
76
  "limitations_and_blind_spots.md",
 
79
  ],
80
  "caveats": [
81
  "This release tracks reported drone sightings from public-source news stories and official FAA UAS sighting reports; FAA reports are still preliminary sighting records, not verified federal incident findings.",
82
+ "UAP-adjacent labels are source-language overlap labels only; they do not verify that an object was a UAP, anomalous, or non-human.",
83
  "A reported sighting does not by itself prove intent, threat, wrongdoing, or the presence of a hostile actor.",
84
  "Events are plotted at the covered-area point or centroid, not at a freehand geocoded story location.",
85
  "Some event dates use article publication dates as bounded proxies when an observed date is not extractable from the story.",
dataset_bundle/quality_checks.md CHANGED
@@ -1,16 +1,16 @@
1
  # Quality Checks
2
 
3
- - Event rows: `2508`
4
  - Monitored areas: `36702`
5
- - Event source rows: `2551`
6
- - Article fetch failure share: `0.002486`
7
  - Source unavailable count: `0`
8
- - Review article count: `260`
9
- - False-match canary review count: `1`
10
- - Duplicate cluster share: `0.004785`
11
  - Conflicting area clusters: `0`
12
- - Review-suppressed conflicting area clusters: `1`
13
- - Unresolved area share: `0.09233`
14
 
15
  ## Public Integrity Language
16
 
 
1
  # Quality Checks
2
 
3
+ - Event rows: `10`
4
  - Monitored areas: `36702`
5
+ - Event source rows: `32`
6
+ - Article fetch failure share: `0.045455`
7
  - Source unavailable count: `0`
8
+ - Review article count: `12`
9
+ - False-match canary review count: `0`
10
+ - Duplicate cluster share: `0.9`
11
  - Conflicting area clusters: `0`
12
+ - Review-suppressed conflicting area clusters: `0`
13
+ - Unresolved area share: `0.272727`
14
 
15
  ## Public Integrity Language
16
 
dataset_bundle/schema_notes.md CHANGED
@@ -4,6 +4,9 @@
4
  - `event_date`: observed date when extractable, otherwise a publication-date proxy.
5
  - `review_status`: public rows are auto-included deterministic event rows only.
6
  - `source_count`: number of supporting stories retained in the dedupe cluster.
 
 
 
7
 
8
  ## monitored_areas.csv
9
  - Rows represent official covered-area points or centroids used for event plotting.
 
4
  - `event_date`: observed date when extractable, otherwise a publication-date proxy.
5
  - `review_status`: public rows are auto-included deterministic event rows only.
6
  - `source_count`: number of supporting stories retained in the dedupe cluster.
7
+ - `language_family`: deterministic source-language bucket such as official UAS report, ordinary drone report, mystery-drone language, or explicit UFO/UAP language.
8
+ - `uap_overlap_label`: conservative language-overlap label; it is not a verification that the object was a UAP.
9
+ - `ambiguity_score`: deterministic language score, not a confidence score or factual finding.
10
 
11
  ## monitored_areas.csv
12
  - Rows represent official covered-area points or centroids used for event plotting.
dataset_bundle/uap_language_overlay_report.json ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "report_kind": "drone_uap_language_overlay_v1",
3
+ "interpretation": "This is a source-language overlay. It labels whether sources use drone/UAS, mystery-drone, or explicit UFO/UAP language; it does not verify that a reported object was a drone or a UAP.",
4
+ "event_count": 10,
5
+ "review_article_count": 12,
6
+ "normalized_article_count": 43,
7
+ "event_counts_by_uap_overlap_label": {
8
+ "drone_or_uas_report": 1,
9
+ "explicit_ufo_uap_language": 2,
10
+ "known_non_uap_drone_language": 2,
11
+ "uap_adjacent_drone_language": 5
12
+ },
13
+ "event_counts_by_language_family": {
14
+ "drone_or_uas_report": 1,
15
+ "explicit_ufo_uap_language": 2,
16
+ "known_operator_or_mundane_drone": 2,
17
+ "mystery_drone_language": 5
18
+ },
19
+ "review_counts_by_uap_overlap_label": {
20
+ "drone_or_uas_report": 5,
21
+ "known_non_uap_drone_language": 3,
22
+ "uap_adjacent_drone_language": 4
23
+ },
24
+ "article_counts_by_uap_overlap_label": {
25
+ "drone_or_uas_report": 9,
26
+ "explicit_ufo_uap_language": 3,
27
+ "known_non_uap_drone_language": 21,
28
+ "uap_adjacent_drone_language": 10
29
+ },
30
+ "uap_adjacent_event_count": 5,
31
+ "explicit_ufo_uap_event_count": 2,
32
+ "official_uas_event_count": 0,
33
+ "sample_uap_adjacent_events": [
34
+ {
35
+ "event_id": "event:dod:joint-base-langley-eustis:va:2024-10-13:0001",
36
+ "event_date": "2024-10-13",
37
+ "area_name": "Joint Base Langley-Eustis",
38
+ "uap_overlap_label": "explicit_ufo_uap_language",
39
+ "headline": "Pentagon Baffled By 17-Day Drone Swarm At US Military Base",
40
+ "primary_source_url": "https://dronexl.co/2024/10/13/pentagon-drone-swarm-us-military-base/"
41
+ },
42
+ {
43
+ "event_id": "event:dod:hill-air-force-base:ut:2024-12-18:0002",
44
+ "event_date": "2024-12-18",
45
+ "area_name": "Hill Air Force Base",
46
+ "uap_overlap_label": "uap_adjacent_drone_language",
47
+ "headline": "Multiple Drone Sightings Reported Near Hill Air Force Base Amid Nationwide Military Installation Incidents",
48
+ "primary_source_url": "https://dronexl.co/2024/12/17/multiple-drone-sightings-reported-near-hill-air-force-base/"
49
+ },
50
+ {
51
+ "event_id": "event:dod:wright-patterson-air-force-base:oh:2024-12-16:0003",
52
+ "event_date": "2024-12-16",
53
+ "area_name": "Wright-Patterson Air Force Base",
54
+ "uap_overlap_label": "uap_adjacent_drone_language",
55
+ "headline": "Multiple Drone Incursions Force Temporary Shutdown At Ohio's Wright-Patterson Air Force Base",
56
+ "primary_source_url": "https://dronexl.co/2024/12/15/drone-incursions-ohio-wright-patterson-air-force-base/"
57
+ },
58
+ {
59
+ "event_id": "event:dod:naval-weapons-station-earle-nj:nj:2024-12-09:0004",
60
+ "event_date": "2024-12-09",
61
+ "area_name": "Naval Weapons Station Earle NJ",
62
+ "uap_overlap_label": "uap_adjacent_drone_language",
63
+ "headline": "Nearly 12 Drones Flew Over Naval Weapons Station Earle In Middletown",
64
+ "primary_source_url": "https://patch.com/new-jersey/middletown-nj/6-drones-flew-over-naval-weapons-station-earle-friday-night"
65
+ },
66
+ {
67
+ "event_id": "event:dod:joint-base-mcguire-dix-lakehurst:nj:2024-09-15:0008",
68
+ "event_date": "2024-09-15",
69
+ "area_name": "Joint Base McGuire-Dix-Lakehurst",
70
+ "uap_overlap_label": "explicit_ufo_uap_language",
71
+ "headline": "New Jersey military base confirms multiple drone contraband-smuggling incursions this year",
72
+ "primary_source_url": "https://www.foxnews.com/us/new-jersey-military-base-confirms-multiple-drone-contraband-smuggling-incursions-year"
73
+ },
74
+ {
75
+ "event_id": "event:dod:barksdale-air-force-base:la:2026-03-09:0009",
76
+ "event_date": "2026-03-09",
77
+ "area_name": "Barksdale Air Force Base",
78
+ "uap_overlap_label": "uap_adjacent_drone_language",
79
+ "headline": "Leak Reveals Major Drone Incident at Air Force Base in Trump’s War",
80
+ "primary_source_url": "https://www.thedailybeast.com/leak-reveals-major-drone-incident-at-louisiana-air-force-base-in-trumps-war/"
81
+ },
82
+ {
83
+ "event_id": "event:dod:joint-base-myer-henderson-hall:va:2026-03-19:0010",
84
+ "event_date": "2026-03-19",
85
+ "area_name": "Joint Base Myer-Henderson Hall",
86
+ "uap_overlap_label": "uap_adjacent_drone_language",
87
+ "headline": "Unidentified drones reported flying over Fort McNair; expert calls it security concern",
88
+ "primary_source_url": "https://ktul.com/news/nation-world/unidentified-drones-fly-over-fort-mcnair-expert-calls-it-security-concern"
89
+ }
90
+ ]
91
+ }
public_space_app.py CHANGED
@@ -56,6 +56,9 @@ def _visible_events(events: pd.DataFrame, frame_dates: list[str], frame_index: i
56
  def _point_table(events: pd.DataFrame) -> pd.DataFrame:
57
  ordered = events.copy()
58
  ordered["event_date"] = ordered["event_date"].astype(str)
 
 
 
59
  ordered = ordered.sort_values(["event_date", "event_id", "headline"], ascending=[True, True, True]).reset_index(drop=True)
60
  return ordered[
61
  [
@@ -70,6 +73,9 @@ def _point_table(events: pd.DataFrame) -> pd.DataFrame:
70
  "lon",
71
  "source_count",
72
  "confidence_label",
 
 
 
73
  "review_status",
74
  "primary_source_url",
75
  ]
@@ -79,6 +85,10 @@ def _point_table(events: pd.DataFrame) -> pd.DataFrame:
79
  def _build_map(events: pd.DataFrame, frame_label: str):
80
  if events.empty:
81
  return px.scatter_mapbox(pd.DataFrame({"lat": [], "lon": []}), lat="lat", lon="lon", zoom=3, height=560)
 
 
 
 
82
  fig = px.scatter_mapbox(
83
  events,
84
  lat="lat",
@@ -92,6 +102,8 @@ def _build_map(events: pd.DataFrame, frame_label: str):
92
  "event_date": True,
93
  "source_count": True,
94
  "confidence_label": True,
 
 
95
  "primary_source_url": True,
96
  "lat": False,
97
  "lon": False,
@@ -132,9 +144,13 @@ def _detail_markdown(event_sources: pd.DataFrame, events: pd.DataFrame, event_id
132
  f"- `state`: `{event_row['state']}`",
133
  f"- `lat`: `{event_row['lat']}`",
134
  f"- `lon`: `{event_row['lon']}`",
135
- f"- `source_count`: `{event_row['source_count']}`",
136
- f"- `confidence_label`: `{event_row['confidence_label']}`",
137
- f"- `review_status`: `{event_row['review_status']}`",
 
 
 
 
138
  f"- `primary_source_url`: {event_row['primary_source_url']}",
139
  "",
140
  "#### Summary",
 
56
  def _point_table(events: pd.DataFrame) -> pd.DataFrame:
57
  ordered = events.copy()
58
  ordered["event_date"] = ordered["event_date"].astype(str)
59
+ for column in ["uap_overlap_label", "language_family", "ambiguity_score", "phenomenon_terms"]:
60
+ if column not in ordered.columns:
61
+ ordered[column] = ""
62
  ordered = ordered.sort_values(["event_date", "event_id", "headline"], ascending=[True, True, True]).reset_index(drop=True)
63
  return ordered[
64
  [
 
73
  "lon",
74
  "source_count",
75
  "confidence_label",
76
+ "uap_overlap_label",
77
+ "language_family",
78
+ "ambiguity_score",
79
  "review_status",
80
  "primary_source_url",
81
  ]
 
85
  def _build_map(events: pd.DataFrame, frame_label: str):
86
  if events.empty:
87
  return px.scatter_mapbox(pd.DataFrame({"lat": [], "lon": []}), lat="lat", lon="lon", zoom=3, height=560)
88
+ events = events.copy()
89
+ for column in ["uap_overlap_label", "language_family"]:
90
+ if column not in events.columns:
91
+ events[column] = ""
92
  fig = px.scatter_mapbox(
93
  events,
94
  lat="lat",
 
102
  "event_date": True,
103
  "source_count": True,
104
  "confidence_label": True,
105
+ "uap_overlap_label": True,
106
+ "language_family": True,
107
  "primary_source_url": True,
108
  "lat": False,
109
  "lon": False,
 
144
  f"- `state`: `{event_row['state']}`",
145
  f"- `lat`: `{event_row['lat']}`",
146
  f"- `lon`: `{event_row['lon']}`",
147
+ f"- `source_count`: `{event_row['source_count']}`",
148
+ f"- `confidence_label`: `{event_row['confidence_label']}`",
149
+ f"- `uap_overlap_label`: `{event_row.get('uap_overlap_label', '')}`",
150
+ f"- `language_family`: `{event_row.get('language_family', '')}`",
151
+ f"- `ambiguity_score`: `{event_row.get('ambiguity_score', '')}`",
152
+ f"- `phenomenon_terms`: `{event_row.get('phenomenon_terms', '')}`",
153
+ f"- `review_status`: `{event_row['review_status']}`",
154
  f"- `primary_source_url`: {event_row['primary_source_url']}",
155
  "",
156
  "#### Summary",