a
    cOj                     @   s@   d Z ddlZddlZddlmZ ddlmZ dd Z	dd Z
dS )	u   
资产负债表风险信号计算。

包含两类信号：
1. 基于 balance_sheet_snapshot 的快照信号（净资产为负、存贷双高）
2. 基于 financial_reports 资产负债表明细的深度信号（第2层风险信号）
    N)is_financial)	get_valuec                 C   sP   d}t j|| dtid}|d dd |d< |jdd d	d
|d< |g d S )uB   从 balance_sheet_snapshot 计算净资产为负、存贷双高。z
    SELECT code, equity, cash / total_assets AS cash_ratio, asset_liability_ratio
    FROM balance_sheet_snapshot
    WHERE total_assets IS NOT NULL AND total_assets > 0
    codedtypeequityc                 S   s   t | r| dk rdS dS )Nr      pdnotna)x r   3/Users/admin/quant_ocf/ocf/signals/balance_sheet.py<lambda>       z+fetch_balance_sheet_flags.<locals>.<lambda>negative_equity_flagc                 S   s<   t | d r8t | d r8| d dkr8| d dkr8dS dS )NZ
cash_ratioZasset_liability_ratio      ?F   r   r   r	   )rr   r   r   r      s    

r   )axishigh_cash_high_debt_flag)r   r   r   )r
   read_sqlstrapply)connsqldfr   r   r   fetch_balance_sheet_flags   s    
	r   c           5      C   sn  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< g }|dD ]\}}t|d  }	|	sq|	d	 }
||d |
k }tt	|d
 |d }t
|ddg}t
|ddg}t
|dg}t
|dg}t
|dg}t
|dg}t
|dg}t
|dg}t
|dg}t
|dg}t
|ddg}t
|dg}t
|g d}||d |k|d |
k@  }|js|d jd ntd}t |rt |r|dkr|| ntd}t |r
t |r
|dkr
|| ntd}t |r<t |r<|dkr<|| ntd}t |rnt |rn|dkrn|| ntd}t |rt |r|dkr|| ntd} t||||g}!t||st |r|dkrdnd}"t |r|d krdnd}#d}$t||st |r|d!krt|	d"kr|	d# }%||d |%k }&tt	|&d
 |&d }'t
|'dg}(||d |k|d |%k@  })|)js|)d jd ntd}*t |(rt |*r|*dkr|(|* ntd}+t |+r||+d$ krd}$d},t||sXt |rXt |rX|dkrXt |!rX|| d%krX|!| d!krXd},t |rr|d!krrdnd}-d}.t||s>t|	d&kr>d}/|	d'd D ]}0||d |0k }1tt	|1d
 |1d }2t
|2dg}3t
|2g d}4t |3r"t |4r"|4dkr"|3|4 d!kr"|/d7 }/n q,q|/d&kr:dnd}.||||"||#||$|,||-| |.d( qt |S ))uJ   基于 financial_reports 资产负债表明细计算第2层风险信号。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   Zreport_dateN   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'
    Z	item_namevalueu   应收账款u   应收票据及应收账款u   其他应收款u   其他应收款(合计)u   存货u   货币资金u   资产总计u   短期借款u   长期借款u   应付债券u!   一年内到期的非流动负债u   商誉u$   归属于母公司股东权益合计u&   所有者权益(或股东权益)合计u   在建工程)u   固定资产净额u   固定资产及清理合计u   固定资产r   nang      @r   g?g      ?   g?r      )r   ar_to_revenue_ratioar_to_revenue_high_flagother_receivables_ratioother_receivables_high_flaginventory_to_revenue_ratioinventory_to_revenue_high_flag precise_high_cash_high_debt_flaggoodwill_ratiogoodwill_high_flag!construction_to_fixed_asset_ratioconstruction_long_stuck_flag)r
   r   r   astypeintgroupbysorteduniquedictzipr   emptyilocfloatr   npnansumr   lenappend	DataFrame)5r   industry_mapZbs_sqlbsZpl_sqlplresultsr   gyearsZlatest_yearlatestZlatest_dictarZoth_arinvZcashZtotal_assetsZ
short_termZ	long_termZbondsZdue_within_yearZgwr   constructionZfixed_assetZrev_latest_dfZ
rev_latestZar_ratioZoth_ar_ratioZ	inv_ratioZgw_ratioZconstruction_ratioZinterest_debtZar_flagZoth_ar_flagZinv_flag	prev_yearprevZ	prev_dictZinv_prevZrev_prev_dfZrev_prevZinv_ratio_prevZprecise_hchd_flagZgw_flagZconstruction_flagZ	bad_yearsr   subZsub_dictcfr   r   r    fetch_balance_sheet_detail_flags%   s    ""22222*020


rP   )__doc__numpyr<   pandasr
   ocf.core.industryr   Zocf.signals.utilsr   r   rP   r   r   r   r   <module>   s   