a
    l#Ojm%                     @   s:   d Z ddlZddlZdd Zdd Zdd Zdd	d
ZdS )u.  
财报质量风险信号（豆包高确定性规则）。

从豆包 36 条量化规则中筛选出 8 条数据可得、确定性较高的信号，
单独作为 layer6（豆包风控层）。

8 条信号：
1. 应收增速持续大幅超过营收增速
2. 长期股权投资占净资产过高（当前数据库缺少该明细，暂按 0 处理并留痕）
3. 连续 2 年流动比率 < 1
4. 现金比率极低
5. 连续 3 年经营现金流 < 0
6. 有息负债持续大幅扩张
7. 核心资产持续剥离出售
8. 大额商誉一次性全额计提减值
    Nc                 C   s0   t |dkt| @ t|@ | | | t jS )u-   计算同比增速，基期 <=0 返回 nan。r   )npwherepdnotnanan)curprev r	   </tmp/quant_ocf_run_20260709/ocf/signals/financial_quality.py
_yoy_ratio   s    r   c                 C   sZ   | j r
dS || t}| dkr(dS d}d}|D ] }|rP|d7 }t||}q4d}q4|S )u/   计算满足 condition 的最大连续年数。r      )emptyastypeintsummax)series	conditionmask
max_streakstreakvr	   r	   r
   _max_consecutive   s    r   c                 C   s   | j rtjddgt| dS | | d |  } | djg ddd} | jddgdddd	}|D ]}||j	vrft
j||< qf| S )
ui   把长格式财报明细 pivot 成宽格式，并对同一 code+year 的重复项取第一个非空值。codeyearcolumns	item_namevalue)r   r   r   first)keep)indexr   valuesaggfunc)r   r   	DataFramelistisincopysort_valuesdrop_duplicatespivot_tabler   r   r   reset_index)dfZ
item_namesZwidecolr	   r	   r
   _pivot_statement-   s    
r.   c           "      C   s  g d}dd dd |D  d}tj|| dtid}|d	 tjd
d t|d< g d}dd dd |D  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< t||}
|
d |
d |
d< |
d |
d |
d< |
d d|
d d |
d d |
d d |
d< t||}|d d|d d |d< |d  |d! |d"< t|	d#g}|jd#d$id%}|
j	|ddgd&d'}|j	|ddgd&d'}|
ddg}t|d |dd d(|d)< t|d* |dd* d(|d+< |d) |d+  |d,< t|d- dk|d. |d-  tj|d/< t|d- dk|d0 |d-  tj|d1< t|d |dd d(|d2< t|d3 dk|d |d3  tj|d4< |dd5 d(|d5  |d6< |dd" d(|d7< g }|dD ]\}}|
d}|jd8 }t|d, d9d: }t|d;kot|d$ o|d$ dk }tj}d}d}t|d;krt|jd8 d/ r|jd8 d/ d<k rt|jd= d/ r|jd= d/ d<k rd(}tt|d1 o|d1 d>k }t|d$ d?d: }t|d@k}d}t|d@kr|jd8 d2 }|jd= d2 }|jd8 d+ }t|r|dAkrt|r|dAkrt|r|dBk rd(}d}t|d;kr|jd=d
 d4 }|dCk rd(}d} |jd8 }!t|!d6 rD|!d6 dkrDt|!d7 rD|!d6 t|!d7 krDd(} ||||||d(t|d/ rl|d/ ntj|t|d1 r|d1 ntj|||||t|!d6 r|!d6 ntj| dD q*t|S )Eu'   计算 8 条财报质量风险信号。)   应收账款   应收票据及应收账款   流动资产合计   流动负债合计   货币资金   短期借款   长期借款   应付债券!   一年内到期的非流动负债   商誉$   归属于母公司股东权益合计&   所有者权益(或股东权益)合计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'
      AND item_name IN (z, c                 S   s   g | ]}d | d qS 'r	   .0xr	   r	   r
   
<listcomp>I       z1fetch_financial_quality_flags.<locals>.<listcomp>z)
    r   )dtypereport_dateN   r   )   营业收入   利润总额   资产处置收益   投资收益'   归属于母公司所有者的净利润   归属于母公司的净利润z
    SELECT code, report_date, item_name, value::double precision AS value
    FROM financial_reports
    WHERE statement_type='profit' AND report_date LIKE '%1231'
      AND item_name IN (c                 S   s   g | ]}d | d qS r;   r	   r=   r	   r	   r
   r@   T   rA   u   
    SELECT code, report_date, item_name, value::double precision AS value
    FROM financial_reports
    WHERE statement_type='cashflow' AND item_name='经营活动产生的现金流量净额' AND report_date LIKE '%1231'
    r/   r0   arr9   r:   equityr4   r   r5   r6   r7   interest_debtrG   rH   Zdispose_gainrI   rJ   Znet_profit_parentu'   经营活动产生的现金流量净额ocfr   outer)onhowr   Zar_yoyrE   Zrev_yoyZar_rev_diffr2   r1   Zcurrent_ratior3   
cash_ratioZdebt_yoyrF   Zdispose_profit_ratior8   goodwill_impair_proxyZnet_profit_prevc                 S   s   | dkS )N333333?r	   sr	   r	   r
   <lambda>   rA   z/fetch_financial_quality_flags.<locals>.<lambda>   g      ?g?c                 S   s   t | | dk @ S )Nr   )r   r   rV   r	   r	   r
   rX      rA      rU   g?g      ?)r   ar_growth_over_rev_flagar_growth_over_rev_yearslong_inv_ratiolong_inv_high_flaglong_inv_data_missing_flagcurrent_ratio_latestcurrent_ratio_low_flagcash_ratio_latestcash_ratio_low_flagocf_negative_consec_flagocf_negative_yearsdebt_expand_flagcore_asset_sell_flagrS   goodwill_one_time_impair_flag)joinr   read_sqlstrr   r   r.   fillnarenamemerger(   r   groupbyshiftr   r   r   ilocr   r   lenallabsappendr$   )"connindustry_mapZbs_itemsbs_sqlbsZpl_itemspl_sqlplZcf_sqlcfZbs_wideZpl_wideZcf_widemergedresultsr   glatestr]   r\   r^   r_   rb   rd   rf   re   rg   Zlatest_debt_yoyZprev_debt_yoyZlatest_rev_yoyrh   Zratiosri   Z
impair_rowr	   r	   r
   fetch_financial_quality_flags:   s   """

 """ 





r   )N)	__doc__numpyr   pandasr   r   r   r.   r   r	   r	   r	   r
   <module>   s   