+
    i\              
      z   R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI	t^ RI
Ht ^ RIHt ^ RIHt ^ RIt^ RIt]! ]4      P)                  4       P*                  ^,          t]R,          R,          R,          t]P1                  R	R	R
7       ]P2                  ! RR4      tRt]P2                  ! RR4      tRtRtRtR4R5R6R7R8R9R:R;R<R=/t RR>RR?/t!Rt"Rt#Rt$R R lt%R R lt&R R lt'R t(R@R R  llt)R! R" lt*R# R$ lt+RAR% R& llt,R' R( lt-R) R* lt.R+ R, lt/R- R. lt0RBR/ R0 llt1]t]tRCR1 R2 llt2]3R38X  d
   ]0! 4        R# R# )Du  
auto_rates_loader.py
=====================
Automated rate data fetcher for EURUSD + USDJPY dual macro model.

Source priority (FinanceFlow first — real-time, authenticated):
  Primary:   FinanceFlow Real-Time Government Bond API
  Fallback:  FRED (St. Louis Fed) / Bundesbank / MoF Japan CSV

Series fetched:
  us2y.csv   — US 2Y Treasury yield
  us10y.csv  — US 10Y Treasury yield
  de2y.csv   — DE 2Y Bund yield
  de10y.csv  — DE 10Y Bund yield
  jp2y.csv   — JP 2Y JGB yield

FinanceFlow bond API:
  Endpoint: /real-time-government-bond
  Auth: api_key parameter
  Countries: United States, Germany, Japan
  Maturity mapping: 2Y, 10Y

Run standalone:
  python src/ingestion/auto_rates_loader.py
)annotationsN)StringIO)Path)OptionaldatarawratesT)parentsexist_okFINANCEFLOW_API_KEY@2d9e4c37c81f1b4c970d7b1f8d7d382ff450312cd0adf57117f28d5708e6e38ez!https://financeflowapi.com/api/v1FRED_API_KEY b4e39ea4507e1ceca1a389cfacee8a00z3https://api.stlouisfed.org/fred/series/observationszjhttps://api.statistiken.bundesbank.de/rest/download/BBSSY/D.REN.EUR.A610.000000WT0202.A?format=csv&lang=enzjhttps://api.statistiken.bundesbank.de/rest/download/BBSSY/D.REN.EUR.A630.000000WT1010.A?format=csv&lang=enus2y.csv	us10y.csvzthttps://data-api.ecb.europa.eu/service/data/YC/B.U2.EUR.4F.G_N_A.SV_C_YM.SR_2Y?format=csvdata&startPeriod=2004-01-01zuhttps://data-api.ecb.europa.eu/service/data/YC/B.U2.EUR.4F.G_N_A.SV_C_YM.SR_10Y?format=csvdata&startPeriod=2004-01-01z[https://www.mof.go.jp/english/policy/jgbs/reference/interest_rate/historical/jgbcme_all.csvc               $    V ^8  d   QhRRRRRR/# )   dfpd.DataFramefilenamestrreturnNone )formats   "TC:\Users\Administrator\OneDrive\fx_macro_intraday\src\ingestion\auto_rates_loader.py__annotate__r   c   s!     = =l =c =d =    c                    \         V,          pV P                  VR R7       \        RV R\        V 4       RV R,          P	                  4        RV R,          P                  4        24       R# )F)indexz  Saved z | rows=z	 | range=datez -> N)
RATES_PATHto_csvprintlenminmax)r   r   outs   && r   _saver(   c   sa    
x
CIIcI	HXJhs2wi 0f:>>#$DF)9(:< =r   c               $    V ^8  d   QhRRRRRR/# )r   r   r   colr   r   r   )r   s   "r   r   r   j   s!     < <| <# <, <r   c                   V P                  4       p V P                   Uu. uF   q"P                  4       P                  4       NK"  	  upV n        R F=  w  r4W0P                  9   g   K  W@P                  9  g   K)  V P	                  W4/RR7       K?  	  RV P                  9  g   RV P                  9  dl   \        V P                  4      ^8  d,   V P                  R,          P                  4       p RR.V n        M&\        RV P                  P                  4        24      h\        P                  ! V R,          RRR7      V R&   \        P                  ! V R,          RR	7      V R&   V P                  RR.R
7      P                  R4      P                  R4      P                  RR7      p V R,          P                   P#                  R4      V R&   V P	                  RV/R7      RV.,          # u upi )observation_dater    valueT)columnsinplacez Cannot find date/value columns: coerceF)errorsutcr1   subsetdrop%Y-%m-%dr.   ))r,   r    time_periodr    )	obs_valuer-   r:   :NNN:Nr   N)copyr.   striplowerrenamer$   iloc
ValueErrortolistpdto_datetime
to_numericdropnadrop_duplicatessort_valuesreset_indexdtstrftime)r   r*   coldnews   &&   r   _cleanrQ   j   s}   	B-/ZZ8Z'')//#Z8BJC**JJ!6IIsj$I7C RZZ7"**#<rzz?a$$&BfW5E
?

@Q@Q@S?TUVV..FH%HBvJ--7H=BwK
))F7+)
,_V$[ [d[#  F''
3BvJ99gs^9,fc];;# 9s   &G&c               (    V ^8  d   QhRRRRRRRR/# )r   existing_pathr   freshr   r*   r   r   r   )r   s   "r   r   r      s(      t L s | r   c                   V P                  4       '       d   \        P                  ! V 4      pVP                   Uu. uF   qDP	                  4       P                  4       NK"  	  upVn        \        VP                  4      ^8  d+   VP                  R	,          P                  4       pRV.Vn        \        P                  ! VR,          RR7      VR&   \        P                  ! W2,          RR7      W2&   \        P                  ! W1.RR7      pMVP                  4       p\        P                  ! VR,          RR7      VR&   \        P                  ! WR,          RR7      WR&   VP                  RV.R7      P                  R4      P                  R4      P                  RR7      pVR,          P                   P#                  R4      VR&   \%        WPP&                  4       V# u upi )
z6Merge fresh data into existing CSV, deduplicate, save.r    r0   r3   Tignore_indexr4   r6   r8   r=   )existsrE   read_csvr.   r?   r@   r$   rB   r>   rF   rG   concatrH   rI   rJ   rK   rL   rM   r(   name)rS   rT   r*   rO   rN   combineds   &&&   r   _merge_saver]      s_   kk-(25++>+Qwwy(+>s{{q ((5/&&(C#+nnS[BFmmCHX>99c\=::< ~~hv&6xHHV}}X]8DHM}5(0$V,$$/   '**33J?HV	(&&'O% ?s   &Gc                 h    \         P                  ! 4       p R V n        \         P                  V n        V # )F)sslcreate_default_contextcheck_hostname	CERT_NONEverify_mode)ctxs    r   _ssl_ctxre      s(    

$
$
&CCCOJr   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r   countryr   maturityr*   days_historyintr   r   r   )r   s   "r   r   r      s8     K KC K3 KS K),K7CKr   c                    ^ RI H pHp RP                  R V P                  4        4       4      pVP	                  4       pVP                  4       V! ^R7      ,
          P                  R4      p\        V^c4      p	VP                  4       V! V	R7      ,
          P                  R4      p
\         R2pR\        RVR	VR
RRV
RV/p\        P                  ! W^R7      pVP                  R8X  d   \        R4      hVP                  R8X  d   \        RV 24      hVP                  4        VP                  4       pVP                  RR4      '       g   \        RVP                  RR4       24      hVP                  R. 4      pV'       g   \        RV RV 24      h\         P"                  ! V4      pVP$                   Uu. uF!  pVP	                  4       P'                  4       NK#  	  upVn        \)        R VP$                   4       R4      p\)        R VP$                   4       R4      pV'       d	   V'       g-   \        RVP$                  P+                  4        RV RV 24      hVVV.,          P-                  4       pR R!.Vn        \/        VV4      # u upi )"a  
Fetch government bond yield history from FinanceFlow.

Correct endpoints (from official docs):
  Spot:    GET /bonds-spot?country=united_states&type=2y
  History: GET /bonds-history?country=united_states&type=2y
                              &frequency=day&date_from=...&date_to=...

Country format: lowercase underscore (e.g. "united_states", "germany", "japan")
Maturity type:  lowercase (e.g. "2y", "10y")
Spot response:  data[0].bond_yield
History response: data[].yield, data[].date

Returns DataFrame with columns [date, col].
)datetime	timedelta_c              3  @   "   T F  qP                  4       x  K  	  R # 5iN
capitalize.0ws   & r   	<genexpr>)fetch_financeflow_bond.<locals>.<genexpr>        DOqLLNNO   )daysr8   z/bonds-historyapi_keyrg   type	frequencyday	date_fromdate_toparamstimeouti  u.   FinanceFlow 403 — check API key/subscriptioni  u(   FinanceFlow 404 — endpoint not found: successTzFinanceFlow error: messageunknownr   z!FinanceFlow: no history data for  c              3  8   "   T F  pVR9   g   K  Vx  K  	  R# 5i)yieldN)r   
bond_yieldr-   rater   rt   rN   s   & r   rv   rw      s!      HAFF a   	
Nc              3  8   "   T F  pR V9   g   K  Vx  K  	  R# 5i)r    Nr   r   s   & r   rv   rw      s     ;Av{aar   z FinanceFlow: unexpected columns z for r    r-   )rl   rm   joinsplitr@   nowrM   r%   FF_BASE_URL
FF_API_KEYrequestsgetstatus_coderC   raise_for_statusjsonrE   	DataFramer.   r?   nextrD   r>   rQ   )rg   rh   r*   ri   rl   rm   country_apimaturity_apiend_datewindow
start_dateurlr   rpayloadrecordsr   rN   	yield_coldate_colresults   &&&&                 r   fetch_financeflow_bondr      sV   " - 88DGMMODDK>>#L
 ,,.9!#44>>zJH\2&F,,.9&#99CCJOJ }N+CZ[\UZXF 	S4A}}IJJ}}CC5IJJffhG;;y$''.w{{9i/P.QRSSkk&"%G/}Al^LN 	N 
g	B-/ZZ8Z!'')//#Z8BJ  H HIMOI;;TBHH.rzz/@/@/B.C D-q01 	1 9%&++-Fg&FN&# 9s   8'Jc               (    V ^8  d   QhRRRRRRRR/# )r   rg   r   rh   r*   r   r   r   )r   s   "r   r   r      s(      C 3 S \ r   c           	        ^ RI H p RP                  R V P                  4        4       4      pVP                  4       p\         R2pR\
        RVRV/p\        P                  ! Wg^R7      pVP                  ^8w  d   \        R	VP                   24      hVP                  4       p	V	P                  R
. 4      p
V
'       g   \        R4      hV
^ ,          pVP                  RVP                  RVP                  R4      4      4      pVP                  4       P                  R4      p\        P                  ! RVR\        V4      /.4      p\!        W4      # )z
Fetch single real-time bond yield from /bonds-spot.
Returns one-row DataFrame with today's date and current yield.
Used to append today's value when history has a lag.
rl   rn   c              3  @   "   T F  qP                  4       x  K  	  R # 5irp   rq   rs   s   & r   rv   )fetch_financeflow_spot.<locals>.<genexpr>   rx   ry   z/bonds-spotr{   rg   r|   r   zFinanceFlow spot r   zFinanceFlow spot: no datar   r   r-   r8   r    )rl   r   r   r@   r   r   r   r   r   rC   r   r   rM   rE   r   floatrQ   )rg   rh   r*   rl   r   r   r   r   r   r   r   rec	yield_valtodayr   s   &&&            r   fetch_financeflow_spotr      s    "88DGMMODDK>>#L}K(CYV\RFS4A}},Q]]O<==ffhGkk&"%G455AJCcgggswww7G&HIILLN##J/E	wi0@AB	CB"?r   c                   V ^8  d   QhRR/# )r   r   zdict[str, pd.DataFrame]r   )r   s   "r   r   r     s      6 r   c                     / p \         P                  4        EF#  w  w  rw  r4p \        WWER7      p \        WV4      p\        P
                  ! Wg.RR7      p\        P                  ! VR,          RR7      VR&   \        P                  ! Wd,          RR7      Wd&   VP                  RV.R7      P                  R4      P                  R4      P                  RR7      pVR,          P                  P                  R	4      VR&   Wd3W&   \        R
V RV R\!        V4       RVR,          P#                  4        24       EK&  	  V #   \         d     LNi ; i  \         d!   p\        R
T RT RT 24        Rp?EKa  Rp?ii ; i)z
Fetch all required rate series from FinanceFlow.
Uses /bonds-history for full date range, then appends /bonds-spot
for today's value (history may lag by 1 day).
Returns {filename: (DataFrame, col)} for successful fetches.
)ri   TrV   r    r0   r3   r4   r6   r8   z  FinanceFlow r   z: u
    rows → z	 failed: N)FF_BOND_MAPitemsr   r   rE   rZ   rF   rG   rH   rI   rJ   rK   rL   rM   	Exceptionr#   r$   r&   )	resultsrg   rh   fnamer*   rz   r   spotes	            r   fetch_all_financeflowr     sm    G3>3D3D3F//e$	E'3RB-gEYYz=^^BvJxH6
]]278Dii}i5(0$V,$$/   Z]]33J?6
 !YGNN7)1XJbWIZ6
(8'9; <# 4G* N  
  	EN7)1XJisCDD	Es;   ECE :EEEEEE=E88E=c               (    V ^8  d   QhRRRRRRRR/# )r   	series_idr   r*   observation_startr   r   r   )r   s   "r   r   r   0  s*       3 ),@Lr   c                8   R V R\         RRRV/p\        P                  ! \        V^R7      pVP	                  4        VP                  4       P                  R. 4      pV'       g   \        RV  24      h\        P                  ! V4      RR	.,          p\        Wa4      # )
r   r{   	file_typer   r   r   observationszNo FRED observations for r    r-   )
r   r   r   	FRED_BASEr   r   rC   rE   r   rQ   )r   r*   r   r   r   obsr   s   &&&    r   fetch_fred_seriesr   0  s     	Y\V.	F 	Yvr:A
&&(,,~r
*C4YK@AA
,,s
VW-
.C#r   c               $    V ^8  d   QhRRRRRR/# )r   csv_urlr   r*   r   r   r   )r   s   "r   r   r   E  s!      S s | r   c                   R R/p\         P                  ! W^<R7      pVP                  4        VP                  P	                  4       p\        R \        V4       4       R4      pVe   RP                  WER 4      MVP                  p \        P                  ! \        V4      RRR7      p\        Wq4      #   \         d#    \        P                  ! \        T4      4      p L7i ; i)Accepttext/csv)headersr   c              3     "   T Fh  w  rR VP                  4       9   g   RVP                  4       9   g   K1  RVP                  4       9   g   RVP                  4       9   g
   RV9   g   Kd  Vx  Kj  	  R# 5i)r    r;   r-   r<   ;Nr@   rt   ils   &  r   rv   *fetch_bundesbank_series.<locals>.<genexpr>K  s]      	L'tqqwwy MQWWY$> 
	![AGGI%= 
's   .A2.A2(
A2N
python)sepengine)r   r   r   text
splitlinesr   	enumerater   rE   rY   r   r   rQ   )r   r*   r   r   lines
header_idxsampler   s   &&      r   fetch_bundesbank_seriesr   E  s    $GWr:AFFE	Ly' 	L 		J /9.DTYYu[)*!&&F,kk(6*XF #  ,kk(6*+,s   "B4 4*C! C!c               $    V ^8  d   QhRRRRRR/# )r   r   r   r*   r   r   r   )r   s   "r   r   r   X  s!      # C L r   c           	     .   \         P                  ! V ^RR/R7      pVP                  4        VP                  P	                  4        Uu. uF  q3P                  4       '       g   K  VNK  	  pp\        R \        V4       4       ^ 4      p\        P                  ! \        RP                  WER 4      4      4      pVP                   Uu. uF   qwP                  4       P                  4       NK"  	  upVn        \        R VP                   4       R4      p\        R VP                   4       R4      p	V'       d	   V	'       g'   \        R	VP                  P                  4        24      hWhV	.,          P!                  VR
V	R/R7      p\#        Wa4      # u upi u upi )z#ECB SDMX CSV fallback for DE rates.r   r   )r   r   c              3     "   T F5  w  rR VP                  4       9   g   RVP                  4       9   g   K1  Vx  K7  	  R# 5i)r;   r    Nr   r   s   &  r   rv   #fetch_ecb_series.<locals>.<genexpr>^  s7      I!1#qwwy0Faggi4G 1!1s   .?
?r   Nc              3  F   "   T F  pR V9   g
   RV9   g   K  Vx  K  	  R# 5i)timer    Nr   r   s   & r   rv   r   b  s     D+Q1!qq+   !
!c              3  F   "   T F  pR V9   g
   RV9   g   K  Vx  K  	  R# 5i)r<   r-   Nr   r   s   & r   rv   r   c  s     J+Q)9W\qq+r   z!ECB: can't find date/value cols: r    r-   r9   )r   r   r   r   r   r?   r   r   rE   rY   r   r   r.   r@   rC   rD   rA   rQ   )
r   r*   r   r   r   headerr   rN   tcvcs
   &&        r   fetch_ecb_seriesr   X  sB   S"&
3	5A**,:,A	aa,E: I5!1 IJKMF[[$))E'N";<=C.1kk:k779??$k:CK	D#++Dd	KB	J#++JD	QBR<S[[=O=O=Q<RSTT
2h-

FB'@

AC# ; ;s   F$F&Fc                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   n  s     - - -r   c                    \        4       p \        P                  P                  \        RR/R7      p\        P                  P                  V^-V R7      ;_uu_ 4       pVP                  4       pRRR4       R F  p XP                  V4      p M	  XP                  4        Uu. uF5  qfP                  4       '       g   K  VP                  R4      '       d   K3  VNK7  	  ppV'       g   \        R4      hV^ ,          P                  R4      pVP                  R	4       U	u. uF!  qP                  4       P                  R
4      NK#  	  p
p	\!        R \#        V
4       4       ^4      p. pVR,           F  pVP                  R	4       Uu. uF!  qP                  4       P                  R
4      NK#  	  pp\%        V4      V8:  d   KQ   R F#  p ^ RIHp VP)                  V^ ,          V4      p M	  \+        W,          4      pVP-                  RXP/                  R4      RV/4       K  	  \2        P4                  ! V4      P7                  R4      P9                  R4      p\%        V4      ^d8  d   \        R\%        V4       R24      hV#   + '       g   i     EL; i  \        \        3 d     EK1  i ; iu upi u up	i u upi   \         d     EK	  i ; i  \        \0        3 d     EKv  i ; i)u1   MoF Japan JGB benchmark rates — robust fetcher.z
User-Agentz)Mozilla/5.0 (Windows NT 10.0; Win64; x64))r   )r   contextN#zMoF Japan: empty responseu   ﻿,"c              3  <   "   T F  w  rVR9   g   K  Vx  K  	  R# 5i)2YN)r   2yr   )rt   r   rN   s   &  r   rv   !fetch_mof_jp2y.<locals>.<genexpr>  s     EA4D11s   
:   NNr8   r   r    jp2yzMoF Japan: too few rows ())z	utf-8-sigzutf-8z	shift-jiszlatin-1)z%Y/%m/%dr8   )re   urllibrequestRequestMOF_JAPAN_URLurlopenreaddecodeUnicodeDecodeErrorLookupErrorr   r?   
startswithrC   lstripr   r   r   r$   rl   strptimer   appendrM   
IndexErrorrE   r   rI   rJ   )rd   reqresp	raw_bytesencr   r   r   r   rN   colscol2yrowslineppartsfmtrl   rL   valr   s                        r   fetch_mof_jp2yr  n  sq   
*C
..
 
 JK ! C 
		R		=	=IIK	 
>=	##C(D% > )Q)1WWYQq||C?PQQ)EQ455 1X__X&F,2LL,=>,=qggiooc",=D>E4EqIEDb		/3zz#?!%?u:	/1!**58S9B	 0 %CKKZ!8&#FG " 
d		+	+F	3	?	?	GB
2w}4SWIQ?@@IM 
>	=	=
 #K0 		 R ?
 @ "  J' 		sr   I?;J"J,>J,J,'J1'J6?KJ;$9K?J	J)(J);KK
KKK$#K$c                   V ^8  d   QhRR/# )r   r   boolr   )r   s   "r   r   r     s     Q Q$ Qr   c                    \        R4       / p . p\        R4       \        4       pVP                  4        F%  w  pw  rE\        V,          p\	        WdV4       RW&   K'  	  \
        P                  4        FF  w  pw  ruW09   d   K  \        RV R24        \        Wu4      p\	        \        V,          WE4       RW&   KH  	  RR	\        \        3R
R\        \        3.p	V	 FD  w  r5rW09   d   K  \        RV R24        \        W4      p\	        \        V,          WE4       RW&   KF  	  RV 9  d4   \        R4        \#        4       p\	        \        R,          VR4       RV R&   \        R\!        V 4       R2V'       d   RV 2MR,           4       V'       d   \        R4       \        R4       \!        V4      ^ 8H  #   \         d,   p\        RT 24       TP                  T4        Rp?EKs  Rp?ii ; i  \         d*   p\        R\        T4      R,           R24        Rp?MRp?ii ; i \        Y4      p\	        \        T,          YE4       RY&   \        R\!        T4       R24       EK    \         d,   p\        RT 24       TP                  T4        Rp?EK  Rp?ii ; i  \         d+   p\        RT 24       TP                  R4        Rp?ELsRp?ii ; i)u&  
Update all rate CSVs using FinanceFlow as primary, fallbacks as backup.

Priority per series:
  us2y / us10y:  FinanceFlow → FRED
  de2y / de10y:  FinanceFlow → Bundesbank → ECB
  jp2y:          FinanceFlow → MoF Japan

Returns True if all critical rates updated, False if any failed.
zUpdating rate data...z8  [Primary] FinanceFlow Real-Time Government Bond API...Tz  [Fallback FRED] z...z    FRED failed: Nde2y.csvde2y	de10y.csvde10yz  [Fallback Bundesbank] z    Bundesbank failed (N<   Nu   ) — trying ECB...z    Source: ECB fallback ( rows)z    ECB also failed: jp2y.csvz"  [Fallback MoF Japan] jp2y.csv...r   z    MoF Japan failed: z
  Updated: z	/5 seriesz | Failed: u    | All OK ✅z:  NOTE: Failed series will use last known values from CSV.u9     Rate data changes slowly — 1-2 day lag is acceptable.)r#   r   r   r!   r]   FRED_SERIESr   r   r  BUNDESBANK_DE2Y_CSVECB_DE2Y_URLBUNDESBANK_DE10Y_CSVECB_DE10Y_URLr   r   r   r$   r  )updatedfailed
ff_resultsr   r   r*   pathr   r   de_fallbacksbb_urlecb_urle2s                r   update_all_ratesr)    s    

!"GF 

DE&(J&,,.yE!Dc" / $/#4#4#6	"5'-.	!"92B
U*B4!GN $7 
f2\B	g3]CL (4#F(s34	N(5B
U*B4!GN (4*  23	&!B
Z/V<"&GJ 
M#g,y
1'-{6(#?D E JKIJv;!a  	!%aS)*MM%  	!$  	N+CF3K=8KLMM	N	!!'/B
U*B4!GN.s2wiv>? 	!)"./MM%  	!  	&*1#./MM*%%	&s`   &F48&G-5'J 4G*?G%%G*-H!8HH!%>I&&J1JJK*KKc               $    V ^8  d   QhRRRRRR/# )r   local_filenamer   value_col_namer   r   r   )r   s   "r   r   r     s(     I IS I%(I=IIr   c                   \         V ,          p \        4        VP	                  4       '       d   \
        P                  ! V4      # \        RV 24      h  \         d   p\        RT R24        Rp?LYRp?ii ; i)u   
Compatibility shim — called by live_signal_monitor_v2 with old-style args.
Ignores fetch_fn and fetch_kwargs entirely; just calls update_all_rates()
which handles FinanceFlow primary + all fallbacks correctly.
Returns the saved CSV as a DataFrame.
z  update_all_rates failed: u    — using cached CSVNz"Rate file not found after update: )r!   r)  r   r#   rX   rE   rY   FileNotFoundError)r+  fetch_fnr,  fetch_kwargsr$  r   s   &&$,  r   update_local_csvr1    ss     &DF {{}}{{4  
@G
HH	  F+A3.CDEEFs   
A A7A22A7c               (    V ^8  d   QhRRRRRRRR/# )r   r   r   r,  output_namer   r   r   )r   s   "r   r   r     s+      C 4714>Jr   c                     \        W4      #   \         db   p\        R\        T4      R,           R24       RT9   d   \        M\
        p\        YA4      p\        R\        T4       R24       Tu Rp?# Rp?ii ; i)u<   Bundesbank with ECB fallback — used by compatibility shim.z  Bundesbank failed (r  u   ) — trying ECB fallback...r  z  Source: ECB fallback (r  N)r   r   r#   r   r  r   r   r$   )r   r,  r3  r   r'  r   s   &&&   r   fetch_bundesbank_series_compatr5    sp    &w?? %c!fSk]2NOP"(N":,g6(R	89	s   
 A9AA4.A94A9__main__)United Statesr   )r   us2yT3  )r7  10y)r   us10yr9  )Germanyr   )r  r  ^  )r<  r:  )r  r  r=  )Japanr   )r  r   i$J  )DGS2r8  )DGS10r;  )im  )z
1990-01-01rp   ) )4__doc__
__future__r   osr_   csv_csvurllib.requestr   urllib.parseior   pathlibr   typingr   pandasrE   r   __file__resolver	   	BASE_PATHr!   mkdirgetenvr   r   r   r   r  r  r   r  r  r   r   r(   rQ   r]   re   r   r   r   r   r   r   r  r)  r1  r5  __name__r   r   r   <module>rS     s  4 # 	 
        (^##%--a0	%''1
 
    - yy.QS
2yy)KLD	7 
7  >>>>>	 "#- 
-   =<,2K\4H*&,-hQnI$ + + & z r   