/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:145: 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:146: 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["trigger"] = sf.trigger_plural.where(sf.trigger_plural.notna(), sf.trigger_singular)
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:152: 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_exact"] = np.where(
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:156: 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_year"] = np.where(
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:160: 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_exact"] = sf.dedupe_key_exact.notna() & sf.duplicated("dedupe_key_exact", keep="first")
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:161: 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_suspect"] = (~sf.is_dupe_exact) & sf.dedupe_key_year.notna() & sf.duplicated("dedupe_key_year", keep="first")
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:162: 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["candidate_unique"] = ~(sf.is_dupe_exact | sf.is_dupe_suspect)
/home/ddwsgood/MathModelComp/MathorCup2026/2026_初步评估/B_DeepSeek试解/源码/audit_catalog.py:164: 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:165: 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:187: 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:188: 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)
== sheet diagnostics
  Glacier detachments                raw= 344 events=  27 no_time=   0 merged_ranges=2 merged_cells=5
  Ice avalanches                     raw= 164 events= 163 no_time=   0 merged_ranges=0 merged_cells=0
  Ice-rock avalanches                raw=  91 events=  91 no_time=   0 merged_ranges=0 merged_cells=0
  Rock avalanches                    raw= 469 events= 469 no_time=   0 merged_ranges=0 merged_cells=0
  GLOF triggered by avalanches       raw=  64 events=  64 no_time=   0 merged_ranges=0 merged_cells=0
  GLOF triggered by calving          raw=  38 events=  38 no_time=   0 merged_ranges=0 merged_cells=0

== slope failures
 raw: {'n': 852, 'by_sheet': {'Rock avalanches': 469, 'Ice avalanches': 163, 'Ice-rock avalanches': 91, 'GLOF triggered by avalanches': 64, 'GLOF triggered by calving': 38, 'Glacier detachments': 27}, 'by_mechanism': {'Rock avalanche': 469, 'Ice avalanche': 163, 'Ice-rock avalanche': 91, 'Ice avalanches': 50, 'Glacier terminal calving': 38, 'Glacier detachment': 27, 'Ice-rock avalanches': 14}, 'by_precision': {'day': 377, 'range': 305, 'year': 114, 'other': 54, 'month': 2}, 'hma': 148, 'himalaya': 88}
 cand-unique: {'n': 781, 'by_sheet': {'Rock avalanches': 463, 'Ice avalanches': 162, 'Ice-rock avalanches': 91, 'GLOF triggered by calving': 38, 'Glacier detachments': 27}, 'by_mechanism': {'Rock avalanche': 463, 'Ice avalanche': 162, 'Ice-rock avalanche': 91, 'Glacier terminal calving': 38, 'Glacier detachment': 27}, 'by_precision': {'day': 345, 'range': 291, 'year': 105, 'other': 38, 'month': 2}, 'hma': 120, 'himalaya': 63}
 dup: {'exact_removed': 32, 'suspect_year_only': 39}

== GLOF
 raw: {'n': 376, 'by_sheet': {}, 'by_mechanism': {}, 'by_precision': {'day': 151, 'other': 100, 'range': 98, 'year': 26, 'month': 1}, 'hma': 108, 'himalaya': 74}
 cand-unique: {'n': 376, 'by_sheet': {}, 'by_mechanism': {}, 'by_precision': {'day': 151, 'other': 100, 'range': 98, 'year': 26, 'month': 1}, 'hma': 108, 'himalaya': 74}

============================================================
体积+距离齐全（候选唯一）：
sheet
Glacier detachments      8
Ice avalanches          14
Ice-rock avalanches     21
Rock avalanches        393
留出：log10H=0.510+0.131log10V，RMSE=0.41，R²=-0.59（n_test=9）
角 of reach：n=404，p10=10.5°，中位=19.4°，p90=27.5°
等效 tan： {'p10': 0.185, 'median': 0.352, 'p90': 0.521}
