o qg&@sddlZddlZddlZddlZddlZddlZddlZe d ddZ ddZ ddZ d d Z d d Zd dZddZddZddZddZddZddZddZddZdS)Nignorec7 Cstt|dddd}t|ddd} t|dd} ttd|dttd|dttd|dttd|dd} d D]} | | d } | | d }t| d krt|d kr|D]j}tt|d d dd}t|d dd}t|dd}tj|| | |||d}|}t|d}t|dd}t|dd}t| d t| d t| d }| | d  |qft|d krLt| d krL| D]j}tt|d d dd}t|d dd}t|dd}tj|| | |||d}|}t|d}t|dd}t|dd}t| d t| d t| d } | | d  | qqIdD]K} | d| d}!| d| d}"t|!d kr}t|"d kr}| d| d| d| d<t|"d krt|!d kr| d| d| d| d<qOi}#d| d| fD]} | | d}$t|$d krQt |$}%t |$}&|%|&kst|$dkrtjdd}'n^g}(tt|$D]<})|$|)|&kr|( tjddtj|$|)dtjddq|( tj|$|)ddtj|$|)dqt|(}*t|*|*d kr,|*d }'nt |*}'tj||%d}+tj||&d},t|+|,|'|'tj}-ng}-|-|#| d<q|dkrcd}.n|dkrjd}.tjtt|ddd| | d}/|.dkrd|/}/d D]} |#| d| d|/|#| d|. d<q|#d| d}-|#d}0g}1g}2|-D]}3|3}4|4jd|4jd|4j}5|1 |-|5dq|#d}0g}2|0D] }6|2 |6d q|1|2fS)!a^! Create arrays of requested dates plotting and dates expected to be in MET .stat files Args: date_type - string of describing the treatment of dates, either VALID or INIT date_beg - string of beginning date, either blank or %Y%m%d format date_end - string of end date, either blank or %Y%m%d format fcst_valid_hour - string of forecast valid hour(s) information, blank or in %H%M%S fcst_init_hour - string of forecast init hour(s) information, blank or in %H%M%S obs_valid_hour - string of observation valid hour(s) information, blank or in %H%M%S obs_init_hour - string of observation hour(s) information, blank or in %H%M%S lead - string of forecast lead, in %H%M%S format Returns plot_time_dates - array of ordinal dates based on user provided information expected_stat_file_dates - array of dates that are expected to be found in the MET .stat files based on user provided information, formatted as %Y%m%d_%H%M%S Ni<z, )Zfcst_valid_timeZfcst_init_timeZobs_valid_timeZ obs_init_time)ZfcstobsZ _valid_timeZ _init_timer)seconds)validinitZfcst__timeZobs_iQZ235959z%H%M%Sz %Y%m%d%H%M%SZ_datesVALIDINIT_Zfcst_valid_datesg@z %Y%m%d_%H%M%S)intlistfiltersplitlendatetime timedelta total_secondsstrzfillappendlowerminmaxrangestrptimenparrayallarangeastypetimehourminutesecond toordinalstrftime)7 date_typedate_begdate_endZfcst_valid_hourZfcst_init_hourZobs_valid_hourZ obs_init_hourleadZlead_hour_secondsZlead_min_seconds lead_secondsZvalid_init_time_infotypeZvalid_time_listZinit_time_listZitimeZitime_hour_secondsZitime_min_secondsZ itime_secondsoffsetZtot_sec valid_hourZ valid_minZ valid_sec valid_timeZvtimeZvtime_hour_secondsZvtime_min_secondsZ vtime_seconds init_hourZinit_minZinit_secZ init_timeZfcst_time_listZ obs_time_listZ date_infoZ time_listZtime_begZtime_enddelta_tZ delta_t_listtZ delta_t_arraybegenddatesZoppo_date_typeZlead_timedeltaZfv_datesZplot_time_datesZexpected_stat_file_datesdatedtr Zfv_dater?=/lfs/h1/ops/prod/packages/evs.v1.0.19/ush/nfcens/plot_util.pyget_date_arrayss<                             rAcCs|d}d}d}|D]}|dkrq |}dD]}||vr$|}||d}q|dvr6|d|7}|d|7}q |dvrG|d|7}|d |7}q |d vrX|d |7}|d |7}q |d vri|d|7}|d|7}q |dvrz|d|7}|d|7}q |dvr|d|7}|d|7}q ||fS)a/! Format thresholds for file naming Args: thresh - string of the threshold(s) Return: thresh_symbol - string of the threshold(s) with symbols thresh_letters - string of the threshold(s) with letters  ) >=>==!=<=<gegteqnelelt)rErKrErK)rDrJrDrJ)rIrOrIrO)rHrNrHrN)rFrLrFrL)rGrMrGrM)rreplace)threshZ thresh_listZ thresh_symbolZ thresh_letterZ thresh_valueoptZ thresh_optr?r?r@ format_threshs@         rScCs(t|}|dkrgd}|Sgd}|S)a! Get the standard MET .stat file columns based on version number Args: met_version - string of MET version number being used to run stat_analysis Returns: stat_file_base_columns - list of the standard columns shared among the different line types g333333 @)VERSIONMODELDESC FCST_LEADFCST_VALID_BEGFCST_VALID_ENDOBS_LEAD OBS_VALID_BEG OBS_VALID_ENDFCST_VARFCST_LEVOBS_VAROBS_LEVOBTYPEVX_MASK INTERP_MTHD INTERP_PNTS FCST_THRESH OBS_THRESH COV_THRESHALPHA LINE_TYPE)rTrUrVrWrXrYrZr[r\r] FCST_UNITSr^r_Z OBS_UNITSr`rarbrcrdrerfrgrhri)float) met_versionZstat_file_base_columnsr?r?r@get_stat_file_base_columnss rmcCst|}|dkr|dkrgd}|S|dkr |dkrgd}|S|dkr8|dkr.gd}|S|d kr6gd }|S|d krF|dkrDgd }|S|d kra|d krTgd}|S|d|td|S|dkrm|dkrmgd}|S)a! Get the MET .stat file columns for line type based on version number Args: met_version - string of MET version number being used to run stat_analysis line_type - string of the line type of the MET .stat file being read Returns: stat_file_line_type_columns - list of the line type columns SL1L2g@)TOTALFBAROBARFOBARFFBAROOBARMAESAL1L2)roFABAROABARFOABARFFABAROOABARruVL1L2gffffff@)roUFBARVFBARUOBARVOBARUVFOBARUVFFBARUVOOBARg@) ror}r~rrrrr F_SPEED_BAR O_SPEED_BARVAL1L2)roUFABARVFABARUOABARVOABARUVFOABARUVFFABARUVOOABARVCNT)7rorpFBAR_NCLFBAR_NCUrqOBAR_NCLOBAR_NCUFS_RMSZ FS_RMS_NCLZ FS_RMS_NCUOS_RMSZ OS_RMS_NCLZ OS_RMS_NCUMSVEZMSVE_NCLZMSVE_NCURMSVEZ RMSVE_NCLZ RMSVE_NCUFSTDEV FSTDEV_NCL FSTDEV_NCUOSTDEV OSTDEV_NCL OSTDEV_NCUFDIRZFDIR_NCLZFDIR_NCUODIRZODIR_NCLZODIR_NCU FBAR_SPEEDZFBAR_SPEED_NCLZFBAR_SPEED_NCU OBAR_SPEEDZOBAR_SPEED_NCLZOBAR_SPEED_NCU VDIFF_SPEEDZVDIFF_SPEED_NCLZVDIFF_SPEED_NCU VDIFF_DIRZ VDIFF_DIR_NCLZ VDIFF_DIR_NCU SPEED_ERRZ SPEED_ERR_NCLZ SPEED_ERR_NCU SPEED_ABSERRZSPEED_ABSERR_NCLZSPEED_ABSERR_NCUDIR_ERRZ DIR_ERR_NCLZ DIR_ERR_NCU DIR_ABSERRZDIR_ABSERR_NCLZDIR_ABSERR_NCUz%VCNT is not a valid LINE_TYPE in METVrCTC)roFY_OYFY_ONFN_OYFN_ON)rkerrorexit)loggerrl line_typeZstat_file_line_type_columnsr?r?r@get_stat_file_line_type_columnss> 2-(#rcs>tt|t|krtt|}t|}n t|}dt|}|dkr8||d}||d}n|dkrH||d}||d}|dkr[t|dd}t|dd}nt|dd}t|dd}d}|d |dtjfd d t|Dtd }tj|dd td d}t|d d d|}|S)a}! Get contour levels for plotting differences or bias (centered on 0) Args: data - array of data to be contoured spacing - float for spacing for power function, value of 1.0 gives evenly spaced contour intervals Returns: clevels - array of contour levels rdg? g?rr?cs g|] }d|qS)rr?.0idxspacingspanr?r@ ts zget_clevels..dtypeN) r#absnanminnanmaxroundr$r!rkr)datarcmaxcminstepsposnegZclevelsr?rr@ get_clevelsTs2       rc Cs:t|dddf}|dkr.tt|dddfD]}tj||ddf||<q|S|dkr`tt|dddfD]}|tj||ddftj||ddf||<q>|S|dkr|jd}| d dg}t |||||_ ttt dddfD]}t |||<q|S|dtd |S) a+! Calculate average of dataset Args: logger - logging file average_method - string of the method to use to calculate the average stat - string of the statistic the average is being taken for model_dataframe - dataframe of model .stat columns model_stat_values - array of statistic values Returns: average_array - array of average value(s) NrZMEANZMEDIANZ AGGREGATIONmodel_plot_namesumz?Invalid entry for MEAN_METHOD, use MEAN, MEDIAN, or AGGREGATIONr)r# empty_liker!rmameaninfomedianshapegroupbyaggcalculate_statcolumnsZ avg_arrayrr) raverage_methodstatZmodel_dataframeZmodel_stat_valuesZ average_arraylndaysZmodel_dataframe_aggsumr?r?r@calculate_averagezs,  rc% Cs|dkrw||}|tj|} |} t|| d} | dkr0d| t| d} | S| dkrE| dkrEd| t| d} | S| dkrZ| dkrZd | t| d} | S| dkro| d krod | t| d} | S| d krud } | S|d krd\} }g}|jjD] }||dqt|} t j j dgtj d|dt d|ggdd}t j j dgtj d|dt d|ggdd}t jtj||jd}t jtj||jd}t|j}t|| |g}t|| |g}t|dd k}t|dd k}|j|dddf||d |dddf<|j|dddf||d |dddf<|j|dddf||d |dddf<|j|dddf||d |dddf<d} | |kr|| dddddf|jd| f<|| dddddf|jd| f<| d7} | |ksZtj} t|||\}}}t|||\}}}t|||||d d ddddf}t|||||d d ddddf} | |}!t|!|}"t|!|"d}#t|#|d}$d|$} | S|dtd| S)a3! Calculate confidence intervals between two sets of data Args: logger - logging file ci_method - string of the method to use to calculate the confidence intervals modelB_values - array of values modelA_values - array of values total_days - float of total number of days being considered, sample size stat - string of the statistic the confidence intervals are being calculated for average_method - string of the method to use to calculate the average randx - 2D array of random numbers [0,1) Returns: intvl - float of the confidence interval ZEMCrPg\(\?r(@gtV@rgm@z--ZEMC_MONTE_CARLO)ri'Zrand1r)rntestr<)namesZrand2)indexrg?Nz:Invalid entry for MAKE_CI_METHOD, use EMC, EMC_MONTE_CARLO)r#r count_maskedrsqrtrvaluesrrpd MultiIndex from_productr&r DataFramenanremptywhereiloclocrrrrr)%r ci_methodZ modelB_valuesZ modelA_valuesZ total_daysrrZrandxZmodelB_modelA_diffrZmodelB_modelA_diff_meanZmodelB_modelA_stdZintvlrZntestsr<Zidx_valZrand1_data_indexZrand2_data_indexZ rand1_dataZ rand2_dataZncolumnsZrand1_data_valuesZrand2_data_valuesZ randx_ge0_idxZ randx_lt0_idxZrand1_stat_valuesZrand1_stat_values_arraystat_plot_nameZrand2_stat_valuesZrand2_stat_values_arrayZrand1_average_arrayZrand2_average_arrayZ scores_diffZscores_diff_meanZscores_diff_varZscores_diff_stdr?r?r@ calculate_cisNLJHF    $$      rcCs|dvrd}|S|dkrd}|S|dkrd}|S|dkr d}|S|d kr(d }|S|d kr0d }|S|d kr8d}|S|dkr@d}|S|dkrHd}|S|dkrPd}|S|dkrXd}|S|dkr`d}|S|dkrhd}|S|dkrpd}|S|dkrxd}|S|dkrd }|S|d!krd"}|S|d#krd$}|S|d%krd&}|S|d'krd(}|S|d)krd*}|S|d+krd,}|S|d-krd.}|S|d/krd0}|S|d1krd2}|S|d3krd4}|S|d5krd6}|S|d7krd8}|S|d9krd:}|S|d;krd<}|S|d=krd>}|S|d?krd@}|S|dAkr dB}|S|dCkrdD}|S|dEkrdF}|S|dGkr%dH}|S|dIkr.dJ}|S|dKkr7dL}|S|dMkr@dN}|S|dOkrIdP}|S|dQkrRdR}|S|dSkr[dT}|S|dUkrddV}|S|dWkrmdX}|S|dYkrvdZ}|S|d[krd\}|S||d]td^|S)_a#! Get the formalized name of the statistic being plotted Args: stat - string of the simple statistic name being plotted Returns: stat_plot_name - string of the formal statistic name being plotted biasmezMean Error (Bias)esdzStandard Deviation of the ErrorrmsezRoot Mean Square Errorbcrmsez%Bias-Corrected Root Mean Square Errormsessz&Murphy's Mean Square Error Skill ScorersdzRatio of the Standard Deviationrmse_mdz&Root Mean Square Error from Mean Errorrmse_pvz-Root Mean Square Error from Pattern VariationpcorzPattern CorrelationacczAnomaly Correlation CoefficientfbarzForecast AveragesobarzObservation Averages fbar_obarz!Forecast and Observation Averages speed_errz5Difference in Average FCST and OBS Wind Vector Speedsdir_errz8Difference in Average FCST and OBS Wind Vector Directionrmsvez(Root Mean Square Difference Vector Error vdiff_speedzDifference Vector Speed vdiff_dirzDifference Vector Directionfbar_obar_speedzAverage Wind Vector Speed fbar_obar_dirzAverage Wind Vector Direction fbar_speedz"Average Forecast Wind Vector Speedfbar_dirz&Average Forecast Wind Vector DirectionoratezObservation Ratebaserz Base Ratefratez Forecast Rate orate_fratezObservation and Forecast Rates baser_fratezBase and Forecast RatesaccuracyZAccuracyfbiaszFrequency BiaspodzProbability of DetectionhratezHit RatepofdzProbability of False DetectionfaratezFalse Alarm Ratepodnz)Probability of Detection of the Non-EventfaratiozFalse Alarm RatiosratiozSuccess Ratio (1-FAR)csizCritical Success Indextsz Threat ScoregsszGilbert Skill ScoreetszEquitable Threat ScorehkzHanssen-Kuipers DiscriminanttsszTrue Skill ScorepsszPeirce Skill ScorehsszHeidke Skill Scoresiz Scatter IndexZp90z90th Percentile is not a valid optionr)rr)rrrr?r?r@get_stat_plot_names b`^\ZXVTRPNLJHD@><:86420.,*(&$"               r!csFd}|jdd|jjdgkrO|dd}|dks&|dks&|d krD|jd d dg} |jd d d} |jd d d} n1|jd d d} n&tfd d d Drd}|jd d d} |jd d d|jd d d} |jd d d}|jd d d}|jd d d}ntfdd dDrd}|jd d d} |jd d d}|jd d d}|jd d d}|jd d d}|jd d d}ntfdd dDr1d}|jd d d} |jd d d}|jd d d }|jd d d!}|jd d d"}|jd d d#}|jd d d$}|jd d d%}nDtfd&d d'Drd(}|jd d d} |jd d d)}|jd d d*}|jd d d+}|jd d d,} |jd d d-}!|jd d d.}"|jd d d/}#ntfd0d d1Dr0d2}|jd d d} |jd d d|jd d d} |jd d d3}$|jd d d4}%|jd d d5}&|jd d d6}'|jd d d7}(|jd d d8})|jd d d9}*|jd d d:}+|jd d d;},|jd d d<}-|jd d d=}.|jd d d>}/|jd d d?}0|jd d d@}1nEtfdAd dBDrldC}|jd d d} |jd d dD}2|jd d dE}3|jd d dF}4|jd d dG}5n |dHtdIt | dJkr| |kr|dKdL| dMdN|dI}t ttjgtjg|gdOSdPdQ|dR}6dP|6}7|dCkr|2 }8|3 }9|4 }:|5 };| }tjj|<|>|dSj\}?}@}A}Bn}|dkrg|}C|| | }D|| }Et| D]+\}F}Gtjj|F| |Fg|C|F|E|Fg|E|F|D|Fggt| |FdS}H|Hq td d df}Id d dIf}JttjdIdT}Ktd d dfd d df}Ltd d dIfd d dIf}MdU}N|NdVdW}Ot|Ot}Pg}Qg}Rg}Sg}Tg}U|PdIkrt|D]B}Gtjj tj!ddX}V|Vj\}W}X|Q|W|R|X|St|W|X|Tt|W|W|Ut|X|Xqt|Q}Yt|R}Zt|S}[t|T}\t|U}]njt"d|}^td||PD]W}_t|^|_|_|P}`fdYdZt|`Dfd[dZd\D\}W}X|Q|WjdIdT|R|XjdIdT|S|W|XjdIdT|T|W|WjdIdT|U|X|XjdIdTq t#|Q}Yt#|R}Zt#|S}[t#|T}\t#|U}]n||d]tdInt | d^kr_| j!|kr|d_dL| j!dMdN|dI}t ttjgtjg|gdOSdPdQ|dR}6dP|6}7|dCkr6t|2|3|4|5g}ad`dZtdaD\}?}@}A}Bt|D]7}G|ajtjj tt|ajt|ajddXj ddT}b|?|bd|@|bdI|A|bdb|B|bdcqt|?}?t|@}@t|A}At|B}Bn4|dkrS}I| }J|}K|}L|}MdU}N|NdVdW}Ot|Ot}Pg}cg}dg}eg}fg}g|PdIkrt|D]E}Gtjj tj!ddXfdddZ| |||fD\}h}i}j}k}l|c|h|d|i|e|j|f|k|g|lqrt|c}Yt|d}Zt|e}[t|f}\t|g}]nt"d|}^td||PD]Z}_t|^|_|_|P}`fdedZt|`DfdfdZt| |||gD\}h}i}j}k}l|c|hjdIdT|d|ijdIdT|e|jjdIdT|f|kjdIdT|g|ljdIdTqt#|c}Yt#|d}Zt#|e}[t#|f}\t#|g}]n||d]tdIn ||dgtdI|dhvrt | divr|dkrt|It|J}m|Y|Z} ny|dCkr|?|@|?|A} nj|djkr|dkr||| | db|db| }nt$|n} nC|dkkrt | divr|dkrt$|L|Mdb|K}ot|o}mt$|\|]db|[} n|dlkr]t | divr[|dkr[t|Lt|It|I}pt|Mt|Jt|J}qt|Kt|It|J}rt$|p|qdb|r}m|\|Y|Y}s|]|Z|Z}t|[|Y|Z}ut$|s|tdb|u} n|dmkrt | divr|dkr|L|Mdb|K}v|M|J|J}qdI|v|q}ot|o}m|\|]db|[}w|]|Z|Z}tdI|w|t} ng|dnkrt | divr|dkr|L|I|I}p|M|J|J}qt$|pt$|q}ot|o}m|\|Y|Y}s|]|Z|Z}tt$|st$|t} n!|dokrt | divr|dkrt$|I|Jdb}ot|o}mt$|Y|Zdb} n|dpkrt | divr|dkr|L|Idb}p|M|Jdb}q|K|I|J}r|rt$|p|q}xt$|p|qdbt$|p|q|x}ot|o}m|\|Ydb}s|]|Zdb}t|[|Y|Z}u|ut$|s|t}yt$|s|tdbt$|s|t|y} n|dqkrt | divr|dkr|L|I|I}p|M|J|J}q|K|I|J}r|rt$|p|q}ot|o}m|\|Y|Y}s|]|Z|Z}t|[|Y|Z}u|ut$|s|t} n1|drk r%t | div r#|dk r#t%t&t&}pt't(t(}qt)t&t(}r|rt$|p|q}ot|o}mt*t+t+}st,t-t-}tt.t+t-}ut/t$t0t1} n|dsk rCt | div rA|dk rA|I}ot|o}m|Y} n|dtk rat | div r_|dk r_|J}ot|o}m|Z} n|duk sk|dvk r|dCk rt |2t |3t |4t |5}zt |2t |4|z}m|?|@|A|B} |?|A| } nf|dwk r|dCk rt |2t |3t |4t |5}zt |2t |3|z}m|?|@|A|B} |?|@| } n,|dk s|d k r;|dCk r9t |2t |3t |4t |5}zt |2t |3|z}{t |2t |4|z}|t 2|{||g}m|?|@|A|B} |?|@| } |?|A| } t j2| | gdIdT} n|dxk ru|dCk rst |2t |3t |4t |5}zt |2t |5|z}m|?|@|A|B} |?|B| } n|dyk r|dCk rt |2t |3t |2t |4}m|?|@|?|A} ni|dzk s|d{k r|dCk rt |2t |2t |4}m|?|?|A} nC|d|k s|d}k r|dCk rt |3t |3t |5}m|@|@|B} n|d~k r |dCk rt |5t |3t |5}m|B|@|B} n|dk r+|dCk r)t |3t |3t |2}m|@|@|?} n|dk rP|dCk rNdQt |3t |3t |2}mdQ|@|@|?} n|dk sZ|dk r}|dCk r{t |2t |2t |3t |4}m|?|?|@|A} n|dk s|dk r|dCk rt |2t |3t |4t |5}zt |2t |3t |2t |4|z}}t |2|}t |2t |3t |4|}}m|?|@|A|B} |?|@|?|A| }~|?|~|?|@|A|~} n|dk s|dk s|dk r;|dCk r:t |2t |5t |3t |4t |2t |4t |3t |5}m|?|B|@|A|?|A|@|B} n|dk r|dCk rt |2t |3t |4t |5}zt |2t |3t |2t |4}t |4t |5t |3t |5}|||z}}t |2t |5|}|z|}}m|?|@|A|B} |?|@|?|A}|A|B|@|B}||| }~|?|B|~| |~} nF|dk rt | div r|dk rt$|L|Mdb|K}ot|o}mt$|\|]db|[}d||J} | | dk} n ||dgtdI| |m}t3||6}t3||7}t t|g|g|gdOS)a! Calculate the upper and lower bound bootstrap statistic from the data from the read in MET .stat file(s) Args: bs_method - string of the method to use to calculate the bootstrap confidence intervals model_data - Dataframe containing the model(s) information from the MET .stat files stat - string of the simple statistic name being plotted nrepl - integer of resamples that create the bootstrap distribution level - float confidence level (0.-1.) of the confidence interval bs_min_samp - minimum number of samples allowed for confidence intervals to be computed Returns: stat_values - Dataframe of the statistic values lower and upper bounds status - integer to provide the parent script with information about the outcome of the bootstrap resampling rT)inplaceroEmpty model_data dataframeNULLrr r Nc3|]}|vVqdSNr?relemmodel_data_columnsr?r@ z)calculate_bootstrap_ci..rprqrurnrprqrrrsrtc3r%r&r?r'r)r?r@r+r,rwrxrurvrwrxryrzr{c3r%r&r?r'r)r?r@r+r,r}r~r|r}r~rrrrrc3r%r&r?r'r)r?r@r+r,rrrrrrrrrrc3r%r&r?r'r)r?r@r+r,rrrrrrrrrrrrrrrrrc3r%r&r?r'r)r?r@r+r,rrrrrrr*Could not recognize line type from columnsr MATCHED_PAIRSz2Sample too small for bootstrapping. (Matched pairsz sample size: z; minimum samplez size: )CI_LOWERCI_UPPERSTATUSgY@rr)sizeaxis g.Ar8rPc$g|]}tjjtjddqSTr=r#randomchoicerr8rr)fo_matched_estr?r@r7z*calculate_bootstrap_ci..csg|] }tj|qSr?)r#takeTr)rDidxsr?r@r?s)rrz is not currently a valid option FORECASTSz.Sample too small for bootstrapping. (ForecastscSsg|]}gqSr?r?)ritemr?r?r@r\sr rcsg|]}|jqSr?)rG)r summary_stat)idxr?r@rscr>r?r@rC)rr?r@rrEcs"g|] \}}tt|qSr?)r#rFr$)rsrL)rHr?r@rsr r)r4rIrrrrrrrrrrrr r r rrrrrrrrrrrrrrrrrrr)4 reset_indexrrtolistwarningrr%rrrupperrrrdictr#rr$r'rkrA multinomialrG enumeratemultivariate_normalrrvstackrprodrr!rBr8r& concatenaterZffabar_est_meanZfabar_est_meanZooabar_est_meanZoabar_est_meanZfoabar_est_meanZffabar_est_sampZfabar_est_sampZooabar_est_sampZoabar_est_sampZfoabar_est_sampZ covar_sampZ var_f_sampZ var_o_sampconcat nanpercentile)r bs_method model_datarZnrepllevel bs_min_sampstatusr stat_valuesstat_values_fbarstat_values_obartotalrfobarffbaroobarfabaroabarfoabarffabarooabarufbarvfbaruobarvobaruvfobaruvffbaruvoobarufabarvfabaruoabarvoabaruvfoabaruvffabaruvooabarfs_rmsos_rmsmsverfstdevostdevfdirodirr obar_speedrrrrfy_oyfy_onfn_oyfn_onZ lower_pctileZ upper_pctileZ fy_oy_allZ fy_on_allZ fn_oy_allZ fn_on_allZ total_allZctc_allZ prob_ctc_allZ fy_oy_sampZ fy_on_sampZ fn_oy_sampZ fn_on_sampZfvarZovarZfocovarrrZfo_matched_est_iZ fbar_est_meanZ obar_est_meanZfobar_est_meanZffbar_est_meanZoobar_est_meanZmax_mem_per_arrayZmax_array_sizeZ batch_sizeZfbar_est_samplesZobar_est_samplesZfobar_est_samplesZffbar_est_samplesZoobar_est_samplesZfo_matched_indicesZf_est_bsZo_est_bsZ fbar_est_sampZ obar_est_sampZfobar_est_sampZffbar_est_sampZoobar_est_sampZrep_arrbZcurr_batch_sizeZctcZctc_bsZ fbar_samplesZ obar_samplesZ fobar_samplesZ ffbar_samplesZ oobar_samplesZfbar_bsZobar_bsZfobar_bsZffbar_bsZoobar_bsZstat_values_meanZvar_eZstat_values_pre_meanZ var_f_meanZ var_o_meanZ covar_meanvar_fvar_ocovarZmse_meanmseZR_meanRZ total_meanZstat_values_fbar_meanZstat_values_obar_meanZC_meanCZCa_meanZCb_meanCaCbZstat_values_rmseZ stat_deltasZ stat_ci_lowerZ stat_ci_upperr?)rrDrMrHr*r@calculate_bootstrap_ci|sz                      &&                                                  ,                                   $                         &   &  &    &                  &   &  &         rcC s|jjdgkrG|dd}|dks|dks|dkr<|jdddg}|jddd}|jddd}n|jddd}ntfdd d Drd }|jddd }|jddd }|jddd} |jddd} |jddd} ntfdd dDrd}|jddd} |jddd} |jddd}|jddd}|jddd}ntfdd dDrd}|jddd}|jddd}|jddd}|jddd}|jddd }|jddd!}|jddd"}n2tfd#d d$Dr\d%}|jddd&}|jddd'}|jddd(}|jddd)}|jddd*}|jddd+}|jddd,}ntfd-d d.Drd/}|jddd }|jddd }|jddd0}|jddd1} |jddd2}!|jddd3}"|jddd4}#|jddd5}$|jddd6}%|jddd7}&|jddd8}'|jddd9}(|jddd:})|jddd;}*|jddd<}+|jddd=},nEtfd>d d?Dr7d@}|jddd}-|jdddA}.|jdddB}/|jdddC}0|jdddD}1n |dEtdFt||}2|dGvr|d krU||}nj|dkrft |t |}nY|d/krq||}nN|d@kr~|.|/|.|0}n?|dHkr|d krt | | ||||dI| dI||}n|dJkr|d krt | | dI| }n|dkrt ||dI|}n|dKkr'|d kr| ||}3| ||}4| ||}5t |3|4dI|5}n|dkr%|||||}3|||||}4|||||}5t |3|4dI|5}n|dLkrf|d krG| | dI| }6| ||}4dF|6|4}nx|dkrd||dI|}6|||||}4dF|6|4}nY|dMkr|d kr| ||}3| ||}4t |3t |4}n7|dkr|||||}3|||||}4t |3t |4}n|d/kr|#|$}n|dNkr|d krt ||dI}n|dkrt ||dI||dI}n|dOkr\|d kr| |dI}3| |dI}4| ||}5|5t |3|4}7t |3|4dIt |3|4|7}n|dkrZ|||||}3|||||}4|||||}5|5t |3|4}7t |3|4dIt |3|4|7}nc|dPkr|d kr| ||}3| ||}4| ||}5|5t |3|4}n<|dkr|||||}3|||||}4|||||}5|5t |3|4}n|dQkr|dkr|| | }3|| | }4|| | }5|5t |3|4}|d%kr|t ||}n|dRkr |d kr|}n|dkrt |}n|d/kr|}n|dSkr,|d kr|}n|dkr#t |}n|d/kr*|}n|dkr|d krU|jddd d g}|jddd }|jddd }nj|dkr|jddd!d"g}t |jddd!}t |jddd"}n@|d/kr|jddd d g}|jddd }|jddd }n|dTkr|d/kr|+}n|dUkr|d/kr|,}n|dVkr|d/kr|"}n|dWkr|d/kr|)}n|dXkr|d/kr|*}n|dYkr|d/kr|jdddZ}n|d[kr|d/kr|jddd\}n|d]kr!|d/kr|'}n|d^kr/|d/kr-|%}n|d_ks9|d`krF|d@krD|.|0|-}ny|dakrX|d@krV|.|/|-}ng|dksb|dkr~|d@kr||.|/|-}|.|0|-}t j ||gdFdb}nA|dckr|d@kr|.|1|-}n/|ddkr|d@kr|.|/|.|0}n|deks|dfkr|d@kr|.|.|0}n|dgks|dhkr|d@kr|/|/|1}n|dikr|d@kr|1|/|1}n|djkr|d@kr|/|/|.}n|dkkr|d@krdl|/|/|.}n|dmks|dnkr|d@kr|.|.|/|0}n|doks(|dpkrD|d@krC|.|/|.|0|-}8|.|8|.|/|0|8}n{|dqksS|drksS|dskri|d@krh|.|1|/|0|.|0|/|1}nV|dtkr|d@kr|.|/|.|0}9|0|1|/|1}:|9|:|-}8|.|1|8|-|8}n+|dukr|d krdvt | | dI| |}||dwk}n ||dxtdF|j j};|dks|dks|dkrz|;dFkrt|j dy}n|;dIkrEt|j dy}nY|;dzkrt|j dy}t j|=|>g}AWnty}Bz||B|d{|d|d}A|d}WYd}B~Bnd}B~Bwwzs|;dFkrt|j dy}.r-rnrprqrrrsrtc3r%r&r?r'r)r?r@r+r,r.rvrwrxryrzr{c3r%r&r?r'r)r?r@r+r,r/r|r}r~rrrrrc3r%r&r?r'r)r?r@r+r,r0rrrrrrrrc3r%r&r?r'r)r?r@r+r,r1rrrrrrrrrrrrrrrc3r%r&r?r'r)r?r@r+!r,r2rrrrrr3rrrrrrrrrrrrrrrrrrrr)rrr)rrrrr r r r9rrrrrrrrrrrrrrrrrrrrrOr rrKz@This is usually OK, and will happen if event_equalization=False.z&Setting stat_values_array to Nonetype.zContinuing ...)rrrQrRrr%rrr!r#rrr[rnlevelsrget_level_valuesuniquermasked_invalidreshaper$ ValueError)Crr^rrrbrcrdrrrfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzr{r|r}r~rrrrrrrrrrrrerrrrrrrrrrrrrZnindexZindex0Zstat_values_array_fbarZstat_values_array_obarZindex1index2Zstat_values_arrayer?r)r@rs"                        2                            ( $                                                                                               rcCs||dtj|dd}d||vr#|d|d}|d7}nd|vr4|d|d}|d7}tj|d|}|S) Nr_dump_row.statrC fcst_leadfcst_lead_avgs.txtz_fcst_lead_avgs.txtrospathbasenamerPjoin)rinput_filenameroutput_base_dirZlead_avg_filenameZ lead_avg_filer?r?r@get_lead_avg_filePs$    rcCs|dtj|dd}d||vr|d|d}nd|vr0|d|d}|d7}|d|d7}tj|d |}|S) NrrrCrrZ_fcst_lead_avgsZ_CI_rrr)rrrrrZ CI_filenameZCI_filer?r?r@ get_ci_filefs"   rc sfdddD|g}tttjjd}|D]YfddtjD}t|D]\}}|dkrC|}q8|j |ddd }q8| } |D](}| D]!\} } | dd | ddddf vry|| qXqRq"j|} | j| d g j} | |} | jjjjd td d _tfd dtttjdD}|r|d| |fS|d|d|d|fS)Ncsg|] }|vr|qSr?)keys)rkey)dfr?r@r}s  z$equalize_samples..) LEAD_HOURSrrFCST_THRESH_SYMBOLFCST_THRESH_VALUEr`rcs.g|]}t|dtkr|qS)r)r get_group)rname) cols_to_check df_groupsunique_indep_varr?r@rs  rinnerF)how indicatorrUrr_cs*g|]}tjt|ddjdkqS)rr)r#rxsrr8)rr)df_groups_sizesr?r@rsz@Data were successfully equalized along the independent variable.z8Data equalization along the independent variable failed.znThis may be a bug in the verif_plotting code. Please contact the verif_plotting code manager about your issue.z9Skipping equalization. Sample sizes will not be plotted.)rr#rr$rgroupsrrGrVmergedrop_duplicatesiterrowsto_numpyrQrrrr8 set_levelslevelsr'rr%rr)rrgroup_byindexesZunique_indep_varsdfsrZdfs_iZ df_mergedZ match_theserMrowZ df_equalizedZdf_equalized_groupsZdata_are_equalizedr?)rrrrrr@equalize_samples{sl       rc CsZg}t|dkr||d|St|dkr1||d|d|||d||St|D]\}}|dkr@|} q5|t|dkrt|t||dkrd|||| ||q5t|t||ddkrt| t||dkr||| d||d|||||||q5||||d|||||||q5t| t|dkr||| d||q5|||| d|||q5t|t||ddkr't| t||dkr||| |n||| d||d||} q5||S)NrrrrB-)rrVrrr) Z listed_itemsZ joincharsZprecharsZ postcharsZ prechars_lastZpostchars_lastZ new_itemsrrJstartr?r?r@get_name_for_listed_itemss>   $  & r)picklerrr(numpyr#pandasrwarningsfilterwarningsrArSrmrrrrr!rrrrrrr?r?r?r@s> 8+!C&'mnU N