
    fi~?                        d 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Zddl	m
Z
 ddlmZ ddlmZ  e
j                    Zdde
j        fd	ed
edefdZde
j        fdededej        fdZd Zdej        defdZddedej        fdZedk    rJ edddg          Z ee            ed          Z ee            ed          Z ee           dS dS )uU  
Date: 2024/12/12 17:00
Desc: 生意社网站采集大宗商品现货价格及相应基差数据, 数据时间段从 20110104-至今
备注：现期差 = 现货价格 - 期货价格(这里的期货价格为结算价)
黄金为 元/克, 白银为 元/千克, 玻璃现货为 元/平方米, 鸡蛋现货为 元/公斤, 鸡蛋期货为 元/500千克, 其余为 元/吨.
焦炭现货规格是: 一级冶金焦; 焦炭期货规格: 介于一级和二级之间, 焦炭现期差仅供参考.
铁矿石现货价格是: 湿吨, 铁矿石期货价格是: 干吨
网页地址: https://www.100ppi.com/sf/
历史数据可以通过修改 url 地址来获取, 比如: https://www.100ppi.com/sf/day-2017-09-12.html
发现生意社的 bugs:
1. 2018-09-12 周三 数据缺失是因为生意社源数据在该交易日缺失: https://www.100ppi.com/sf/day-2018-09-12.html
    N)List)cons)pandas_read_html_link)chinese_to_english2021020120210208	start_dayend_day	vars_listc                    | t          j        |           nt          j                                        } |t          j        |          nAt          j        t          j        t          j                                                            }g }| |k    rqt          | |          }|du r(t          j	        |          
                    d          S ||                    |           | t          j        d          z  } | |k    qt          |          dk    r-t          j	        |          }|
                    dd           |S dS )	u  
    指定时间段内大宗商品现货价格及相应基差
    https://www.100ppi.com/sf/
    :param start_day: str 开始日期 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象; 默认为当天
    :param end_day: str 结束数据 format：YYYY-MM-DD 或 YYYYMMDD 或 datetime.date对象; 默认为当天
    :param vars_list: list 合约品种如 [RB, AL]; 默认参数为所有商品
    :return: 基差
    :rtype: pandas.DataFrame
    展期收益率数据:
    var               商品品种                      string
    sp                现货价格                      float
    near_symbol       临近交割合约                  string
    near_price        临近交割合约结算价             float
    dom_symbol        主力合约                      string
    dom_price         主力合约结算价                 float
    near_basis        临近交割合约相对现货的基差      float
    dom_basis         主力合约相对现货的基差          float
    near_basis_rate   临近交割合约相对现货的基差率    float
    dom_basis_rate    主力合约相对现货的基差率        float
    date              日期                          string YYYYMMDD
    NFT)drop   )daysr   r   inplace)r   convert_datedatetimedatetodayget_latest_data_datenowfutures_spot_pricepdconcatreset_indexappend	timedeltalen)r	   r
   r   df_listtemp_dfs        H/usr/local/lib/python3.11/dist-packages/akshare/futures/futures_basis.pyfutures_spot_price_dailyr"      sI   6 )2(=)$$$8=CVCVCXCX 
  	'"""t89J9N9N9P9PQQRR 
 G
w

$Y	::e9W%%11t1<<< NN7###X'Q////	 w

 7||a)G$$t444     20240430r   returnc                    | t          j        |           nt          j                                        } | t          j        ddd          k     rt          d          |                     d          t          vr=t          j	        |                     d           d           t          j                    S d}d	|                     d
           d}d}	 ||fD ]}	 ddi}t          ||          }|d         j        d         }d                    t          j        d|                    }	|	dd         |                     d          k    r]t#          |d         |           d         _        fd|D             }
j        |
ddf         }|                    dd           |c S t)          j        d           # t
          $ r}t-          |                     d
           d| dt/          |           d           |dz  }|dk    r?t-          |                     d
           d           t          j                    cY d}~c S Y d}~yd}~ww xY w)u@  
    指定交易日大宗商品现货价格及相应基差
    https://www.100ppi.com/sf/day-2017-09-12.html
    :param date: 开始日期 format: YYYY-MM-DD 或 YYYYMMDD 或 datetime.date 对象; 为空时为当天
    :param vars_list: 合约品种如 RB、AL 等列表 为空时为所有商品
    :return: pandas.DataFrame
    展期收益率数据:
    var              商品品种                     string
    sp               现货价格                     float
    near_symbol      临近交割合约                  string
    near_price       临近交割合约结算价             float
    dom_symbol       主力合约                     string
    dom_price        主力合约结算价                float
    near_basis       临近交割合约相对现货的基差      float
    dom_basis        主力合约相对现货的基差         float
    near_basis_rate  临近交割合约相对现货的基差率    float
    dom_basis_rate   主力合约相对现货的基差率       float
    date             日期                         string YYYYMMDD
    N  r      T   数据源开始日期为 20110104, 请将获取数据时间点设置在 20110104 后%Y%m%d   非交易日zhttps://www.100ppi.com/sf/zhttps://www.100ppi.com/sf/day-z%Y-%m-%dz.htmlTAccepttext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7headersr   )r   r    z[0-9]      symbolc                 &    g | ]}|j         v |S  )index).0irecordss     r!   
<listcomp>z&futures_spot_price.<locals>.<listcomp>~   s%    )U)U)U!w}BTBT!BTBTBTr#   r   u,   日生意社数据连接失败[错误信息:u   ]，第u   次尝试，最多5次   u   日生意社数据连接失败, 如果当前交易日是 2018-09-12, 由于生意社源数据缺失, 无法访问, 否则为重复访问已超过5次，您的地址被网站墙了，请保存好返回数据，稍后从该日期起重试)r   r   r   r   r   	Exceptionstrftimecalendarwarningswarnr   	DataFramer   locjoinrefindall_check_informationr6   r   timesleepprintstr)r   r   u1u2r8   urlr/   rstringnewsvar_list_in_marketr    er9   s                @r!   r   r   O   s   , '+&64T"""HM<O<O<Q<QDhmD!Q''''b
 
 	
 }}Xh..x00>>>???|~~	%B	J$--
*C*C	J	J	JB	A*8 	* 	*C*  h *#w???1$wwrz(F;;<<":x!8!88801t<<G$+H$5GM)U)U)U)UY)U)U)U&%k*<aaa*?@G''T4'@@@"NNNJqMMMM * * *}}Z00  G  G^_  G  Ghklmhnhn  G  G  G   Qq55==44 R R R  
 <>>)))))))) 5555*)*s&   CG,G
IA:IIIc                    | j         ddg df         } g d| _        t          j                    }| d                                         D ]m}d                    t          j        d|                    }|dk    r|                                }	 |dk    r |dvrt          |          }t          j        | | d         |k                       }||j         dddf<   |d         
                    t                    |d<   |d	k    r0t          |d         j        d
                   dz  |j         dddf<   nk|dk    r0t          |d         j        d
                   dz  |j         dddf<   n5|dk    r/t          |d         j        d
                   dz  |j         dddf<   t          j        ||g          }o|j        r| j        d
d
         }t          j        d          |d<   t          j        d          |d<   t          j        d          |d<   t          j        d          |d<   t          j        d          |d<   |S |g d         
                    d          |g d<   |d                             ddd          |d<   |d                             ddd          |d<   |j         dddf         |d<   |d         |j         dddf         
                    d           
                    d!          z   |d<   |j         dddf         |d"<   |d         |j         dddf         
                    d           
                    d!          z   |d<   |d                             d#           |d<   |d                             d$           |d<   |d                             d%           |d<   |d                             d&           |d<   |d'         |d         z
  |d<   |d(         |d         z
  |d<   |d'         |d         z  d)z
  |d<   |d(         |d         z  d)z
  |d<   |                    d
d|                    d*                     |                    dd+           |S ),u  
    数据验证和计算模块
    :param df_data: pandas.DataFrame 采集的数据
    :param date: datetime.date 具体某一天 YYYYMMDD
    :return: pandas.DataFrame
    中间数据
    symbol  spot_price near_contract  ...  near_basis_rate dom_basis_rate      date
     CU    49620.00        cu1811  ...        -0.002418      -0.003426  20181108
     RB     4551.54        rb1811  ...        -0.013521      -0.134359  20181108
     ZN    22420.00        zn1811  ...        -0.032114      -0.076271  20181108
     AL    13900.00        al1812  ...         0.005396       0.003957  20181108
     AU      274.10        au1811  ...         0.005655       0.020430  20181108
     WR     4806.25        wr1903  ...        -0.180026      -0.237035  20181108
     RU    10438.89        ru1811  ...        -0.020969       0.084406  20181108
     PB    18600.00        pb1811  ...        -0.001344      -0.010215  20181108
     AG     3542.67        ag1811  ...        -0.000754       0.009408  20181108
     BU     4045.53        bu1811  ...        -0.129904      -0.149679  20181108
     HC     4043.33        hc1811  ...        -0.035449      -0.088128  20...
    N)r   r      r1   r;      )r3   
spot_pricenear_contractnear_contract_pricedominant_contractdominant_contract_pricer3   r0   z[\u4e00-\u9fa5])   商品u   价格u   上海期货交易所u   郑州商品交易所u   大连商品交易所u   广州期货交易所u   暂无数据rV   JDr   i  FGP   LHi  float)dtype
near_basis	dom_basisnear_basis_ratedom_basis_rateobjectr   )rX   rZ   rV   rW   z[^0-9]*(\d*)$z\g<1>T)regexrY   
near_monthintrJ   dominant_monthc                     | d d         t           j        d         t           j        d         z   v r|                                 n| S Nshfedcer   market_exchange_symbolslowerxs    r!   <lambda>z$_check_information.<locals>.<lambda>   K    "v+F3*5122 2 GGIII  r#   c                     | d d         t           j        d         t           j        d         z   v r|                                 n| S rl   rp   rs   s    r!   ru   z$_check_information.<locals>.<lambda>  rv   r#   c                 h    | d d         t           j        d         v r| d d         | dd          z   n| S Nrm   czcer   rq   rs   s    r!   ru   z$_check_information.<locals>.<lambda>
  =     "v)Ef)MMMAcrcFQrssVOOST r#   c                 h    | d d         t           j        d         v r| d d         | dd          z   n| S ry   r|   rs   s    r!   ru   z$_check_information.<locals>.<lambda>  r}   r#   rX   rZ   r   r*   r   r   )rB   columnsr   rA   tolistrC   rD   rE   stripr   astyper`   ilocr   emptySeriesreplaceapplyinsertr=   r   )df_datar   r9   rO   rP   r3   records          r!   rF   rF      s    ( k!!!////0G  GO lnnG(#**,, &3 &3wwrz"4f==>>2::<<>>D	 2::$ 	'
 	
 	
 (--F\''(*;v*E"FGGF&,FJqqq({##),#7#>#>u#E#EF< $.3F<4H4Ma4P.Q.QTW.W
111l?++$.3F<4H4Ma4P.Q.QTV.V
111l?++$.3F<4H4Ma4P.Q.QTX.X
111l?+i& 122G } ,qs# "	 8 8 8!yw777%'YW%=%=%=!"$&IG$<$<$< !)(333 	PPP 	

&// LLLM
  '7??($  @    GO $++>#?#G#G($ $H $ $G  $K?(:;GL&x07;	?4fUmmFF5MM "GO !(AAA/B,B CG#*8#4w{	8fUmmFF5MM$"G   '7==	
 	
   GO $++>#?#E#E	
 	
$ $G   '7==	
 	
   GO
 $++>#?#E#E	
 	
$ $G  $$9:W\=RRGL"#<=@UUGK%&)>>B  	)*W\-BBQF  NN1fdmmH556664000Nr#   contentc                     g }t          | j        d         | j        d                   D ])\  }}||k    r| | }n|}|                    |           *|S )Nr   r   )zipr   r   )r   r/   s1s2ss        r!   
_join_headr   "  sg    Ggl1ow|A77  B88rAAAqNr#   c                    | t          j        |           nt          j                                        } | t          j        ddd          k     rt          d          |                     d          t          vr=t          j	        |                     d           d           t          j                    S |                     d          }d	d
i}t          ||          }|d         }t          |          }||d         j                            d                   }||_        t#          |dd                   dk    rt          j        |dd                   }nt          j        ddg          }ddg|_        |j        |_        t          j        |g d         |dd          }t          j        ||g d         dd          }g d|_        |d         j                            d          |d<   |                    dd           |S )u   
    具体交易日大宗商品现货价格及相应基差
    https://www.100ppi.com/sf/day-2017-09-12.html
    :param date: 交易日; 历史日期
    :type date: str
    :return: 现货价格及相应基差
    :rtype: pandas.DataFrame
    Nr'   r   r(   r)   r*   r+   z,https://www.100ppi.com/sf2/day-%Y-%m-%d.htmlr,   r-   r.   %rT   r      主力合约基差u   主力合约基差(%))r   )r[      现货价格   主力合约代码   主力合约价格T)
left_indexright_index)   180日内主力基差最高   180日内主力基差最低   180日内主力基差平均)	r[   r   r   r   r      主力合约变动百分比r   r   r   r   r   )r   r   r   r   r   r<   r=   r>   r?   r@   r   rA   r   r   rJ   endswithr   r   r   r6   merger   r   )r   rM   r/   r   mainheadervaluesbasiss           r!   futures_spot_price_previousr   -  s:    '+&64T"""HM<O<O<Q<QDhmD!Q''''b
 
 	
 }}Xh..x00>>>???|~~
--F
G
GC FG $C999G1:DF$q'+&&s++,FFN 71R4=A	'!B$-((&:<S%TUUU)+BCEM ,EKHUUUV	  E H  	
   E
 
 
EM ,11N+O+S+Y+YZ]+^+^E
'(	d...Lr#   __main__20260303PL)r	   r
   r   )r   )r$   )__doc__r   rD   rG   r?   typingr   pandasr   akshare.futuresr   akshare.futures.requests_funr   akshare.futures.symbol_varr   get_calendarr>   contract_symbolsrJ   listr"   rA   r   rF   r   r   __name__futures_spot_price_daily_dfrI   futures_spot_price_dffutures_spot_price_previous_dfr5   r#   r!   <module>r      s"     				                         > > > > > > 9 9 9 9 9 94  +- --- - - - -b d.C@* @*
@*'+@*\@* @* @* @*FM M M`     H Hc H2< H H H HV z":":jTF# # # 
E
%&&&..J???	E
   %@%@j%Q%Q%Q"	E
())))) r#   