
    LCj                         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] ;():	
 	5HVYZ`Vabbb">$$& 
	!!(+=="&%qD
	 **1a((
1aa)q!Q<!&"'
 &AY !Ql$F
 
 	
1
	 
	>  >5hZs3%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(      aeeHo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:V1Ws   ##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     KQAEE*a(Ks   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	TZZ	 B@Mc"**o-G@	JKKr*~,,./I
KK6s9~6FjQR "F')O 	%r*~)*667HINNPNN1V9#3#3C#83#>7ARARSVAW#WZ_#_`&	KK=!((.,Xv>v$*!$F8	% N
 	

 doo&JTD144K
KK$ )002 AsWo446WWXYG $#OLIJK/2H2H2JKK KK(3v;-qY(88UVW
KK)K=)*,224QTQ(y8PqQGQ7|nFwi 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 *>		 *>eFTMSWDW>X *>Z=
@ zF r   