Ë
    LµCjÓ  ã                   óÆ   — d Z ddlZddlZddlmZ ddlZddlZddlZ	ddl
mZ ddlmZmZ  ee«      ZdZdedej&                  d	eedz  ef   fd
„Zdd„Zedk(  r e«        yy)uÖ   
Train SARIMAX climate forecasting models â€” one per district.

Usage:
    python -m ml_pipeline.training.train_sarimax_climate         --input data/processed/climate_clean.csv         --output-dir data/models/v1
é    N)ÚPath)ÚSARIMAX)Ú
get_loggerÚsave_training_metadataé$   ÚdistrictÚseriesÚreturnc                 óÌ  — t        |«      t        k  r=t        j                  d| › dt        |«      › dt        › d�«       d ddt        |«      dœfS 	 t	        j
                  «       5  t	        j                  d«       t        j                  |d	d
d	d	ddddd¬«
      }d d d «       j                  \  }}}|j                  \  }}}}	t        ||||f||||	fdd¬«      }
|
j                  d¬«      }|d|||g||||	gt        |j                  «      t        |«      dœfS # 1 sw Y   Œ€xY w# t        $ r5}t        j!                  d| › d|› �«       d dt#        |«      dœfcY d }~S d }~ww xY w)Nz
District 'z' has only z months of data (need u   +) â€” skippingÚskippedÚinsufficient_data)ÚstatusÚreasonÚn_monthsÚignoreTé   é   é   )	ÚseasonalÚmÚstepwiseÚsuppress_warningsÚerror_actionÚmax_pÚmax_qÚmax_PÚmax_QF)ÚorderÚseasonal_orderÚenforce_stationarityÚenforce_invertibility)ÚdispÚtrained)r   r   r   Úaicr   zTraining failed for district 'z': Úfailed)r   r   )ÚlenÚMIN_MONTHS_REQUIREDÚloggerÚwarningÚwarningsÚcatch_warningsÚsimplefilterÚpmÚ
auto_arimar   r   r   ÚfitÚfloatr$   Ú	ExceptionÚerrorÚstr)r   r	   ÚautoÚpÚdÚqÚPÚDÚQÚsÚmodelÚresultÚexcs                úWC:\Crop_Prediction\Backend\crop-ai-system\ml_pipeline\training\train_sarimax_climate.pyÚtrain_district_modelr@      s�  € Ü
ˆ6ƒ{Ô(Ò(Ü�‰Ø˜˜
 +¬c°&«k¨]ð ;Ü(Ð)¨ð:ô	
ð  	Ð5HÔVYÐZ`ÓVaÑbÐbÐbð">Ü×$Ñ$Ó&ñ 
	Ü×!Ñ! (Ô+Ü—=‘=ØØØØØ"&Ø%Ø˜q¨°ôˆD÷
	ð —*‘*‰ˆˆ1ˆaØ×(Ñ(‰
ˆˆ1ˆa�äØØ�a˜�)Ø˜q ! Q˜<Ø!&Ø"'ô
ˆð —‘ �Ó&ˆàØØ˜˜A�YØ  ! Q¨˜lÜ˜Ÿ™Ó$Ü˜F›ñ
ð 
ð 	
÷1
	ð 
	ûô> ò >Ü�‰Ð5°h°Z¸sÀ3À%ÐHÔIØ ´C¸³HÑ=Ð=Õ=ûð>ús7   ÁD% Á%5DÂA>D% ÄD"ÄD% Ä%	E#Ä.*EÅE#ÅE#c                  ó  — t        j                  d¬«      } | j                  dd¬«       | j                  dd¬«       | j                  «       }t	        j
                  |j                  «      }h d£}|t        |j                  «      z
  }|rt        d|› �«      ‚t        |d	   j                  «       «      }t        j                  d
t        |«      › d�«       i }i }|D ]º  }||d	   |k(     j                  ddg«      j!                  «       }	t	        j"                  |	d   j%                  t&        «      dz   |	d   j%                  t&        «      z   dz   «      |	d<   |	j)                  d«      }	|	d   j+                  d«      }
t-        ||
«      \  }}|||<   |€Œ¶|||<   Œ¼ |st/        d«      ‚t1        |j2                  «      }|j5                  dd¬«       |dz  }t7        j8                  ||«       t;        d„ |j=                  «       D «       «      t?        dt;        d„ |j=                  «       D «       «      «      z  }tA        |d||dœdgt;        d„ |j=                  «       D «       «      d¬«       t        j                  dt        |«      › d t        |«      › d!�«       t        j                  d"|› �«       |jC                  «       D �	�cg c]  \  }	}|d#   d$k7  sŒ|	‘Œ }}	}|r%t        jE                  t        |«      › d%|› d&�«       y y c c}}	w )'Nz)Train SARIMAX climate models per district)Údescriptionz--inputT)Úrequiredz--output-dir>   ÚyearÚmonthr   Úrainfall_mmz%Input file missing required columns: r   z$Training SARIMAX climate models for z
 districtsrD   rE   ú-z-01ÚdaterF   ÚMSzzZero district models were successfully trained. Check that climate_clean.csv has enough history per district (36+ months).)ÚparentsÚexist_okzsarimax_climate.pklc              3   óP   K  — | ]  }|j                  d «      dk(  sŒ|d   –— Œ  y­w)r   r#   r$   N©Úget©Ú.0Úrs     r?   ú	<genexpr>zmain.<locals>.<genexpr>o   s(   è ø€ ò Ø°a·e±e¸H³oÈÓ6Rˆˆ%�ñùs   ‚&œ
&é   c              3   óJ   K  — | ]  }|j                  d «      dk(  sŒd–— Œ y­w)r   r#   rS   NrM   rO   s     r?   rR   zmain.<locals>.<genexpr>q   s   è ø€ ÒW˜¸!¿%¹%À»/ÈYÓ:V”1ÑWùs   ‚#œ#Úsarimax_climate)Úavg_aicÚper_district_reportz1rainfall_mm (univariate time series per district)c              3   ó@   K  — | ]  }|j                  d d«      –— Œ y­w)r   r   NrM   rO   s     r?   rR   zmain.<locals>.<genexpr>x   s   è ø€ ÒK¨Q�A—E‘E˜* a×(ÑKùs   ‚r   )Ú
model_nameÚmetricsÚfeature_colsÚn_trainÚn_testzTrained ú/z district models successfullyz	Saved to r   r#   z* districts have NO trained climate model: z{. The live API will return degraded climate results for these districts (see app/services/model_runners.run_climate_model).)#ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsÚpdÚread_csvÚinputÚsetÚcolumnsÚ
ValueErrorÚsortedÚuniquer(   Úinfor&   Úsort_valuesÚcopyÚto_datetimeÚastyper3   Ú	set_indexÚasfreqr@   ÚRuntimeErrorr   Ú
output_dirÚmkdirÚjoblibÚdumpÚsumÚvaluesÚmaxr   Úitemsr)   )ÚparserÚargsÚdfÚrequired_colsÚmissingÚ	districtsÚmodelsÚtraining_reportr   r6   r	   r<   Úreportrs   Úoutput_pathrV   rQ   r   s                     r?   Úmainr…   G   s÷  € Ü×$Ñ$Ð1\Ô]€FØ
×Ñ˜	¨DÐÔ1Ø
×Ñ˜°ÐÔ6Ø×ÑÓ€Dä	�‰�T—Z‘ZÓ	 €BÚ@€MØœc "§*¡*›oÑ-€GÙÜÐ@ÀÀ	ÐJÓKÐKä�r˜*‘~×,Ñ,Ó.Ó/€IÜ
‡K�KÐ6´s¸9³~Ð6FÀjÐQÔRà "€FØ')€Oàò 	%ˆØˆr�*‰~ Ñ)Ñ*×6Ñ6¸ÀÐ7HÓI×NÑNÓPˆÜ—N‘N 1 V¡9×#3Ñ#3´CÓ#8¸3Ñ#>ÀÀ7Á×ARÑARÔSVÓAWÑ#WÐZ_Ñ#_Ó`ˆˆ&‰	Ø�K‰K˜ÓˆØ�=Ñ!×(Ñ(¨Ó.ˆä,¨X°vÓ>‰ˆˆvØ$*ˆ˜Ñ!ØÑØ$ˆF�8Òð	%ñ ÜðNó
ð 	
ô
 �d—o‘oÓ&€JØ×Ñ˜T¨DÐÔ1ØÐ4Ñ4€KÜ
‡K�K�˜Ô$äñ Ø)×0Ñ0Ó2ôó äˆAŒsÑW˜o×4Ñ4Ó6ÔWÓWÓXñY€Gô ØØ$Ø#¸OÑLØIÐJÜÑK°/×2HÑ2HÓ2JÔKÓKØõô ‡K�K�(œ3˜v›;˜- q¬¨Y«Ð(8Ð8UÐVÔWÜ
‡K�K�)˜K˜=Ð)Ô*Ø,×2Ñ2Ó4×Q‘T�Q˜¸¸(¹ÀyÓ8PŠqÐQ€GÑQÙÜ�‰Ü�7‹|ˆnÐFÀwÀið PLð Mõ	
ð ùó Rs   Ë L ËL Ú__main__)r
   N)Ú__doc__r_   r*   Úpathlibr   ru   Úpandasrc   Úpmdarimar-   Ú"statsmodels.tsa.statespace.sarimaxr   Ú#ml_pipeline.training.training_utilsr   r   Ú__name__r(   r'   r3   ÚSeriesÚtupleÚobjectÚdictr@   r…   © ó    r?   ú<module>r”      s|   ðñó Û Ý ã Û Û Ý 6ç Rá	�HÓ	€àÐ ð*> 3ð *>°·	±	ð *>¸eÀFÈTÁMÐSWÐDWÑ>Xó *>óZ=
ð@ ˆzÒÙ…Fð r“   