"""Reproduce October2026 selected-announcement statistics from the adjacent frozen public JSON. Python3 stdlib only."""
import argparse,collections,json,hashlib
from pathlib import Path
from decimal import Decimal

def analyze(data):
 rows=data['rows'];assert len(rows)==len({r['record_id']for r in rows});assert all(r['announcement_date'].startswith('2026-10')for r in rows)
 yes=lambda v:v is True or str(v)=='1'
 eligible=lambda r:yes(r['eligible_for_totals'])
 money=lambda r:int(Decimal(r['amount_usd'])*100)if eligible(r)else 0
 company=[r for r in rows if r['transaction_type']!='ai_fund_close'];funds=[r for r in rows if r['transaction_type']=='ai_fund_close'];assert len({(r['company_id'],r['announcement_date'])for r in company})==len(company),'Distinct same-date components need explicit grouping before analysis.'
 def total(rr):return {'events':len(rr),'eligible_disclosed_events':sum(eligible(r)for r in rr),'eligible_usd_cents':sum(money(r)for r in rr),'unknown_exact_events':sum(r['amount_disclosure']!='disclosed'for r in rr),'disclosed_ineligible_events':sum(r['amount_disclosure']=='disclosed'and not eligible(r)for r in rr),'record_ids':[r['record_id']for r in rr]}
 values=sorted(money(r)for r in company if eligible(r))
 def quantile(p):
  if not values:return None
  pos=Decimal(len(values)-1)*Decimal(p);low=int(pos);high=min(low+1,len(values)-1);return str(Decimal(values[low])+(Decimal(values[high])-Decimal(values[low]))*(pos-low))
 eq=[r for r in company if r['transaction_type']in['priced_equity','unpriced_equity']];mega=[r for r in company if yes(r['mega_round'])];exmega=[r for r in company if not yes(r['mega_round'])]
 bands={name:total([r for r in company if eligible(r)and money(r)>=lo and(hi is None or money(r)<hi)])for name,lo,hi in [('under_1m',0,100000000),('1m_to_under_10m',100000000,1000000000),('10m_to_under_100m',1000000000,10000000000),('100m_and_over',10000000000,None)]}
 bands['unknown_exact_known_mega']=total([r for r in company if not eligible(r)and r['amount_disclosure']!='disclosed'and yes(r['mega_round'])]);bands['unknown_exact_and_size']=total([r for r in company if not eligible(r)and r['amount_disclosure']!='disclosed'and not yes(r['mega_round'])]);bands['disclosed_ineligible']=total([r for r in company if not eligible(r)and r['amount_disclosure']=='disclosed']);assert sum(x['events']for x in bands.values())==len(company)
 groups=lambda key,rr:{x:total([r for r in rr if r[key]==x])for x in sorted({r[key]for r in rr})}
 region_map={'US':'US/Canada','CA':'US/Canada','CN':'China','CH':'Europe','GB':'Europe','LU':'Europe','NO':'Europe','RO':'Europe','SE':'Europe','IN':'India','KR':'Other Asia-Pacific','SG':'Other Asia-Pacific','NZ':'Other Asia-Pacific','NG':'Africa','AE':'Middle East','KW':'Middle East','BR':'Latin America','XX':'Unknown'}
 region_for=lambda r:region_map[r['hq_country']]
 regions=sorted(set(region_map.values()))
 out={'schema':'kcfm-monthly-analysis/3','dataset_version':data['dataset_version'],'month':'2026-10','source_generation':data['source_generation'],'snapshot_status':data['snapshot_status'],'selected_records':len(rows),'statistical_unit':'one selected company financing announcement per company/date; no same-date component splits in this October snapshot','company':total(company),'default_explicit_equity_equitylike':total(eq),'default_explicit_equity_equitylike_ex_mega':total([r for r in eq if not yes(r['mega_round'])]),'funds':total(funds),'known_mega_announcements':total(mega),'company_ex_mega':total(exmega),'eligible_mega_count':sum(eligible(r)for r in mega),'mega_share_percent':str((Decimal(sum(money(r)for r in mega))/sum(money(r)for r in company)*100).quantize(Decimal('.1'))),'disclosed_distribution_n':len(values),'median_cents':quantile('.5'),'quartiles_type7_cents':[quantile('.25'),quantile('.5'),quantile('.75')],'size_bands':bands,'instruments':groups('transaction_type',company),'primary_ai_layers':groups('primary_ai_layer',company),'ex_mega_layers':groups('primary_ai_layer',exmega),'hq_country':groups('hq_country',company),'ex_mega_hq_country':groups('hq_country',exmega),'hq_regions':{region:total([r for r in company if region_for(r)==region])for region in regions},'ex_mega_hq_regions':{region:total([r for r in exmega if region_for(r)==region])for region in regions},'hq_region_mapping_rule':'One sourceHQcountry per event. US/CA US-Canada; CNChina; CH/GB/LU/NO/RO/SE Europe; INIndia; KR/SG/NZ OtherAsiaPacific; NGAfrica; AE/KW MiddleEast; BRLatinAmerica; XXUnknown. HQ isnotspendingdestination.','stage_counts':groups('normalized_stage',company),'eligible_below_10m':total([r for r in company if eligible(r)and money(r)<1000000000]),'smallest_disclosed_ids':[r['record_id']for r in sorted([r for r in company if eligible(r)],key=money)[:12]],'largest_disclosed_ids':[r['record_id']for r in sorted([r for r in company if eligible(r)],key=money,reverse=True)[:12]],'coverage':data['coverage'],'limitations':data['methodology']};return out
if __name__=='__main__':
 p=argparse.ArgumentParser();p.add_argument('--input',type=Path,default=Path(__file__).with_name('october-dataset.json'));p.add_argument('--output',type=Path,default=Path(__file__).with_name('analysis-reproduced.json'));a=p.parse_args();raw=a.input.read_bytes();out=analyze(json.loads(raw));out['dataset_sha256']=hashlib.sha256(raw).hexdigest();a.output.write_text(json.dumps(out,ensure_ascii=False,indent=2)+'\n');print(json.dumps({k:out[k]for k in['selected_records','company','default_explicit_equity_equitylike','company_ex_mega','eligible_mega_count','mega_share_percent','median_cents','quartiles_type7_cents']},indent=2))
