a
    _sOjZ                     @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddlZddl	Z
ddlZee jjZee jZejdZereeZn*ed d  red d Zned d Zdd	d
dddZdZejejdd dd Ze
jdddZdd Zdd Zdd Zdd Z e
jddd Z!e
jdd!d"Z"e
jdd#d$Z#d%d& Z$e
jdd'd(Z%g d)Z&d*d+ Z'g d,Z(d-d. Z)d/d0 Z*e+d1kre*  dS )2u  
把已有的风控规则计算逻辑从 SQLite 迁移到 41 号 PG。

复用逻辑来源：
- test_db_analysis.py        -> OCF/NI 严格风险分层
- fetch_all_stocks.py        -> financial_summary 汇总、收入现金含量
- fetch_balance_sheet_snapshot.py -> 净资产为负、存贷双高
- fetch_pledge_ratio.py      -> 大股东质押过高
- report_core_profit_analysis.md  -> 主业亏损靠非经常性损益续命

只改数据库连接和写入语句，不改计算口径。
    N)datetime)PathZQUANT_INDUSTRY_CSVcommonzstock_industry.csvz192.168.192.41i8  ZquantZquant_workerZquant123)ZhostZportZdbnameuserZpasswordi z'%(asctime)s [%(levelname)s] %(message)s)levelformatc                   C   s   t jf i tS N)psycopg2Zconnect	PG_CONFIG r   r   2/Users/admin/quant_ocf/ocf/update_risk_flags_pg.pyget_conn5   s    r   )returnc                  C   sN   t jtdtid} g d}d|}| d djj|dd| d	< | g d
 S )NcodeZdtype)u   银行u   证券u   保险u   期货u   信托u   多元金融u   金融u   投资u   租赁u   资管u   基金|industry F)Znais_financial)r   r   r   )pdread_csvINDUSTRY_CSVstrjoinfillnaZcontains)dfZfinance_keywordsZpatr   r   r   load_industry9   s
    
r   c                 C   s   t |s|tk rdS |dk r"dS | dk r.dS t |r<dS |dk rHdS |dk rTdS |dk r`d	S |d
k rldS |dk rxdS dS dS )u6   复用 test_db_analysis.py 的严格版风险分层。u   数据异常-净利润过低r   u   高风险-现金流为负u   未知u	   高风险      ?u   中高风险g?u   中等风险g      ?u   正常      @u   健康u   异常高-需复核N)r   ZisnaNI_THRESHOLD)ocfZniratior   r   r   
risk_levelD   s&    
r"   c                 C   s   |   }|d d}t|| }|d |d  |d< g d}|| }|d dd	lm} | }|j|d
d
dd |d |d| |d | 	  |
  tdt| d dS )uC   复用 fetch_all_stocks.py 的 update_summary 逻辑，针对 PG。zDELETE FROM financial_summaryu  
        SELECT
            code,
            name,
            report_date,
            report_year,
            report_type,
            MAX(CASE WHEN statement_type = 'cashflow' AND item_name = '经营活动产生的现金流量净额' THEN value::double precision END) as ocf,
            MAX(CASE WHEN statement_type = 'profit' AND item_name = '净利润' THEN value::double precision END) as net_profit,
            MAX(CASE WHEN statement_type = 'profit' AND item_name = '营业收入' THEN value::double precision END) as revenue
        FROM financial_reports
        GROUP BY code, name, report_date, report_year, report_type
    r    
net_profitocf_ni_ratio)	r   namereport_datereport_yearZreport_typer    r#   revenuer$   z
        CREATE TEMP TABLE tmp_financial_summary (
            code TEXT, name TEXT, report_date TEXT, report_year INTEGER,
            report_type TEXT, ocf REAL, net_profit REAL, revenue REAL, ocf_ni_ratio REAL
        ) ON COMMIT DROP
    r   )StringIOFz\N)indexZheaderZna_repzCOPY tmp_financial_summary (code, name, report_date, report_year, report_type, ocf, net_profit, revenue, ocf_ni_ratio) FROM STDIN WITH (FORMAT csv, NULL '\N')ar  
        INSERT INTO financial_summary (code, name, report_date, report_year, report_type, ocf, net_profit, revenue, ocf_ni_ratio)
        SELECT code, name, report_date, report_year, report_type, ocf, net_profit, revenue, ocf_ni_ratio
        FROM tmp_financial_summary
        ON CONFLICT (code, report_date) DO UPDATE SET
            name = EXCLUDED.name,
            report_year = EXCLUDED.report_year,
            report_type = EXCLUDED.report_type,
            ocf = EXCLUDED.ocf,
            net_profit = EXCLUDED.net_profit,
            revenue = EXCLUDED.revenue,
            ocf_ni_ratio = EXCLUDED.ocf_ni_ratio
    u   financial_summary 已刷新：u    条N)cursorexecuter   read_sqlior)   Zto_csvseekZcopy_expertcommitcloselogginginfolen)conncurZsqlr   Zcolsr)   Zbufr   r   r   refresh_financial_summary\   s(    



r7   c              
      s  t jd| dtid}t|d }t jd| dtid}||d |  }|d tjdd t|d< g }|dD ]\}}|	d}|d 
 }||d |d	 k }t|d	k rqz|d
  }	|d  }
|
dkr|	|
 ntd}|||	|
t|||jd d d qzt |}|jr2td dS |d tjtj gtj|d< d|d< d|j|d dk|d dk@ |d dk@ df< d|j|d dk|d dk@ |d dk@ |d dk @ df< d|j|d dk|d dkB |d dk|d dk@ |d dk @ B df< ||d dk }||d dk }||d dk }|    d t d fdd}||d ||d ||d |      t d t| d!t| d"t|  t|t|t|fS )#uG   基于 financial_summary 计算 OCF/NI 健康/观察/不健康信号。zSELECT code FROM stock_infor   r   z
        SELECT code, report_date, ocf, net_profit
        FROM financial_summary
        WHERE report_date LIKE '%1231' AND ocf IS NOT NULL AND net_profit IS NOT NULL
    r&   N   r'      r    r#   r   nan)r   ocf_cumnp_cumyearsr$   r&   u(   未找到足够年报数据计算 OCF/NI)r   r   r   r$   r   signal_typeZocf_ni_healthyr=   r<      Zocf_ni_watchr   Zocf_ni_unhealthyzbDELETE FROM risk_flags WHERE signal_type IN ('ocf_ni_healthy', 'ocf_ni_watch', 'ocf_ni_unhealthy')%Y-%m-%d %H:%M:%Sc              
      sT   g }|   D ]2\}}||d |t|d d t|d f q|rP d| d S )Nr   r$   r&     
                INSERT INTO risk_flags (code, signal_type, value, threshold, report_date, flagged_at)
                VALUES (%s, %s, %s, %s, %s, %s)
                ON CONFLICT (code, signal_type, report_date) DO UPDATE SET
                    value = EXCLUDED.value,
                    threshold = EXCLUDED.threshold,
                    flagged_at = EXCLUDED.flagged_at
            )iterrowsappendfloatr   executemany)Zsubdfr?   rows_rowr6   nowr   r   insert_batch   s    ,z)update_ocf_ni_flags.<locals>.insert_batchu    OCF/NI 信号已更新：健康 u
   ，观察 u   ，不健康 )!r   r-   r   setisincopyastypeintgroupbysort_valuesmaxr4   sumrE   rD   iloc	DataFrameemptyr2   warningreplacenpinfr:   locr+   r,   r   rK   strftimer0   r1   r3   )r5   Z
stock_infoZvalid_codesr   resultsr   glatest_yearZrecentr<   r=   r!   summaryhealthywatch	unhealthyrL   r   rJ   r   update_ocf_ni_flags   s    "

	

 "

	"



(rf   c                    s   t jd| dtid}t jd| dtid}t j||ddgdd}|d |d	  |d
< ||d	 dk|d
 dk @   }|  }|d t 	d  fdd|
 D }|r|d| |   |  tdt| d t|S )uB   复用 fetch_all_stocks.py 的 update_cash_revenue_flags 逻辑。u'  
        SELECT DISTINCT ON (code) code, report_date, value::double precision AS sales_cash
        FROM financial_reports
        WHERE statement_type='cashflow' AND item_name='销售商品、提供劳务收到的现金' AND report_date LIKE '%1231'
        ORDER BY code, report_date DESC
    r   r   u  
        SELECT DISTINCT ON (code) code, report_date, value::double precision AS revenue
        FROM financial_reports
        WHERE statement_type='profit' AND item_name='营业收入' AND report_date LIKE '%1231'
        ORDER BY code, report_date DESC
    r&   ZinnerZonZhowZ
sales_cashr(   r!   r   gffffff?z@DELETE FROM risk_flags WHERE signal_type = 'cash_to_revenue_low'rA   c                    s0   g | ](\}}|d  dt |d d|d  fqS )r   Zcash_to_revenue_lowr!   z<0.7r&   rE   .0rH   rI   rK   r   r   
<listcomp>  s   z-update_cash_revenue_flags.<locals>.<listcomp>g  
            INSERT INTO risk_flags (code, signal_type, value, threshold, report_date, flagged_at)
            VALUES (%s, %s, %s, %s, %s, %s)
            ON CONFLICT (code, signal_type, report_date) DO UPDATE SET
                value = EXCLUDED.value,
                threshold = EXCLUDED.threshold,
                flagged_at = EXCLUDED.flagged_at
        u$   收入现金含量信号已更新：    只)r   r-   r   mergerO   r+   r,   r   rK   r^   rC   rF   r0   r1   r2   r3   r4   )r5   Zsalesr(   Zmergedr6   rG   r   rk   r   update_cash_revenue_flags   s.     

rp   )industry_dfc                    s  t jd| dtid}t|j|d  df }|  }|d t 	d ||d dk  
 } fd	d
| D }|r|d| ||d ||d  @ |d dk@ |d  @ |d |d  dk@ |d dk@  
 }g }| D ]B\}	}
t|
d |
d  }||
d d|dt|
dd f q|rB|d| |   |  tdt| dt|  t|t|fS )uZ   复用 fetch_balance_sheet_snapshot.py 的 negative_equity / high_cash_high_debt 逻辑。z$SELECT * FROM balance_sheet_snapshotr   r   r   zVDELETE FROM risk_flags WHERE signal_type IN ('negative_equity', 'high_cash_high_debt')rA   equityr   c                    s8   g | ]0\}}|d  dt |d dt|dd fqS )r   Znegative_equityrr   z<0announce_dater   rE   r   getri   rk   r   r   rl   !  s   z.update_balance_sheet_flags.<locals>.<listcomp>rm   total_assetscash      ?Zasset_liability_ratioF   Zhigh_cash_high_debtzcash>25%,lev>70%rs   r   u1   资产负债表信号已更新：净资产为负 u   ，存贷双高 )r   r-   r   rM   r]   r+   r,   r   rK   r^   rO   rC   rF   rN   notnarE   rD   ru   r0   r1   r2   r3   r4   )r5   rq   bsnon_finance_codesr6   negZrows_neghchdZ	rows_hchdrH   rI   r!   r   rk   r   update_balance_sheet_flags  sL    






(	r   c           9         s  t |j|d  df }d}tj|| dtid}|d tjdd t|d< d	}tj|| dtid}|d tjdd t|d< d
d }g }|dD ]\}	}
|	|vrq|
d  }|
|
d |k }t	t
|d |d }||ddg}||d |	k|d |k@  }|js&|d jd ntj}t|rt|r|dkr|| dkr||	| dt|| d qg }|dD ]\}	}
|
d  }|
|
d |k }t	t
|d |d }||ddg}||dg}t|rt|r|dkr|| dkr||	| dt|| d qg }|dD ]\}	}
|	|vrRq:t|
d  }t|dk rtq:|d }|d }|
|
d |k }|
|
d |k }t	t
|d |d }t	t
|d |d }||dg}||dg}||d |	k|d |k@  }||d |	k|d |k@  }|js6|d jd ntj}|jsR|d jd ntj}t|r:t|r:|dkr:|| }t|rt|r|dkr|| ntj} |dkr:t| r:|| d kr:||	| dt|d q:g }!|dD ]\}	}
|	|vrq|
d  }|
|
d |k }t	t
|d |d }||dg}"||dg}||dg}#||d g}$||d!g}%||d"g}&t|#|$|%|&g}'t|"rt|r|dkrt|'r|"| d#kr|'| dkr|!|	| dt|'| d qg }(|dD ]\}	}
|
d  }|
|
d |k }t	t
|d |d }||d$g})||d%d&g}*t|)r$t|*r$|*dkr$|)|* dkr$|(|	| dt|)|* d q$g }+|dD ]\}	}
|	|vrqt|
d  d'd(}t|d)k rqd},|d }-|dd) D ]}.|
|
d |.k }/t	t
|/d |/d }0||0d*g}1||0g d+}2t|1rt|2r|1dkr|2dkr|1|2 dkr|,d,7 },n qq0|,d)kr|+|	|- dt|,d qd-|d.fd/|d0fd1|d2fd3|!d4fd5|(d6fd7|+d8fg}3|  }4d9d: |3D }5|4d;d<d=gt|5  d>|5 t d? |3D ]4\}6 fd@d:|6D }7|7rl|4dA|7 ql|   |4  dBdC |3D }8t dD|8  |8S )Eun  
    基于 financial_reports 资产负债表明细，计算第2层风险信号：
    - 应收账款 / 营业收入比例过高
    - 其他应收款 / 总资产比例过高
    - 存货 / 营业收入比例异常上升
    - 精确存贷双高（有息负债率高 + 货币资金率高）
    - 商誉 / 净资产比例过高
    - 在建工程长期不转固
    r   r   z
        SELECT code, report_date, item_name, value::double precision AS value
        FROM financial_reports
        WHERE statement_type='balance_sheet' AND report_date LIKE '%1231'
    r   r&   Nr8   yearu   
        SELECT code, report_date, item_name, value::double precision AS value
        FROM financial_reports
        WHERE statement_type='profit' AND item_name='营业收入' AND report_date LIKE '%1231'
    c                 S   s2   |D ]&}|| v rt | | r| |   S qtjS r   )r   rz   r[   r:   )Zrow_dictkeyskr   r   r   	get_valueh  s    z4update_balance_sheet_detail_flags.<locals>.get_value	item_namevalueu   应收账款u   应收票据及应收账款r   r   1231r   r&   r   u   其他应收款u   其他应收款(合计)u   资产总计g?   r;   u   存货r   g?u   货币资金u   短期借款u   长期借款u   应付债券u!   一年内到期的非流动负债rx   u   商誉$   归属于母公司股东权益合计&   所有者权益(或股东权益)合计T)reverse   u   在建工程)u   固定资产净额u   固定资产及清理合计u   固定资产r@   Zar_to_revenue_highz>3.0Zother_receivables_highz>0.05Zinventory_to_revenue_highu   >0.5 & 同比升30%Zprecise_high_cash_high_debtzcash>25%,interest_debt>50%Zgoodwill_highz>0.5Zconstruction_long_stucku   >0.5 持续3年c                 S   s   g | ]}|d  qS )r   r   rj   sr   r   r   rl         z5update_balance_sheet_detail_flags.<locals>.<listcomp>z-DELETE FROM risk_flags WHERE signal_type IN (,z%s)rA   c                    s,   g | ]$}|d  t |d |d  fqS )r   r   r&   rh   rj   rrK   r?   Z	thresholdr   r   rl     r   rB   c                 S   s   i | ]}|d  t |d qS )r   r@   )r4   r   r   r   r   
<dictcomp>  r   z5update_balance_sheet_detail_flags.<locals>.<dictcomp>u'   资产负债表明细信号已更新：)!rM   r]   r   r-   r   rP   rQ   rR   rT   dictziprX   rV   r[   r:   rz   rD   rE   sortedZuniquer4   Znansumr+   r,   r   r   rK   r^   rF   r0   r1   r2   r3   )9r5   rq   r|   bs_sqlr{   Zpl_sqlZplr   Z
ar_resultsr   r`   ra   latestlatest_dictZarZrev_dfZrevZoth_ar_resultsZoth_arrv   Zinv_resultsr>   Z	prev_yearZprevZ	prev_dictZ
inv_latestZinv_prevZrev_latest_dfZrev_prev_dfZ
rev_latestZrev_prevZratio_latestZ
ratio_prevZprecise_hchd_resultsrw   Z
short_termZ	long_termZbondsZdue_within_yearZinterest_debtZ
gw_resultsZgwrr   Zconstruction_resultsZ	bad_yearsr'   r   ZsubZsub_dictZconstructionZfixed_assetZ
signal_mapr6   Zsignal_typesr_   rG   Zcountsr   r   r   !update_balance_sheet_detail_flagsI  s6   
""(

0

"0$
"


0





	$	r   c                    s~  t |j|d  df }d}tj|| dtid}|d tjdd t|d< g }|dD ]\}}||vrrq`|d  }||d |k }	t	t
|	d	 |	d
 }
|
d}|
dp|
d}t|r`t|r`|dkr`|| }|dkr`||| dt|d q`|  }|d t d  fdd|D }|rP|d| |   |  tdt| d t|S )u   
    长期股权投资占净资产过高：
    非金融公司，最新年报 长期股权投资 / 归母净资产 ≥ 40% → 风险
    r   r   u@  
        SELECT code, report_date, item_name, value::double precision AS value
        FROM financial_reports
        WHERE statement_type='balance_sheet' AND report_date LIKE '%1231'
          AND item_name IN ('长期股权投资', '归属于母公司股东权益合计', '所有者权益(或股东权益)合计')
    r   r&   Nr8   r   r   r   u   长期股权投资r   r   r   g?r   r   z:DELETE FROM risk_flags WHERE signal_type = 'long_inv_high'rA   c                    s,   g | ]$}|d  dt |d d|d  fqS )r   Zlong_inv_highr   z>=0.4r&   rh   r   rk   r   r   rl   6  r   z)update_long_inv_flags.<locals>.<listcomp>rm   u$   长期股权投资信号已更新：rn   )rM   r]   r   r-   r   rP   rQ   rR   rT   r   r   ru   rz   rD   rE   r+   r,   r   rK   r^   rF   r0   r1   r2   r3   r4   )r5   rq   r|   r   r{   r_   r   r`   ra   r   r   long_invrr   r!   r6   rG   r   rk   r   update_long_inv_flags  sB    "


r   c                    s   t jd| dtid}||d dk  }|  }|d t d  fdd	|	 D }|rn|
d
| |   |  tdt| d t|S )u6   复用 fetch_pledge_ratio.py 的 pledge_high 逻辑。zSELECT * FROM pledge_ratior   r   pledge_ratio2   z8DELETE FROM risk_flags WHERE signal_type = 'pledge_high'rA   c                    s8   g | ]0\}}|d  dt |d dt|dd fqS )r   Zpledge_highr   z>=50%Z
trade_dater   rt   ri   rk   r   r   rl   N  s   z'update_pledge_flags.<locals>.<listcomp>rm   u   质押信号已更新：rn   )r   r-   r   rO   r+   r,   r   rK   r^   rC   rF   r0   r1   r2   r3   r4   )r5   pledgeZhighr6   rG   r   rk   r   update_pledge_flagsF  s     

r   c              	   C   s  g d}d |}tjd| d| dtid}|jrBtd dS |jdd	gd
ddd }|D ]4}||j	vrxd||< q`tj
|| ddd||< q`|d |d  |d  |d  |d  |d< |d |d  |d< |d	 tjdd t|d< |d dk|d dk@ |d< g }|dD ]t\}}|d}d}	d}
|d D ]$}|rb|	d7 }	t|
|	}
nd}	qD|
dkr"|jd d }||||
d  q"t|}|jrd}n@|j|dd!g dd"d#}|d! d$|d!< ||d!   }t|}|  }|d% t d&}|dkrrg }| D ]>\}}t|d'  d(}||d d)t|d* d+||f q&|d,| |   |  t d-| d. |S )/u   
    复用 report_core_profit_analysis.md 规则：
    非金融公司，连续 3 年年报满足：利润总额 > 0 且 经常性利润 <= 0
    )   利润总额   营业外收入   其他收益   投资收益   资产处置收益   营业外支出z','z
        SELECT code, report_date, item_name, value::double precision AS value
        FROM financial_reports
        WHERE statement_type = 'profit'
          AND item_name IN ('z.')
          AND report_date LIKE '%1231'
    r   r   u;   未找到利润表数据，跳过 core_profit_unsustainabler   r&   r   r   Zfirst)r*   columnsvaluesZaggfuncg        Zcoerce)errorsr   r   r   r   r   Znon_recurring_netr   Zrecurring_profitNr8   r   Zis_badr@   r   r;   )r   ra   
max_streakr   leftrg   FzFDELETE FROM risk_flags WHERE signal_type = 'core_profit_unsustainable'rA   ra   r   Zcore_profit_unsustainabler   z>=3rm   u3   主业亏损靠非经常性损益信号已更新：rn   )!r   r   r-   r   rX   r2   rY   Zpivot_tableZreset_indexr   Z
to_numericr   rP   rQ   rR   rS   rT   rV   rD   rW   ro   r4   r+   r,   r   rK   r^   rC   rE   rF   r0   r1   r3   )r5   rq   Z
item_namesZ	codes_sqlr   Zcolr_   r   r`   Zstreakr   Zflagra   Zres_dfZcntr6   rK   rG   rH   rI   r&   r   r   r    update_core_profit_unsustainable_  sn    



&"




&r   )/Z603313Z000785Z301085Z600881Z002742Z300377Z600076Z300598Z603800Z000926Z300551Z603322Z603567Z002519Z000561Z603387Z002622000567Z300209Z605388Z300078Z301259300500Z002368Z300513Z603887Z000520Z000818Z300250Z002229Z300937Z603038Z600363Z301296Z002875Z002031Z000546Z300878Z688573Z300518Z002023Z000656Z603255Z688159Z300163Z002520Z600110c                    s   t d d }| r<tj|dtid}|d   }d}nt}d}|  }|	d t
 d  fd	d
|D }|r|d| |   |  tdt| d| d t|S )u   
    写入非标审计意见风险信号。
    优先读取 ocf/data/non_standard_audit_stocks.csv，文件不存在时使用内置名单。
    dataznon_standard_audit_stocks.csvr   r   csvbuiltinz?DELETE FROM risk_flags WHERE signal_type = 'audit_non_standard'rA   c                    s   g | ]}|d ddd fqS )Zaudit_non_standard      ?u   保留意见20241231r   rj   r   rk   r   r   rl     r   z.update_audit_opinion_flags.<locals>.<listcomp>rm   u$   非标审计意见信号已更新：    只（来源：   ）)OCF_DIRexistsr   r   r   drop_duplicatestolistNON_STANDARD_AUDIT_CODESr+   r,   r   rK   r^   rF   r0   r1   r2   r3   r4   r5   Zcsv_pathr   Zcodessourcer6   rG   r   rk   r   update_audit_opinion_flags  s&    
	r   )3Z603169Z601162Z300111r   Z002855Z600481Z300169Z002759r   Z300670Z300703Z300071Z603273Z601208Z300200Z002420Z300941Z300587Z603421Z605255Z600348Z600281Z601319Z600157Z300201Z600338Z603717Z300796Z002290Z603160Z603200Z300243Z603067Z300109Z603018Z603353Z002943Z600067Z002273Z000863Z000900Z000034Z000876Z601696Z600926Z300070Z002878Z603222Z300032Z002984Z300437c                    s   t d d }| r<tj|dtid}|d   }d}nt}d}|  }|	d t
 d  fd	d
|D }|r|d| |   |  tdt| d| d t|S )u   
    写入被立案调查风险信号。
    优先读取 ocf/data/regulatory_investigation_stocks.csv，文件不存在时使用内置名单。
    r   z#regulatory_investigation_stocks.csvr   r   r   r   zEDELETE FROM risk_flags WHERE signal_type = 'regulatory_investigation'rA   c                    s   g | ]}|d ddd fqS )Zregulatory_investigationr   u   被监管机构立案调查r   r   r   rk   r   r   rl      r   z9update_regulatory_investigation_flags.<locals>.<listcomp>rm   u   立案调查信号已更新：r   r   )r   r   r   r   r   r   r   REGULATORY_INVESTIGATION_CODESr+   r,   r   rK   r^   rF   r0   r1   r2   r3   r4   r   r   rk   r   %update_regulatory_investigation_flags  s&    
	r   c                  C   s   t d t d t d t } t }t| \}}}t| }t| |\}}t| |}t| |}	t	| }
t
| |}t| }t| }t d t d t d td| }t d|jdd  |   t d d S )	Nz<============================================================u#   开始刷新 41 号 PG 风险信号u   风险信号汇总zZSELECT signal_type, COUNT(*) AS cnt FROM risk_flags GROUP BY signal_type ORDER BY cnt DESC
F)r*   u   完成)r2   r3   r   r   rf   rp   r   r   r   r   r   r   r   r   r-   Z	to_stringr1   )r5   rq   rc   rd   re   Zcash_lowr}   r~   Zdetail_countsr   r   ZcoreauditZ
regulatoryrb   r   r   r   main  s0    








r   __main__),__doc__ostimer2   r   pathlibr   Znumpyr[   Zpandasr   r	   __file__ZresolveparentZBASEr   environru   Z_industry_envr   r   r
   r   ZbasicConfigZINFOr   rW   r   r"   r7   rf   rp   r   r   r   r   r   r   r   r   r   r   __name__r   r   r   r   <module>   s\   
8['3 I5R&#4
