
    iF                        d dl m Z  d dlmZmZm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 d dlZd dlmZ dd	lmZmZ dd
lmZmZmZ ddlmZmZ ddlmZmZmZmZm Z m!Z!m"Z" ede#de	j$        fd            Z%e	 	 	 	 	 	 	 d/de#de#de#de&de&deedf         de'de'de	j$        fd            Z(	 	 	 	 	 	 	 	 d0d ee#         de#de#de&de&d!e&deedf         de'de'dee#e	j$        f         fd"Z)	 	 	 	 	 	 	 d/d ee#ee#         f         de#de#de&de&deedf         de'de'dee	j$        ee#e	j$        f         f         fd#Z*ede#de	j$        fd$            Z+ede#de	j$        fd%            Z,ed&e#de	j-        fd'            Z.ed1d&e#d)e&de	j$        fd*            Z/ed+ee#ee#         f         de	j$        fd,            Z0ed2de#d-e&de	j$        fd.            Z1dS )3    )datetime)DictListUnionN)jsonpath)retry)tqdm)ThreadPoolExecutor   )MARKET_NUMBER_DICT
MarketType)BASE_INFO_CACHEsessionMAX_CONNECTIONS)get_quote_id
to_numeric   )EASTMONEY_BASE_INFO_FIELDSEASTMONEY_HISTORY_BILL_FIELDSEASTMONEY_KLINE_FIELDSEASTMONEY_KLINE_NDAYS_FIELDSEASTMONEY_QUOTE_FIELDSEASTMONEY_REQUEST_HEADERSMagicConfigfsreturnc           	          i t           |                    t          j        i           d                                                              dt          dt          f fd}dt          j        fd} |dd	          }|d
         d         }t          |d
         d                   }t          ||          \  }}|r|dz   n|}	t                      5 }
|
                    |t          d|	dz             |g|	z            }t          |          }ddd           n# 1 swxY w Y   fd|D             }t          j        |dd                                                                                                     ddd|          }|d                             t(                    dz   |d                             t(                    z   |d<   |d                             t(                                        d           |d<   |d                             d           |d<   t          j        |d         d !                              t(                    |d<   |d         }|d= ||d<   |d= |S )"u   
    获取沪深市场最新行情总体情况

    Returns
    -------
    DataFrame
        沪深市场最新行情信息（涨跌幅、换手率等信息）

    ,pnpzc           
          d| fd|fddddddfd	ff	}d
}t          j        |t          |                                          }|S )Nr   r    )po1)npr#   fltt2invtr'   )fidf12r   fieldsz+http://push2.eastmoney.com/api/qt/clist/getheadersparams)r   getr   json)r   r    r/   urljson_responser,   r   s        A/usr/local/lib/python3.11/dist-packages/efinance/common/getter.pyget_by_pagez.get_realtime_quotes_by_fs.<locals>.get_by_page)   so    2J2J2Jv
 <26
 
 

$&& 	     seriesc                     t          j        | j        t                    }|                                 D ]/\  }}t          |t                    rt          j        ||<   *|||<   0|S )Nindexdtype)	pdSeriesr:   floatitems
isinstancestrr$   nan)r7   	sort_keysidxvals       r4   mixed_sort_keyz1get_realtime_quotes_by_fs.<locals>.mixed_sort_key<   sc    IFL>>>	 	% 	%HC#s## %!#	#!$	#r6   r      )r    datatotaldiffNc                     g | ]G}t          j        |d          d                   t                                                             HS )rH   rJ   )r<   	DataFramelistkeys).0responsecolumnss     r4   
<listcomp>z-get_realtime_quotes_by_fs.<locals>.<listcomp>Q   sR        	Xf%f-..tGLLNN/C/CD  r6   r   Taxisignore_indexrQ   u	   涨跌幅F)by	ascendingrU   key   市场编号.   代码   行情IDc                 *    t          j        |           S N)r   r0   xs    r4   <lambda>z+get_realtime_quotes_by_fs.<locals>.<lambda>b   s    7I7Ma7P7P r6      市场类型   更新时间戳c                 D    t          t          j        |                     S r_   rA   r   fromtimestampr`   s    r4   rb   z+get_realtime_quotes_by_fs.<locals>.<lambda>d       s8CYZ[C\C\?]?] r6      更新时间   最新交易日%Y%m%dformat)r   r0   r   EXTRA_FIELDSjoinrN   intr<   r=   lendivmodr
   maprangerM   concatrenamevaluessort_valuesastyperA   applyto_datetime)r   kwargsr5   rF   r3   rI   r    divmodpagesexecutortasks	responsesdfsdftmprQ   r,   s   `               @@r4   get_realtime_quotes_by_fsr      s    U'T6::k6NPR+S+STGXXgllnn%%F        &	ry 	 	 	 	  Kc***M&!'*E	]6"6*	+	+BeR  HC#C!GGE			  [%519*=*=te|LLKK	                                !  C
 		#AD111		 	 !1!1	3		 
 

 

  '..s33c9BxL<O<OPS<T<TTBzN
>!!#&&,,-P-PQQ ~ -.445]5]^^B~N2.?+@RRRYYZ]^^B

C
B
Is   <D!!D%(D%1900010120500101e   FTcodebegendkltfqtmarket_typesuppress_erroruse_id_cachec           	      @   t          t          j                              }	t          t          j                              }
d                    |	          }|                    t          j                  r| }nt          d| |||d|}dd|fd|fd|fdd|fd	| fd
| ff}d}t          j        |t          |d                                          }t          |d          }|sA|
                    dd           |
                    dd           t          j        |
          S d |D             }|d         d         }|                    d          d         } t          j        ||
          }|                    dd|            |                    dd|           |S )u2   
    获取单只股票、债券 K 线数据

    r   )
stock_coder   	use_localr   fields1z*f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13fields2r   r   )rtntype6secidr   r   z5https://push2his.eastmoney.com/api/qt/stock/kline/getF)r.   r/   verify$..klines[:]r   r\      名称rV   c                 8    g | ]}|                     d           S r   splitrO   klines     r4   rR   z,get_quote_history_single.<locals>.<listcomp>   $    111EKK111r6   rH   namer[    )rM   r   rN   rw   ro   r0   r   QUOTE_ID_MODEr   r   r   r1   r   insertr<   rL   r   )r   r   r   r   r   r   r   r   r|   r,   rQ   r   quote_idr/   r2   r3   klinesrowsr   r   s                       r4   get_quote_history_singler   m   s   " (-//00F)02233GhhvGzz++,, 	
 
#")	
 

 
 
 	B	G			(	3	3	F BCK.ve  
dff  !??F -q(###q(###|G,,,,11&111D (D>>#r"D	dG	,	,	,BIIa4   IIa4   Ir6      codestriesc	                 .  	 i t          |           }
t          j        t          |d          dt          f	f
d                        }t          |
          | D ]J}t          t          j                              t          k    rt          j	        d            ||           Kt          j
                                                      	                    t          j                  rt          j        dd	          S S )
u8   
    获取多只股票、债券历史行情信息

    r   )r   delayr   c                    
 t          | f
d}|| <   	                    d           	                    d|             d S )Nr   r   r   r   r   r   r   r   zProcessing => )r   updateset_description_str)r   _dfr   r   r   r   r   r|   r   pbarr   r   s     r4   startz&get_quote_history_multi.<locals>.start   s}     '

#)%

 

 

 

 D	A  !8$!8!899999r6   )rI   r   r   TrS   )rq   multitaskingtaskr   rA   r	   get_active_tasksr   timesleepwait_for_taskscloser0   r   	RETURN_DFr<   ru   )r   r   r   r   r   r   r   r   r   r|   rI   r   r   r   r   s    ```` ````   @@r4   get_quote_history_multir      s>   " $&CJJE
a   :C : : : : : : : : : : : : : : !  :  eD  |,..///AAJqMMMd!!!JJLLLzz+'(( 9y148888Jr6   c                     t          | t                    rt          | f|||||||d|S t          | d          r$t	          |           } t          | f|||||||d|S t          d          )u9  
    获取股票、ETF、债券的 K 线数据

    Parameters
    ----------
    codes : Union[str,List[str]]
        股票、债券代码 或者 代码构成的列表
    beg : str, optional
        开始日期，默认为 ``'19000101'`` ，表示 1900年1月1日
    end : str, optional
        结束日期，默认为 ``'20500101'`` ，表示 2050年1月1日
    klt : int, optional
        行情之间的时间间隔，默认为 ``101`` ，可选示例如下

        - ``1`` : 分钟
        - ``5`` : 5 分钟
        - ``15`` : 15 分钟
        - ``30`` : 30 分钟
        - ``60`` : 60 分钟
        - ``101`` : 日
        - ``102`` : 周
        - ``103`` : 月

    fqt : int, optional
        复权方式，默认为 ``1`` ，可选示例如下

        - ``0`` : 不复权
        - ``1`` : 前复权
        - ``2`` : 后复权

    market_type : MarketType, optional
        市场类型，目前可筛选A股，港股，美股和英股。默认不筛选，可选示例如下

        - ``A_stock`` : A股
        - ``Hongkong`` : 香港
        - ``London_stock_exchange`` : 英股
        - ``US_stock`` : 美股

    suppress_error : bool, optional
        遇到错误的股票代码，是否不报错，返回空的DataFrame
    use_id_cache : bool, optional
        是否使用本地缓存的东方财富股票行情ID

    Returns
    -------
    Union[DataFrame, Dict[str, DataFrame]]
        股票、债券的 K 线数据

        - ``DataFrame`` : 当 ``codes`` 是 ``str`` 时
        - ``Dict[str, DataFrame]`` : 当 ``codes`` 是 ``List[str]`` 时

    r   __iter__u$   代码数据类型输入不正确！)r@   rA   r   hasattrrM   r   	TypeError)	r   r   r   r   r   r   r   r   r|   s	            r4   get_quote_historyr      s    @ % 
'

#)%

 

 

 

 
	
 

	#	# 
U&

#)%

 

 

 

 
	
 :
;
;;r6   c                    t          t          j                              }t          t          j                              }d                    |          }t          |           }ddd|fdd|ff}d}t          j        |t          |          	                                }t          |d	          }|sA|                    d
d           |                    d
d           t          j        |          S d |D             }	t          |d          d
         }
|                    d          d         } t          j        |	|          }|                    d
d|            |                    d
d|
           |S )u  
    获取单支股票、债券的历史单子流入流出数据

    Parameters
    ----------
    code : str
        股票、债券代码

    Returns
    -------
    DataFrame
        沪深市场单只股票、债券历史单子流入流出数据

    r   )lmt100000)r   101r   r   zf1,f2,f3,f7r   z=http://push2his.eastmoney.com/api/qt/stock/fflow/daykline/getr-   r   r   r\   r   rV   c                 8    g | ]}|                     d           S r   r   r   s     r4   rR   z$get_history_bill.<locals>.<listcomp>b  r   r6   $..namer[   r   )rM   r   rN   rw   ro   r   r   r0   r   r1   r   r   r<   rL   r   )r   r,   rQ   r   r   r/   r2   r3   r   r   r   r   s               r4   get_history_billr   <  sx   " /46677F0799::GhhvGD!!H	("	GF JCK.v  
dff  !??F -q(###q(###|G,,,,11&111DM9--a0D>>#r"D	dG	,	,	,BIIa4   IIa4   Ir6   c                 F   t          |           }ddd|fddf}d}t          j        |t          |                                          }g d}t          |d	          d
         }|                    d          d         } t          |d          }|sA|                    d
d           |                    d
d           t          j	        |          S d |D             }t          j	        ||          }	|	                    d
d|            |	                    d
d|           |	S )u   
    获取单只股票最新交易日的日内分钟级单子流入流出数据

    Parameters
    ----------
    code : str
        股票、债券代码

    Returns
    -------
    DataFrame
        单只股票、债券最新交易日的日内分钟级单子流入流出数据

    )r   0)r   r#   r   r   )r   z3f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63z7http://push2.eastmoney.com/api/qt/stock/fflow/kline/getr-   )   时间u   主力净流入u   小单净流入u   中单净流入u   大单净流入u   超大单净流入r   r   r[   r   r   r\   r   rV   c                 8    g | ]}|                     d           S r   r   r   s     r4   rR   z"get_today_bill.<locals>.<listcomp>  r   r6   )
r   r   r0   r   r1   r   r   r   r<   rL   )
r   r   r/   r2   r3   rQ   r   r   r   r   s
             r4   get_today_billr   l  sE     D!!H	("JF DCK.v  
dff   G M9--a0D>>#r"D ??F -q(###q(###|G,,,,11&111D	dG	,	,	,BIIa4   IIa4   Ir6   r   c                    d                     t          j                              }dddd|fd| ff}d}t          j        |t
          |                                          }|d	         }|s't          j        t          j	                    d
          S t          j        |d
          
                    t                    }|S )Nr   )ut fa5fd1943c7b386f172d6893dbfba10br(   r%   r,   r   z+http://push2.eastmoney.com/api/qt/stock/getr-   rH   objectr9   )r;   )r:   )ro   r   rN   r   r0   r   r1   r<   r=   rw   rv   )r   r,   r/   r2   r3   r?   ss          r4   get_base_infor     s     XX057788F2	6	(F 8CK.v  
dff  &!E Ty9@BB(SSSS
	%x(((//6P/QQAHr6   @B 	max_countc                     t          j        | t          |                     }|t           | <   g d}t          |d                                                   dk    rt          j        |          S |d         }|d         }d| fddd	d
t          |           ff}t          j        d|          }|	                                }|d         d         }	d |	D             }
t          j        |t          t          |
                              }||j        dddf<   ||j        dddf<   t          j        |
g d          }|                    dd|d         d                    |j        |j        dd|j        f<   |S )u  
    获取股票、期货、债券的最新交易日成交情况

    Parameters
    ----------
    quote_id : str
        包含市场编号的股票、期货、债券代码
    max_count : int, optional
        最大数据条数, 默认为 ``1000000``

    Returns
    -------
    DataFrame
        股票、期货、债券的最新交易日成交情况

    Notes
    ------
    返回的数据表头: ``['名称', '代码', '时间', '昨收', '成交价', '成交量', '单数']``
    )r   r\   r      昨收	   成交价	   成交量   单数r\   rB   rV   r   r   )r   zf1,f2,f3,f4,f5)r   zf51,f52,f53,f54,f55pos-z4https://push2.eastmoney.com/api/qt/stock/details/getr/   rH   detailsc                 H    g | ]}|                     d           dd          S )r   N   r   )rO   lines     r4   rR   z#get_deal_detail.<locals>.<listcomp>  s+    222DDJJsOOBQB222r6   )rQ   r:   N)r   r   r   r   r   r   prePrice)r   r0   r   rA   lowerr<   rL   rp   r   r1   rt   rq   locr   rw   rQ   )r   r   	base_inforQ   r   r   r/   rP   jslinesr   r   	detail_dfs                r4   get_deal_detailr     s   *  #HmH.E.EFFI )OHZZZG
9X%%''500|G,,,,XDXD	(%*	$C	NN$$%	F {>v  H }}B&z),E22E222D	gU3t99-=-=	>	>	>BBF111h;BF111h;T+Y+Y+YZZZIQ"V*Z"8999#,#3BF111i Ir6   quote_id_listc           
      0   t          | t                    r| g} | }i t          |                    t          j        i           }d                    |                                          }ddd|fddddd                    |          fd	d
f	}d}t          j        |t          |          
                                }t          |d          }|s(t          j        |                                          }	nMt          j        |          t          |                                                                       |          }	|	d                             d           |	d<   |	d                             t                    dz   |	d                             t                    z   |	d<   |	d= |	d                             d           |	d<   t          j        |	d         d                              t                    |	d<   |	d         }
|	d= |
|	d<   |	d= |	S )u  
    获取股票、期货、债券的最新行情

    Parameters
    ----------
    quote_id_list : List[str]
        带市场编号的行情ID或者行情ID组成的列表格式如下
        -  ``'1.600159'``
        - ``['1.600159','0.300750']``

        市场编号参见文件 ``efinance/common/config.py`` 中的 ``MARKET_NUMBER_DICT``

    Returns
    -------
    DataFrame
        股票、期货、债券的最新行情

    Notes
    ------
    返回的数据表头: ``['代码', '名称', '涨跌幅', '最新价', '最高', '最低', '今开', '涨跌额', '换手率', '量比', '动态市盈率','成交量', '成交额', '昨日收盘', '总市值', '流通市值', '市场类型', '行情ID']``
    r   )	OSVersionz14.3)
appVersion6.3.8r,   r%   )platIphone)productEFundsecids)serverVersionz6.3.6)versionr   z/https://push2.eastmoney.com/api/qt/ulist.np/getr-   z
$..diff[:]rV   rZ   c                 D    t          j        t          |                     S r_   )r   r0   rA   r`   s    r4   rb   z"get_latest_quote.<locals>.<lambda>  s    <N<RSVWXSYSY<Z<Z r6   rc   r[   r\   r]   rd   c                 D    t          t          j        |                     S r_   rf   r`   s    r4   rb   z"get_latest_quote.<locals>.<lambda>  rh   r6   ri   rj   rk   rl   )r@   rA   r   r0   r   rn   ro   rN   r   r   r1   r   r<   rL   rw   rM   rv   rz   ry   r{   )r   r|   r   rQ   r,   r/   r2   r3   r   r   r   s              r4   get_latest_quoter     s   . -%% (&%FT'T6::k6NPR+S+STGXXgllnn%%F	6	388F##$"
F <CK.v  
dff  M<00D N\'.."2"2333\$W\\^^ 4 45<<W<MMN+112Z2Z[[B~'..s33c9BxL<O<OPS<T<TTBzN
>-.445]5]^^B~N2.?+@RRRYYZ]^^B

C
B
Ir6   ndaysc                    t          t          j                              }t          t          j                              }d                    |          }|                    t          j                  r| }nt          |           }dd|fd|fddd|ff}t          j        d|	          
                                }t          |d
          }	|	sA|                    dd           |                    dd           t          j        |          S d |	D             }
|d         d         }|                    d          d         } t          j        |
|          }|                    dd|            |                    dd|           |S )u  
    获取股票、期货、债券的最近 ``ndays`` 天的1分钟K线行情

    Parameters
    ----------
    code : str
        代码、名称或者行情ID 如果是行情ID则需传入 ``quote_id_mode=True``
    ndays : int, optional
        天数 默认为 ``1`` 最大为 ``5``

    Returns
    -------
    DataFrame
        股票、期货、债券的最近 ndays 天的1分钟K线行情
    r   r   r   r   )iscrr   )isccar   r   z6http://push2his.eastmoney.com/api/qt/stock/trends2/getr   z$..trends[:]r   r\   r   rV   c                 8    g | ]}|                     d           S r   r   r   s     r4   rR   z*get_latest_ndays_quote.<locals>.<listcomp>Q  r   r6   rH   r   r[   r   )rM   r   rN   rw   ro   r0   r   r   r   r   r1   r   r   r<   rL   r   )r   r   r|   r,   rQ   r   r   r/   r3   r   r   r   r   s                r4   get_latest_ndays_quoter  %  s   $ .35566F/68899GhhvGzz++,, &%%A	G	%	(F K@  
dff  !??F -q(###q(###|G,,,,11&111D (D>>#r"D	dG	,	,	,BIIa4   IIa4   Ir6   )r   r   r   r   NFT)r   r   r   r   r   NFT)r   )r   )2r   typingr   r   r   numpyr$   r   pandasr<   r   r   	tqdm.autor	   r   concurrent.futuresr
   common.configr   r   sharedr   r   r   utilsr   r   configr   r   r   r   r   r   r   rA   rL   r   rp   boolr   r   r   r   r   r=   r   r   r   r  r   r6   r4   <module>r     s         $ $ $ $ $ $ $ $ $ $                                1 1 1 1 1 1 : : : : : : : : > > > > > > > > > > , , , , , , , ,                  O# OBL O O O Od  +/ : :
:	: 
: 
	:
 
: z4'(: : : \: : : :~ +/ 1 191	1 
1 
	1
 
1 1 z4'(1 1 1 
#r|
1 1 1 1l +/ Z< Z<d3i Z<	Z< 
Z< 
	Z<
 
Z< z4'(Z< Z< Z< 2<c2</001Z< Z< Z< Z<z ,3 ,2< , , , ,^ . . . . . .b C BI    , / /c /c / / / / /d 9E#tCy.$9 9 9 9 9 9x 2 2 2S 22< 2 2 2 2 2 2r6   