o nÇg`vã@sždZddlZddlZddlZddlZddlZddlZddlZej   ¡ddl Z ddl Z e  d¡ddlmZddlmZddlZddlmZGdd„dƒZdS)zà Name: subseasonal_plots_lead_average.py Contact(s): Shannon Shields Abstract: This script is run by subseasonal_plots.py in ush/subseasonal. This script generates a lead average plot. éNÚagg)Ú PlotSpecsc@s eZdZdZdd„Zdd„ZdS)Ú LeadAveragez' Create a lead average graphic c Cs4||_||_||_||_||_||_||_||_dS)ax! Initialize LeadAverage class Args: logger - logger object input_dir - path to input directory (string) output_dir - path to output directory (string) model_info_dict - model information dictionary (strings) plot_info_dict - plot information dictionary (strings) date_info_dict - date information dictionary (strings) met_info_dict - MET information dictionary (strings) logo_dir - directory with logo images (string) Returns: N)ÚloggerÚ input_dirÚ output_dirÚmodel_info_dictÚdate_info_dictÚplot_info_dictÚ met_info_dictÚlogo_dir) Úselfrrrrr r r r ©rúW/lfs/h1/ops/prod/packages/evs.v1.0.19/ush/subseasonal/subseasonal_plots_lead_average.pyÚ__init__s zLeadAverage.__init__c`sÌ|j d¡|j d|j›¡|j d|j›¡|j d|j›¡|j d|j›¡|j d|j›¡|jddkrP|j d |jd›¡t   d ¡t j   |jd ¡}t j  |¡sct  |¡|j d |›¡|j d ¡g}|jdD]U}|j d|›¡|j d¡t |j|jd|jd|jd|jd|jd|jd|jd|jd|jd|¡ \‰‰‡fdd„ttˆƒƒDƒ}‡fdd„ttˆƒƒDƒ}|jddkrõ|j dd  |¡d d!|›d"d  |¡¡ˆ}n#|jdd#kr|j d$d  |¡d d!|›d%d  |¡¡ˆ}|j d&|j›¡t |j|j|j|j|j|jd'|jd(|jd)|jd*|jd+|jd,|jd-|jd.|jd/|jd0|jd1|jd||t|ƒ¡}| |d2j d3¡ ¡¡|j d4|jd›d d5|jd-›d d6¡t |j||jd-|jd¡\}} |j d ¡ ¡ ¡} |jd7d8krí|j d9¡tj  !| ¡} tj  "| ¡} | j#tj$d:} | D]$} |  | ¡} | | d;d;…f|j%| <|j%|  &|j%|  '¡¡j|j%| <qÈ||jdd krt(j)tj$| |jdd<}t(j)tj$| |jdd<}| D]½} |  | ¡} |jd-d=vr(d>}|j%| }nd?}|j%| }t *|j||jd-|jd|¡}t +|¡sL||j%| |f<| | d krZ|j%| }qtj  !|j%| |¡}t|ƒtj  ,|¡}t -|¡}t .|¡}|d kr¾|t /|d@¡}|dAkr‘dB|}n5|dCkr |dAkr dD|}n&|dEkr¯|dCkr¯dF|}n|d kr½|dEkr½dG|}n|d krÆtj$}||j%| |f<qqy|j dH¡t0|jdIƒ}| 1¡dJ}t|jdƒ|krò|jd}n/g}|jdD]}t2|ƒdKd kr | 3|¡qùt|ƒ|kr!t2t|ƒ|ƒ}|d;d;|…}tj  !tj$¡tj  !tj$¡tj  !tj$¡tj  !tj$¡dLœ}| 4|jd¡} t |¡}t 5|t &|dMk¡¡}t|ƒd@krg|j 6dN¡t   d@¡nt|ƒd krw|j dO¡dPg}| 7|j|j|d ¡}!dQ}"t j   |j8dR¡}#t j  |#¡r¯dS}"t9j: ;|#¡}$| j?dU¡\}%}&}'dQ}(t j   |j8dV¡})t j  |)¡rÜdS}(t9j: ;|)¡}*| j?dU¡\}+},}-| @||j|j¡}.|j dX|jd›d ¡t>jAdYd@|j=d |j=d@fdSdZ\}/\}0}1|/ B|!¡|0 CdS¡|0 D| ¡|1 CdS¡|1 Ed[¡|1 F|jdd |jdd\g¡|1 G|¡|1 Dd]¡|1jHd^|jd_d`dTdadbdcddded@dfdgœ}2|1jIdhdidjdWdkdl|2|1jJdm|"rr|/jK|$|%|&d@|-dn}3|3 LdS¡|(r|/jK|*|+|,d@|-dn}4| M¡}5|j d ¡ ¡ ¡} t 3t N|jd¡|jdd\|jddo¡dp}6t 3t N|jd¡|jdd\|jddo¡ttO|j P¡ƒƒ}7|6|7ttO|j P¡ƒƒ}8| D]œ} |  Qdq¡d }9|  Qdq¡d@}:|  Qdq¡dY};|j|9dr}<|j%| }=|:tO|5 P¡ƒvr |5|:}>n|5|9}>|j ds|9›dt|:›d du|;›¡tj  !|=¡}?|9d_kr,|?}@t|?ƒtj  ,|?¡}Atj  Rtj  S|?¡|jTj ¡¡}B|Ad krº|j ds|9›dt|:›d du|;›¡|0jUtj  V|B¡tj  V|?¡|>dv|>dw|>dx|>dy|>dz|;ttO|j P¡ƒƒ|  | ¡d{d| |? W¡|d}ksœtj  X|d}¡r¢|? W¡|d}<|? Y¡|d~ks´tj  X|d~¡rº|? Y¡|d~<tj  !|=|@¡}Ct|Cƒtj  ,|C¡}Dtj  Rtj  S|C¡|jTj ¡¡}E|Dd krW|j ds|9›dt|:›d du|;›d|jd_d`¡|1jUtj  V|E¡tj  V|C¡|>dv|>dw|>dx|>dy|>dzttO|j P¡ƒƒ|  | ¡d{d€|C W¡|dks9tj  X|d¡r?|C W¡|d<|C Y¡|d‚ksQtj  X|d‚¡rW|C Y¡|d‚<|9d_krŒ|1jU|jTj ¡t Z|jTj ¡¡|>dv|>dw|>dx|>dy|>dzttO|j P¡ƒƒ|  | ¡d{d€|9d_krstj  !|j%| ¡}Ft|Fƒtj  ,|F¡}Gtj  Rtj  S|F¡|jTj ¡¡}H|Gd krs|j ds|9›dt|:›du|;›d dƒ|jd_d`d„¡|F W¡}I|F Y¡}J|I|dksîtj  X|d¡rùtj  X|I¡sù|I|d<|J|d‚ks tj  X|d‚¡rtj  X|J¡s|J|d‚<tj  V|H¡}Ktj  V|F¡}Ltj  Vtj  Rtj  S|F¡|6¡¡}Mtj  Vtj  Rtj  S|F¡|8¡¡}Ntt|KƒƒD].}O|K|O}|L|O}P|1j[|dYt \|P¡d\t \|P¡|M|O|N|O|  | ¡d…|>dvd@d†qDq×d@}Q|/ ]¡D]}R|d‡t|Qƒdˆ}S|d‡t|Qƒd‰}T|R ^¡d }U|R ^¡d\}V|R ^¡d@|R ^¡d }W|jddŠvrº|Qd@krºd‹}Xn|W}Xtj  X|S¡rÆ|U}Yn%|jddŠvrÛ|Qd@krÛt_|Sd@ƒ|X}Yn|U}Y|Y|Skrë|Y|X}Y|Y|Sksâtj  X|T¡rõ|V}Zn"|jddŠvr|Qd@krd@}Zn|V|X}Z|Z|Tkr|Z|X}Z|Z|Tks|R `t a|Y|Z|X|X¡¡|R b|Y|Zg¡|T|R c¡d@kr\|T|R c¡d@kr\|Z|X}Z|R `t a|Y|Z|X|X¡¡|R b|Y|Zg¡|T|R c¡d@ks<|S|R c¡d krŽ|S|R c¡d krŽ|Y|X}Y|R `t a|Y|Z|X|X¡¡|R b|Y|Zg¡|S|R c¡d ksn|Qd@7}Qq{t|0jdƒd k rN|0 ^¡d }Y|0 ^¡d\}Z|0 ^¡d@|0 ^¡d }X|d}}S|d~}T|0je|jfd |jfd@f|jg|jh|jidŒ}[t> j¡|0jk l¡}\|[ m¡}]|\ n|]jo|]jpf|]jq|]jrfg¡}^|^d@d@}_|S|_k rN|S|_k rN|Y|X}Y|0 `t a|Y|Z|X|X¡¡|0 b|Y|Zg¡|0je|jfd |jfd@f|jg|jh|jidŒ}[t> j¡|0jk l¡}\|[ m¡}]|\ n|]jo|]jpf|]jq|]jrfg¡}^|^d@d@}_|S|_ksü|j d|.¡t> s|.¡t> t¡t> udŽ¡d;S)zU! Create the lead average graphic Args: Returns: zCreating lead average...zInput directory: zOutput directory: zModel information dictionary: zDate information dictionary: zPlot information dictionary: ÚstatÚ FBAR_OBARz"Cannot make lead_average for stat rÚimageszPlots will be in: z)Building dataframe for all forecast hoursÚforecast_hoursz Building data for forecast hour z#Creating valid and init date arraysÚ date_typeÚ start_dateÚend_dateÚvalid_hr_startÚ valid_hr_endÚ valid_hr_incÚ init_hr_startÚ init_hr_endÚ init_hr_inccóg|] }ˆ| d¡‘qS©z %Y%m%d_%H%M%S©Ústrftime©Ú.0Úd)Ú valid_datesrrÚ eóÿz1LeadAverage.make_lead_average..crrr r")Ú init_datesrrr&gr'ÚVALIDz9Based on date information, plot will display valid dates z, ú zfor forecast hour z with initialization dates ÚINITzBBased on date information, plot will display initialization dates z with valid dates z!Reading in model stat files from Ú fcst_var_nameÚfcst_var_levelÚfcst_var_threshÚ obs_var_nameÚ obs_var_levelÚobs_var_threshÚ line_typeÚgridÚvx_maskÚ interp_methodÚ interp_pointsÚ FCST_UNITSÚstrzCalculating statistic zfrom line type z$average and 95% confidence intervalsÚevent_equalizationZYESzDoing event equalization)Ú fill_valueN)Úcolumns)ÚCNTÚGRADÚCTSÚNBRCTSÚNBRCNTÚVCNTÚmeanÚ aggregationééPg\Âõ(\ÿ?é(g@ég¼t“V@gmçû©ñÒ@zDoing plot set upÚ lead_averageéé)Ú ax1_stat_minÚ ax1_stat_maxÚ ax2_stat_minÚ ax2_stat_maxÚnanzFATAL ERROR, DIFFERING UNITSzEmpty dataframeÚFznoaa.pngTÚleftz figure.dpiznws.pngÚrightzCreating plot for é)ÚfigsizeÚsharexz Forecast HouréÿÿÿÿZ DifferencezDifference from Úmodel1Ú plot_name)ÚlocÚsquaregffffffÖ?ÚwhiteÚsolidÚblack)ÚboxstyleÚpadÚ facecolorÚ linestyleÚ linewidthÚ edgecolorg×£p= ×ï?gÍÌÌÌÌÌð?zQNote: points outside the outline bars are significant at the 95% confidence levelÚcenteré )ÚhaÚvaÚfontsizeÚbboxÚ transform)ÚzorderÚalphaéþÿÿÿgø?ú/Úobs_namez Plotting z - z- ÚcolorrarbÚmarkerÚ markersizeé)rprarbrqrrÚlabelrkrKrLz difference from )rprarbrqrrrkrMrNzdifference from z confidence intervalsÚNone)ÚbottomÚwidthrprcrbÚaxZ _stat_minZ _stat_max)ÚACCgš™™™™™¹?)Úbbox_to_anchorrYÚncolrhzSaving image as Úall)vrÚinfoÚdebugrrrr r ÚwarningÚsysÚexitÚosÚpathÚjoinÚexistsÚmakedirsÚsub_utilÚget_plot_datesÚrangeÚlenÚbuild_dfr r8ÚextendÚvaluesÚastypeÚtolistÚcalculate_statÚindexÚget_level_valuesÚuniqueÚnpÚmaÚmasked_invalidÚ mask_colsÚfilledrOrYÚwhereÚnotnaÚpdÚ DataFrameÚcalculate_averageÚisnanÚ count_maskedrBÚstdÚsqrtrÚ set_up_plotÚintÚappendÚget_stat_plot_nameÚdeleteÚerrorÚget_plot_titler Ú matplotlibÚimageÚimreadÚget_logo_locationÚfig_sizeÚpltÚrcParamsÚget_savefig_nameÚsubplotsÚsuptitler3Ú set_ylabelÚ set_xlabelÚset_xlimÚ set_xticksÚ set_titleÚtextÚ transAxesÚfigimageÚ set_visibleÚget_model_plot_settingsÚdiffÚlistÚkeysÚsplitÚ masked_whereÚgetmaskr;ÚplotÚ compressedÚminÚ is_maskedÚmaxÚ zeros_likeÚbarÚabsoluteÚget_axesÚ get_yticksÚroundÚ set_yticksÚarangeÚset_ylimÚget_ylimÚlinesÚlegendÚ legend_bboxÚ legend_locÚ legend_ncolÚlegend_font_sizeÚdrawÚ transDataÚinvertedÚget_window_extentrjÚx0Úy0Úx1Úy1ÚsavefigÚclfÚclose)`r Zoutput_image_dirZ fcst_unitsÚ forecast_hourÚformat_valid_datesZformat_init_datesÚ plot_datesÚ all_model_dfÚstat_dfÚ stat_arrayZmodel_idx_listZmasked_stat_arrayÚ model_idxZ model_idx_numZforecast_hours_avg_dfZforecast_hours_ci_dfZ avg_methodZ calc_avg_dfZmodel_idx_forecast_hour_avgZmodel1_stat_dfZmodel_idx_model1_diffZnsamplesZmodel_idx_model1_diff_meanZmodel_idx_model1_diff_stdZ"model_idx_model1_diff_mean_std_errÚciZ plot_specs_laZn_xticksÚxticksÚfhrZ xtick_intvlZstat_min_max_dictÚstat_plot_nameÚ plot_titleZplot_left_logoZplot_left_logo_pathZleft_logo_img_arrayZleft_logo_xpixel_locZleft_logo_ypixel_locZleft_logo_alphaZplot_right_logoZplot_right_logo_pathZright_logo_img_arrayZright_logo_xpixel_locZright_logo_ypixel_locZright_logo_alphaÚ image_nameÚfigÚax1Úax2ÚpropsZ left_logo_imgZright_logo_imgÚmodel_plot_settings_dictZci_bar_max_widthsZci_bar_min_widthsZci_bar_intvl_widthsÚ model_numÚmodel_num_nameZmodel_num_plot_nameZmodel_num_obs_nameZmodel_num_dataZmodel_num_plot_settings_dictZmasked_model_num_dataZmodel1_masked_model_num_dataZmodel_num_nptsZmasked_forecast_hoursZ!masked_model_num_model1_diff_dataZmodel_num_diff_nptsZmasked_diff_forecast_hoursZ$masked_model_num_model1_diff_ci_dataZmodel_num_ci_nptsZmasked_ci_forecast_hoursZci_minZci_maxZcmasked_ci_forecast_hoursZ%cmasked_model_num_model1_diff_ci_dataZcmasked_ci_bar_max_widthsZcmasked_ci_bar_intvl_widthsZfhr_idxZfhr_ciZ subplot_numrxZstat_minZstat_maxZpreset_y_axis_tick_minZpreset_y_axis_tick_maxZpreset_y_axis_tick_incZy_axis_tick_incZ y_axis_minZ y_axis_maxrÓÚinvZ legend_boxZlegend_box_invZlegend_box_inv_y1r)r(r%rÚmake_lead_average7s– ÿÿÿ ÿ     õ ÿ  ÿÿÿþýüþþýüû ðÿÿþþÿ      ÿ ýþþ    þ  ÿ ÿ ÿ   ÿ    € Ð 2   €    üÿ    þÿ þÿÿ þÿ ÿÿý      ÿ   ÿÿû ýþ þÿ  ÿþü  ÿþüÿÿ  ÿÿÿ   ÿÿ  þ ÿ  ÿÿ÷ ÿþÿÿþÿÿ ÿÿ  þ  ÿ þ  ÿÿø ÿþÿÿþÿ  ÿÿø ÿ ÿÿ  þ ÿ þý üûÿÿÿÿ þÿ þÿÿ ÿÿ ù€    ÿ  ÿ þ þû þû   ÿû   ÿÿ   þÿÿû   ÿÿ  ê zLeadAverage.make_lead_averageN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrørrrrrs r)rür€r‚ÚloggingÚdatetimeÚglobÚ subprocessÚpandasr›ÚplottingÚ deregister_matplotlib_convertersÚnumpyr”r©ÚuseÚmatplotlib.pyplotÚpyplotr®Úmatplotlib.datesÚdatesÚmdÚsubseasonal_utilr‡Úsubseasonal_plots_specsrrrrrrÚs"