
    i*                        d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlZd dlZd dlmZ ddlmZmZmZmZ ddlmZ dd	lmZmZ  ed
          ZdedefdZ edg d          Z  edd          	 	 	 d0de!deedf         de!fd            Z"	 	 	 d1de!deedf         de#de$dee dee          f         f
dZ%	 d2de!deedf         dee df         fdZ&de!dee          fdZ'g dfde(d ee!         d!e$fd"Z) e(             e*            fd#ee!e
f         d$ee!         fd%Z+ ed&          Z,d2d'e
e!ge,f         d(e	d)e,de,fd*Z-	 d3d+e!d,e!d-e!d.e$ddf
d/Z.g Z/dS )4    N)OrderedDict
namedtuplewraps)AnyCallableDictListTypeVarUnion)retry   )FS_DICTMARKET_NUMBER_DICTMagicConfig
MarketType)SEARCH_RESULT_CACHE_PATH)SEARCH_RESULT_DICTsessionFfuncreturnc                      g dt                      fd            }dt          t          t          t          f         dt          t          t          t          f         fd|S )u   
    将 DataFrame 或者 Series 尽可能地转为数字的装饰器

    Parameters
    ----------
    func : Callable
        返回结果为 DataFrame 或者 Series 的函数

    Returns
    -------
    Union[DataFrame, Series]

    )u   股票代码u   基金代码u   代码u   市场类型u   市场编号u   债券代码u   行情IDu   正股代码c                      | i |}t          |t          j                  r-|j        D ]$}|vr||                                       ||<   %n<t          |t          j                  r"|j        D ]}|vr ||                   ||<   |S N)
isinstancepd	DataFramecolumnsapplySeriesindex)argskwargsvaluescolumnr"   convertr   ignores        B/usr/local/lib/python3.11/dist-packages/efinance/utils/__init__.pyrunzto_numeric.<locals>.run.   s    t&v&&fbl++ 		; . C C''%+F^%9%9'%B%BF6NC 	** 	; ; ;&&$+GF5M$:$:F5M    or   c                     t          j        dt          |                     s| S 	 t          |                                           rt	          |           } nt          |           } n#  Y nxY w| S )Nz\d)refindallstrisalnumintfloat)r,   s    r)   r'   zto_numeric.<locals>.convert=   sj    z%Q(( 	H	1vv~~ FF!HH	Ds   A A' 'A+)r   r   r0   r2   r3   )r   r*   r'   r(   s   ` @@r)   
to_numericr4      s    	 	 	F 4[[      [
5c5) 
eCO.D 
 
 
 
 Jr+   Quote)codenamepinyinidjysclassifymarket_typesecurity_typeNamesecurity_typemkt_numtype_usquote_idunified_code
inner_code      )triesdelayTF
stock_coder<   c                 $   t          t          |                                                     dk    r|rdS t          d          t	          | f||d|}t          |t                    r|j        S ||st          j	        d|  d           dS dS )u  
    生成东方财富股票专用的行情ID

    Parameters
    ----------
    stock_code : str
        证券代码或者证券名称
    market_type : MarketType, optional
        市场类型，目前可筛选A股，港股，美股和英股。默认不筛选
    use_local : bool, optional
        是否使用本地缓存
    suppress_error : bool, optional
        遇到错误的股票代码，是否不报错，返回空字符串

    Returns
    -------
    str
        东方财富股票专用的 secid
    r    u#   证券代码应为长度不应为 0)r<   	use_localNu   证券代码 "u   " 可能有误)
lenr0   strip	Exceptionsearch_quoter   r5   rA   richprint)rH   r<   rK   suppress_errorr$   quotes         r)   get_quote_idrT   b   s    6 3z??  ""##q(( 	2=>>> +y DJ E % ~} 	DJB
BBBCCCr }r+   keywordcountrK   c                     |r|dk    rt                     }|r|S d}d  fdddt          |d           ff}	 t          j        ||	                                          }|d
         d         }	n%# t          j        $ r t          d           Y dS w xY w|	W|	rU fd|	D             }
t           |
dd                    |dk    rt          |
          dk    r|
d         ndS |
d|         S dS )u  
    根据关键词搜索以获取证券信息

    Parameters
    ----------
    keyword : str
        搜索词(股票代码、债券代码甚至证券名称都可以)
    market_type : MarketType, optional
        市场类型，目前可筛选A股，港股，美股和英股。默认不筛选
    count : int, optional
        最多搜索结果数, 默认为 `1`
    use_local : bool, optional
        是否使用本地缓存

    Returns
    -------
    Union[Quote, None, List[Quote]]

    rE   )r<   z/https://searchapi.eastmoney.com/api/suggest/getinput)type14)token D43BF722C8E33BDC906FB84D85E326E8rV      )paramsQuotationCodeTableDataz@unable to parse search quote result, consider if you are blockedNc                     g | ]\}                     t          j        d           r|d         k    r.j        |d         k    At	          |                                 ]S )FCodeNClassify)getr   QUOTE_SYMBOL_MODEvaluer5   r%   ).0itemrU   r$   r<   s     r)   
<listcomp>z search_quote.<locals>.<listcomp>   sy     

 

 

 JJ{<eDD

 tF|++ $):d:>N)N)N 4;;==! *O)N)Nr+   r   )	search_quote_locallymaxr   rd   jsonJSONDecodeErrorRuntimeWarningsave_search_resultrL   )rU   r<   rV   rK   r$   rS   urlr^   json_responseitemsquotess   ``  `      r)   rO   rO      sk   6  UaZZ$W+FFF 	L
;C	W,5	S]]$%	FC777<<>>23F;   N	
 	
 	
 tt	 U

 

 

 

 

 



 

 

 	7F2A2J///A:: #Fq 0 06!99d:fuf~4s   6A5 5BBc                 \   t          j        |           }|H|                    d          r3t          |t                    r |                    d          |j        k    rdS |d         }d}t          j                    }||z
  |k    rdS |                                }|d= t          di |}|S )u2  
    在本地里面使用搜索记录进行关键词搜索

    Parameters
    ----------
    keyword : str
        搜索词
    market_type : MarketType, optional
        市场类型，目前可筛选A股，港股，美股和英股。默认不筛选

    Returns
    -------
    Union[Quote,None]

    N	last_timer;   i  )r   rd   r   r   rf   timecopyr5   )rU   r<   qru   max_tsnow_qrS   s           r)   rj   rj      s    $ 	w''A 	
	uu[!! 	 {J// 	 z""(9:: t~IF
)++Ci6!!t	
B
;KKBKKELr+   rs   c                 B   t          t          dd          5 }|D ]E}t          j                    }t          |                                          }||d<   |t
          | <    t          j        t          j                    |           ddd           dS # 1 swxY w Y   dS )u   
    存储搜索结果到文件中

    Parameters
    ----------
    keyword : str
        搜索词
    quotes : List[Quote]
        搜索结果
    wzutf-8)encodingru   N)	openr   rw   dict_asdictr   rl   dumprx   )rU   rs   frS   r{   ds         r)   ro   ro      s     
&g	>	>	> 0! 	 	E)++CU]]__%%A AkN*+w'	$)++Q///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0s   A/BBBfieldsto_be_removedkeep_allc                       fd}|S )u:  
    重命名 DataFrame 和 Series 的列名的装饰器

    Parameters
    ----------
    fields : dict
        新的表头
    to_be_removed : List[str], optional
        要移除的列, by default []
    keep_all : bool, optional
        是否保存全部列(包含未重命名的列), by default True
    c                 D     t                      fd            }|S )Nc                      | i |}t          |t          j                  rt                                                    }r@|j        D ]}||vr|                    |           |                              |         }n|                              |         }|D ]	}|v r||= 
n/t          |t          j                  r|                              }|S )N)r   )	r   r   r   listr%   r   appendrenamer!   )	r#   r$   r%   r   r&   r   r   r   r   s	        r)   wrapperz?rename_dataframe_and_series.<locals>.decorator.<locals>.wrapper%  s    T4*6**F&",// /v}}// D"(. 3 3!00#NN6222#]]6]::7CFF#]]6]::7CF$ + +F.."6N+ FBI.. /v..Mr+   r   )r   r   r   r   r   s   ` r)   	decoratorz.rename_dataframe_and_series.<locals>.decorator$  sC    	t	 	 	 	 	 	 	 
	& r+   rv   )r   r   r   r   s   ``` r)   rename_dataframe_and_seriesr     s0           . r+   function_fieldsremove_columns_and_indexesc                       fd}|S )u  
    对 DataFrame 和 Series 进一步操作

    Parameters
    ----------
    function_fields : Dict[str, Callable], optional
        函数字典
    remove_columns_and_indexes : List[str], optional
        需要删除的行或者列, by default list()
    c                 B     t                      fd            }|S )Nc                  \    | i |}t          |t          j                  rT                                D ]-\  }}||j        vr||                             |          ||<   .D ]}||j        v r||= n4t          |t          j                  rD ]}|                    |          }|S r   )r   r   r   rr   r   r    r!   drop)	r#   r$   r%   r&   function_namer"   r   r   r   s	         r)   r   z@process_dataframe_and_series.<locals>.decorator.<locals>.wrapperN  s    T4*6**F&",// 
0-<-B-B-D-D I I)FMV^33 %+F^%9%9-%H%HF6NN8 + +F//"6N+ FBI.. 07 0 0E#[[//FFMr+   r   )r   r   r   r   s   ` r)   r   z/process_dataframe_and_series.<locals>.decoratorM  s>    	t	 	 	 	 	 	 
	 r+   rv   )r   r   r   s   `` r)   process_dataframe_and_seriesr   >  s*         & r+   Tr   rf   defaultc                 <    	  | |          }|S #  ||cY S |cY S xY w)u(  
    类型转换

    Parameters
    ----------
    f : Callable[[str], T]
        转换函数
    value : Any
        待转换的值

    default : T, optional
        转换失败时的返回值, 默认为  ``None`` 表示原样返回

    Returns
    -------
    T
        转换结果
    rv   )r   rf   r   s      r)   to_typer   f  s9    &%?LLLs    categorymarket_numbermarket_namedrop_duplicatec                     |t           |<   t          j        | d          }| d| }|rDd                    t	          j        |                    d                              t          | <   dS |t          | <   dS )u  
    添加市场

    Parameters
    ----------
    category : str
        市场类别
    market_number : str
        市场编号
    market_name : str
        市场名称
    drop_duplicate : bool, optional
        是否去重, 默认为 ``True``
    rJ   z,m:,N)r   r   rd   joinr   fromkeyssplit)r   r   r   r   oldnews         r)   
add_marketr     s|    " )4}%
+h
#
#C
$
$]
$
$C  HH[%9#))C..%I%IJJr+   )NTF)NrE   Tr   )T)0rl   r.   rw   collectionsr   r   	functoolsr   typingr   r   r	   r
   r   r   pandasr   rP   	retry.apir   common.configr   r   r   r   configr   sharedr   r   r   r4   r5   r0   rT   r2   boolrO   rj   ro   r   r   r   r   r   r   r   __all__rv   r+   r)   <module>r      s    				  / / / / / / / /       < < < < < < < < < < < < < < < <            P P P P P P P P P P P P - - - - - - 0 0 0 0 0 0 0 0 GCLL5Q 51 5 5 5 5r 	
  	 	* Qa ,0	& &&z4'(& 	& & & &V ,0	B BBz4'(B B 	B 5$U#$B B B BL :>* **$Z%56*
5$;* * * *Z0 0T%[ 0 0 0 0. .0$' ''!%c';?' ' ' 'V ,0466,0DFF" "#x-(" $S	" " " "J GCLL xq! #  Q    : QU    "% 47 IM 	       4 r+   