/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:97: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  sf[c] = pd.to_numeric(sf[c], errors="coerce")
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:102: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  sf["dedupe_key"] = (sf.Site.map(norm_site) + "|" + sf.lat.round(3).astype(str) + "|"
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:104: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  sf["is_dupe"] = sf.duplicated("dedupe_key", keep="first")
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:107: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  sf["is_hma"] = sf.lat.between(25, 45) & sf.lon.between(60, 105)
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:108: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  sf["is_himalaya"] = sf.lat.between(26, 31) & sf.lon.between(75, 95)
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:133: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  gl["is_hma"] = gl.lat.between(25, 45) & gl.lon.between(60, 105)
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:134: FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

  gl["is_himalaya"] = gl.lat.between(26, 31) & gl.lon.between(75, 95)
{
  "source_zip": "3ecd6ef8-fb24-44f0-b9f1-c8839fe83760.zip",
  "doi": "10.11888/Cryos.tpdc.272812",
  "metadata_claim": {
    "slope_failures": 737,
    "glof": 380
  },
  "slope_failures": {
    "all_rows": {
      "n": 618,
      "by_precision": {
        "day": 459,
        "year": 154,
        "other": 4,
        "month": 1
      },
      "year_min": 1597,
      "year_max": 2022
    },
    "valid_nondupe": 534,
    "dup_rows": 84,
    "by_sheet": {
      "Rock avalanches": 235,
      "Ice avalanches": 163,
      "Ice-rock avalanches": 91,
      "GLOF triggered by avalanches": 64,
      "GLOF triggered by calving": 38,
      "Glacier detachments": 27
    },
    "by_mechanism": {
      "Rock avalanche": 235,
      "Ice avalanche": 163,
      "Ice-rock avalanche": 91,
      "Ice avalanches": 50,
      "Glacier terminal calving": 38,
      "Glacier detachment": 27,
      "Ice-rock avalanches": 14
    },
    "precision_by_sheet": {
      "GLOF triggered by avalanches|day": 42,
      "GLOF triggered by avalanches|other": 1,
      "GLOF triggered by avalanches|year": 21,
      "GLOF triggered by calving|day": 27,
      "GLOF triggered by calving|year": 11,
      "Glacier detachments|day": 24,
      "Glacier detachments|year": 3,
      "Ice avalanches|day": 123,
      "Ice avalanches|month": 1,
      "Ice avalanches|year": 39,
      "Ice-rock avalanches|day": 78,
      "Ice-rock avalanches|year": 13,
      "Rock avalanches|day": 165,
      "Rock avalanches|other": 3,
      "Rock avalanches|year": 67
    },
    "hma": 148,
    "himalaya": 88,
    "hma_by_sheet": {
      "Ice avalanches": 39,
      "Ice-rock avalanches": 37,
      "GLOF triggered by avalanches": 27,
      "Rock avalanches": 17,
      "GLOF triggered by calving": 15,
      "Glacier detachments": 13
    },
    "complete_volume": 326,
    "complete_volume_and_H": 206,
    "complete_angle": 174
  },
  "glof": {
    "all_rows": {
      "n": 376,
      "by_precision": {
        "day": 251,
        "year": 118,
        "other": 7
      },
      "year_min": 1725,
      "year_max": 2021
    },
    "hma": 108,
    "himalaya": 74,
    "complete_volume": 68
  }
}

============================================================
同机制可用子集（体积与水平距离均有值，去重后）：
sheet
Glacier detachments      8
Ice avalanches          14
Ice-rock avalanches     21
Rock avalanches        157
冰岩崩+冰川滑塌 n=29；HMA n=7
固定 70/30 留出：log10 H = 0.510 + 0.131 log10 V；留出 RMSE=0.41 log10，R²=-0.59（n_test=9）

编目 Angle of reach：n=169，p10=8.7°，中位=16.6°，p90=28.0°
等效 tan(角) 中位=0.298（即 Voellmy μ 的等效量级）
2026-08-26：角=8.85°，μ_eq=0.156，位于编目第 11 百分位
