o
    i!2                     @   s  d Z ddlZejZeedd dkseedd dkr&ddlmZ nddl	mZ ddl
mZ ddlZddl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
mZ z
ddlmZmZ W n eys   ddlmZmZ Y nw d#ddZd$ddZ dddde! fddZ"d$ddZ#dddde! fddZ$d$ddZ%dddde! fddZ&d%ddZ'ddde! fdd Z(d!d" Z)dS )&uk   
龙虎榜数据
Created on 2015年6月10日
@author: Jimmy Liu
@group : waditu
@contact: jimmysoa@sina.cn
    N.      )StringIO)cons)etree)dateu)ref_vars)urlopenRequest   MbP?c           	      C   s.  | du rt  dk rt  } nt  } nt | rdS t|D ]}t| ztt	j
tjd tjd | | f }t|dd }|d}|dd	 }t|td
tftdd d }t|}t|}tj|d t	jd}t	j|_|d}|dd}|d t |d< |d t |d< |d t |d< |d t |d< |d |d  |d< |d |d  |d< |d !tj"|d< |d !tj"|d< | |d< dD ]}|| t ||< || d ||< || !tj"||< q|j#dd	d}W |  S  t$y } z
t%| W Y d}~qd}~ww t&tj')u  
    获取每日龙虎榜列表
    Parameters
    --------
    date:string
                明细数据日期 format：YYYY-MM-DD 如果为空，返回最近一个交易日的数据
    retry_count : int, 默认 3
                 如遇网络等问题重复执行的次数 
    pause : int, 默认 0
                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题
    
    Return
    ------
    DataFrame
        code：代码
        name ：名称
        pchange：涨跌幅     
        amount：龙虎榜成交额(万)
        buy：买入额(万)
        bratio：占总成交比例
        sell：卖出额(万)
        sratio ：占总成交比例
        reason：上榜原因
        date  ：日期
    N   httpem
   timeoutGBKz_1=r   Dummyc                 S   s   |S )N )snr   r   J/opt/alphahud/venv/lib/python3.10/site-packages/tushare/stock/billboard.py<lambda>J   s    ztop_list.<locals>.<lambda>)__getitem__data)columnsr    buysellamountTurnoverbratiosratiodate)r!   r   r    i'  axis)(duget_hourlast_tddatetoday
is_holidayrangetimesleepr   rvLHB_URLctP_TYPEDOMAINSr
   readdecodesplitevaltypedictjsondumpsloadspd	DataFrameLHB_TMP_COLSLHB_COLSr   fillnareplaceastypefloatmapFORMATdrop	ExceptionprintIOErrorNETWORK_URL_ERROR_MSG)	r%   retry_countpause_requesttextdfcoler   r   r   top_list    sT   



"




rU      c                 C   sV   t | du r)t   t| d||d}|dur'|d dd |d< |d}|S dS )u  
    获取个股上榜统计数据
    Parameters
    --------
        days:int
                  天数，统计n天以来上榜次数，默认为5天，其余是10、30、60
        retry_count : int, 默认 3
                     如遇网络等问题重复执行的次数 
        pause : int, 默认 0
                    重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题
    Return
    ------
    DataFrame
        code：代码
        name：名称
        count：上榜次数
        bamount：累积购买额(万)     
        samount：累积卖出额(万)
        net：净额(万)
        bcount：买入席位数
        scount：卖出席位数
    Tr   pageNorM   rN   Ncodec                 S      t | dS N   strzfillxr   r   r   r          zcap_tops.<locals>.<lambda>)r2   _check_lhb_input_write_head	_cap_topsrF   drop_duplicatesdaysrM   rN   rR   r   r   r   cap_topsf   s   
ri   c                 C   sZ  t   t|D ]}t| zttjt jd t j	d tj
d t jd | |f }t|dd }|d}tjt|}|d}	t jrNd	d
 |	D }
ndd
 |	D }
d|
}
d|
 }
t|
d }tj|_|j|dd}|d}t|dkrtd|d d }t| ||||W   S |W   S  ty } z
t | W Y d }~qd }~ww d S )Nr   vsfr   fdr   r   r   //table[@id="dataTable"]/trc                 S      g | ]
}t |d qS zutf-8r   tostringr6   .0noder   r   r   
<listcomp>       z_cap_tops.<locals>.<listcomp>c                 S      g | ]}t |qS r   r   rp   rq   r   r   r   rt          r   <table>%s</table>Tignore_index(//div[@class="pages"]/a[last()]/@onclick\d+)!r2   _write_consoler-   r.   r/   r   r0   LHB_SINA_URLr3   r4   	LHB_KINDSPAGESr
   r5   r6   lxmlhtmlparser   xpathPY3joinr>   	read_htmlLHB_GGTJ_COLSr   appendlenrefindallre   rI   rJ   lastrX   rM   rN   dataArrrO   rP   rQ   r   ressarrrR   nextPagerT   r   r   r   re      :   





re   c                 C   s.   t | du rt   t| d||d}|S dS )u  
    获取营业部上榜统计数据
    Parameters
    --------
    days:int
              天数，统计n天以来上榜次数，默认为5天，其余是10、30、60
    retry_count : int, 默认 3
                 如遇网络等问题重复执行的次数 
    pause : int, 默认 0
                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题
    Return
    ---------
    broker：营业部名称
    count：上榜次数
    bamount：累积购买额(万)
    bcount：买入席位数
    samount：累积卖出额(万)
    scount：卖出席位数
    top3：买入前三股票
    Tr   rW   N)r2   rc   rd   _broker_topsrg   r   r   r   broker_tops   s   r   c                 C   sZ  t   t|D ]}t| zttjt jd t j	d tj
d t jd | |f }t|dd }|d}tjt|}|d}	t jrNd	d
 |	D }
ndd
 |	D }
d|
}
d|
 }
t|
d }tj|_|j|dd}|d}t|dkrtd|d d }t| ||||W   S |W   S  ty } z
t | W Y d }~qd }~ww d S )Nr   rj   r   rk   r   r   r   rl   c                 S   rm   rn   ro   rq   r   r   r   rt      ru   z _broker_tops.<locals>.<listcomp>c                 S   rv   r   rw   rq   r   r   r   rt      rx   r   ry   r   Trz   r|   r}   )!r2   r~   r-   r.   r/   r   r0   r   r3   r4   r   r   r
   r5   r6   r   r   r   r   r   r   r   r>   r   LHB_YYTJ_COLSr   r   r   r   r   r   rI   rJ   r   r   r   r   r      r   r   c                 C   sD   t | du r t   t| d||d}|d dd |d< |S dS )ud  
    获取机构席位追踪统计数据
    Parameters
    --------
    days:int
              天数，统计n天以来上榜次数，默认为5天，其余是10、30、60
    retry_count : int, 默认 3
                 如遇网络等问题重复执行的次数 
    pause : int, 默认 0
                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题
                
    Return
    --------
    code:代码
    name:名称
    bamount:累积买入额(万)
    bcount:买入次数
    samount:累积卖出额(万)
    scount:卖出次数
    net:净额(万)
    Tr   rW   rY   c                 S   rZ   r[   r]   r`   r   r   r   r      rb   zinst_tops.<locals>.<lambda>N)r2   rc   rd   
_inst_topsrF   rg   r   r   r   	inst_tops   s   r   c                 C   sl  t   t|D ]}t| zttjt jd t j	d tj
d t jd | |f }t|dd }|d}tjt|}|d}	t jrNd	d
 |	D }
ndd
 |	D }
d|
}
d|
 }
t|
d }|jddgdd}tj|_|j|dd}|d}t|dkrtd|d d }t| ||||W   S |W   S  t y } z
t!| W Y d }~qd }~ww d S )Nr   rj      rk   r   r   r   rl   c                 S   rm   rn   ro   rq   r   r   r   rt   
  ru   z_inst_tops.<locals>.<listcomp>c                 S   rv   r   rw   rq   r   r   r   rt     rx   r   ry   r   r   r   r&   Trz   r|   r}   )"r2   r~   r-   r.   r/   r   r0   r   r3   r4   r   r   r
   r5   r6   r   r   r   r   r   r   r   r>   r   rH   LHB_JGZZ_COLSr   r   r   r   r   r   rI   rJ   r   r   r   r   r      s<   





r   c                 C   s<   t   td| |d}t|dkr|d dd |d< |S )u&  
    获取最近一个交易日机构席位成交明细统计数据
    Parameters
    --------
    retry_count : int, 默认 3
                 如遇网络等问题重复执行的次数 
    pause : int, 默认 0
                重复请求数据过程中暂停的秒数，防止请求间隔时间太短出现的问题
                
    Return
    ----------
    code:股票代码
    name:股票名称     
    date:交易日期     
    bamount:机构席位买入额(万)     
    samount:机构席位卖出额(万)     
    type:类型
    r   rW   r   rY   c                 S   rZ   r[   r]   r`   r   r   r   r   4  rb   zinst_detail.<locals>.<lambda>)r2   rd   _inst_detailr   rF   )rM   rN   rR   r   r   r   inst_detail  s   r   c                 C   sX  t   t|D ]}t| zttjt jd t j	d tj
d t jd d| f }t|dd }|d}tjt|}|d	}t jrNd
d |D }	ndd |D }	d|	}	d|	 }	t|	d }
tj|
_|j|
dd}|d}t|dkrtd|d d } t| |||W   S |W   S  ty } z
t | W Y d }~qd }~ww d S )Nr   rj   r   rk   r   r   r   r   rl   c                 S   rm   rn   ro   rq   r   r   r   rt   D  ru   z _inst_detail.<locals>.<listcomp>c                 S   rv   r   rw   rq   r   r   r   rt   F  rx   ry   r   Trz   r|   r}   )!r2   r~   r-   r.   r/   r   r0   r   r3   r4   r   r   r
   r5   r6   r   r   r   r   r   r   r   r>   r   LHB_JGMX_COLSr   r   r   r   r   r   rI   rJ   )rX   rM   rN   r   rO   rP   rQ   r   r   r   rR   r   rT   r   r   r   r   8  s:   





r   c                 C   sV   d| d v r)| d | d< t ddD ]
}| |d  | |< qt ddD ]}tj| |< q!| S )N%r   r\      rV   r   )r-   npNaN)ra   ir   r   r   _f_rowsV  s   r   )Nr   r   )rV   r   r   )r   r   )*__doc__pandasr>   __version__vintr7   ior   pandas.compattushare.stockr   r2   numpyr   r.   r;   r   	lxml.htmlr   r   tushare.utilr   r(   r	   r0   urllib.requestr
   r   ImportErrorurllib2rU   ri   r?   re   r   r   r   r   r   r   r   r   r   r   r   <module>   s<   ,

F"


