import csv, statistics as st, math
rows=list(csv.DictReader(open('czech_rounds_2016_2026_v2.csv',encoding='utf-8')))
assert len(rows)==96 and len({r['company'] for r in rows})==41
HOL={('Roger','2020'),('Lemonero','2022'),('Liftago','2018'),('ThreatMark','2023')}
CZ='Czech lead or co-lead'; AB='led from abroad'; NL='no lead named'
def amt(r):
    try: return float(r['amount_eur_m'])
    except ValueError: return None
assert sum(1 for r in rows if amt(r) is None)==4
assert sum(1 for r in rows if r['lead_origin']==NL)==7
led=[r for r in rows if r['lead_origin'] in (CZ,AB) and amt(r) is not None]
lo=[r for r in led if amt(r)<4]; hi=[r for r in led if amt(r)>=4]
assert (len(lo),sum(r['lead_origin']==CZ for r in lo))==(45,39)
assert (len(hi),sum(r['lead_origin']==AB for r in hi),sum(r['lead_origin']==CZ for r in hi))==(41,34,7)
hi2=[r for r in led if amt(r)>4.0]
assert (len(hi2),sum(r['lead_origin']==AB for r in hi2))==(40,34)
b15=[r for r in rows if amt(r) is not None and amt(r)>=15]
assert len(b15)==16 and all(r['lead_origin']==AB for r in b15)
cz=[r for r in rows if r['lead_origin']==CZ and amt(r) is not None and (r['company'],r['year']) not in HOL]
assert len(cz)==42
a=[amt(r) for r in cz if int(r['year'])<=2022]; b=[amt(r) for r in cz if int(r['year'])>=2023]
print(len(a),round(st.median(a),2),len(b),round(st.median(b),2))
xs=[int(r['year']) for r in cz]; ys=[math.log(amt(r)) for r in cz]
mx=sum(xs)/len(xs); my=sum(ys)/len(ys)
sl=sum((x-mx)*(y-my) for x,y in zip(xs,ys))/sum((x-mx)**2 for x in xs)
r2=sl**2*sum((x-mx)**2 for x in xs)/sum((y-my)**2 for y in ys)
print(round((math.exp(sl)-1)*100,1),round(r2,2))
print('hollow rows',[ (r['company'],r['year'],r['amount_eur_m'],r['lead']) for r in rows if (r['company'],r['year']) in HOL])
print('cz led 4m+',[(r['company'],r['year'],r['amount_eur_m'],r['lead']) for r in hi if r['lead_origin']==CZ])
print('no lead',[(r['company'],r['year']) for r in rows if r['lead_origin']==NL])
print('undisclosed',[(r['company'],r['year']) for r in rows if amt(r) is None])
print('depo',[(r['company'],r['year'],r['lead']) for r in rows if 'DEPO' in r['lead'] or 'DEPO' in r['note']])
print('total disclosed sum',round(sum(amt(r) for r in rows if amt(r)),1))

# sensitivity rows
def trend(sub):
    xs=[int(r['year']) for r in sub]; ys=[math.log(amt(r)) for r in sub]
    mx=sum(xs)/len(xs); my=sum(ys)/len(ys)
    sxx=sum((x-mx)**2 for x in xs); sl=sum((x-mx)*(y-my) for x,y in zip(xs,ys))/sxx
    return len(sub),round((math.exp(sl)-1)*100,1),round(sl**2*sxx/sum((y-my)**2 for y in ys),2)
allcz=[r for r in rows if r['lead_origin']==CZ and amt(r) is not None]
no_neuron=[r for r in cz if not (r['company']=='Neuron Soundware' and r['year']=='2019')]
no_ic=[r for r in no_neuron if not (r['company'] in ('Productboard','Resistant AI') and 'Index' in r['lead'] and int(r['year']) in (2016,2020))]
for name,s in (('posted',cz),('no Neuron',no_neuron),('no Neuron, no Index+Credo',no_ic),('all Czech-led',allcz)):
    print(name,trend(s))
assert trend(cz)==(42,21.4,0.25) and trend(allcz)==(46,20.0,0.20)
