o ng6$@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?=>==!=<=<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|dkrw|dkrogd}|S|dkrwgd}|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 METVrCTCg&@)roFY_OYFY_ONFN_OYFN_ONZEC_VALUE)rorrrr)rkerrorexit)loggerrl line_typeZstat_file_line_type_columnsr?r?r@get_stat_file_line_type_columnssD 61,'! 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@ xs zget_clevels..dtypeN) r#absnanminnanmaxroundr$r!rkr)datarcmaxcminstepsposnegZclevelsr?rr@ get_clevelsXs2       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_average~s,  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|dkrd}|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 mezMean Error (Bias)rmsezRoot Mean Square Errorbcrmsez%Bias-Corrected Root Mean Square Errormsessz&Murphy's Mean Square Error Skill Scorefsdz"Standard Deviation of the Forecastosdz%Standard Deviation of the ObservationesdzStandard Deviation of the ErrorrsdzRatio 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 Score is not a valid optionr)rr)rrrr?r?r@get_stat_plot_names b`^\ZXVTRPNLJHFD@<:86420.,*(&$"               r csd}|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|dhkrt | divr|dkrt|It|J}m|Y|Z} n|dCkr|?|@|?|A} n|djkrt | divr|dkrt$|L|Mdb|K}nt|n}mt$|\|]db|[} n|dkkr6t | divr4|dkr4t|Lt|It|I}ot|Mt|Jt|J}pt|Kt|It|J}qt$|o|pdb|q}m|\|Y|Y}r|]|Z|Z}s|[|Y|Z}tt$|r|sdb|t} nm|dlkrxt | divrv|dkrv|L|Mdb|K}u|M|J|J}pdI|u|p}nt|n}m|\|]db|[}v|]|Z|Z}sdI|v|s} n+|dmkrt | divr|dkr|L|I|I}o|M|J|J}pt$|ot$|p}nt|n}m|\|Y|Y}r|]|Z|Z}st$|rt$|s} n|dnkrt | divr|dkrt$|I|Jdb}nt|n}mt$|Y|Zdb} n|dokr^t | divr\|dkr\|L|Idb}o|M|Jdb}p|K|I|J}q|qt$|o|p}wt$|o|pdbt$|o|p|w}nt|n}m|\|Ydb}r|]|Zdb}s|[|Y|Z}t|tt$|r|s}xt$|r|sdbt$|r|s|x} nE|dpkrt | divr|dkr|L|I|I}o|M|J|J}p|K|I|J}q|qt$|o|p}nt|n}m|\|Y|Y}r|]|Z|Z}s|[|Y|Z}t|tt$|r|s} n|dqkrt | divr|dkrt%t&t&}ot't(t(}pt)t&t(}q|qt$|o|p}nt|n}mt*t+t+}rt,t-t-}st.t+t-}tt/t$t0t1} n|drk rt | div r|dk r|I}nt|n}m|Y} n|dsk r:t | div r8|dk r8|J}nt|n}m|Z} ni|dtk sD|duk ry|dCk rwt |2t |3t |4t |5}yt |2t |4|y}m|?|@|A|B} |?|A| } n*|dvk r|dCk rt |2t |3t |4t |5}yt |2t |3|y}m|?|@|A|B} |?|@| } n|dk s|d k r|dCk rt |2t |3t |4t |5}yt |2t |3|y}zt |2t |4|y}{t 2|z|{g}m|?|@|A|B} |?|@| } |?|A| } t j2| | gdIdT} n|dwk rN|dCk rLt |2t |3t |4t |5}yt |2t |5|y}m|?|@|A|B} |?|B| } nU|dxk rv|dCk rtt |2t |3t |2t |4}m|?|@|?|A} n-|dyk s|dzk r|dCk rt |2t |2t |4}m|?|?|A} n|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|d~k r|dCk rt |3t |3t |2}m|@|@|?} n|dk r)|dCk r'dQt |3t |3t |2}mdQ|@|@|?} nz|dk s3|dk rV|dCk rTt |2t |2t |3t |4}m|?|?|@|A} nM|dk s`|dk r|dCk rt |2t |3t |4t |5}yt |2t |3t |2t |4|y}|t |2||t |2t |3t |4||}m|?|@|A|B} |?|@|?|A| }}|?|}|?|@|A|}} n|dk s|dk s|dk r|dCk rt |2t |5t |3t |4t |2t |4t |3t |5}m|?|B|@|A|?|A|@|B} n|dk r|dCk rt |2t |3t |4t |5}yt |2t |3t |2t |4}~t |4t |5t |3t |5}|~||y}|t |2t |5|||y||}m|?|@|A|B} |?|@|?|A}|A|B|@|B}||| }}|?|B|}| |}} 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.Ar7rPc$g|]}tjjtjddqSTr<r#randomchoicerr7rr)fo_matched_estr?r@r;z*calculate_bootstrap_ci..csg|] }tj|qSr?)r#takeTr)rCidxsr?r@rCs)rrz is not currently a valid option FORECASTSz.Sample too small for bootstrapping. (ForecastscSsg|]}gqSr?r?)ritemr?r?r@r`sr rcsg|]}|jqSr?)rF)r summary_stat)idxr?r@rscr=r>r?rB)rr?r@rrDcs"g|] \}}tt|qSr?)r#rEr$)rsrK)rGr?r@rsrr)r3rHrrrrrrrrrrr r r rrrrrrrrrrrrrrrrr)4 reset_indexrrtolistwarningrr%rrrupperrrrdictr#rr$r'rkr@ multinomialrF enumeratemultivariate_normalrrvstackrprodrr!rAr7r& 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_meanZstat_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_meanCaCbZ stat_deltasZ stat_ci_lowerZ stat_ci_upperr?)rrCrLrGr)r@calculate_bootstrap_cisV                      &&                                                                                  $                         &   &  &    &                  &   &  &    rcD 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|dGkr|d krU||}nx|dkrft |t |}ng|d/krq||}n\|d@kr~|.|/|.|0}nM|dHkr|d krt | | dI| }n6|dkrt ||dI|}n$|dJkr|d kr| ||}3| ||}4| ||}5t |3|4dI|5}n|dkr|||||}3|||||}4|||||}5t |3|4dI|5}n|dKkrA|d kr"| | dI| }6| ||}4dF|6|4}n|dkr?||dI|}6|||||}4dF|6|4}n|dLkrX|d krV| ||}3t |3}nu|dMkro|d krm| ||}4t |4}n^|dNkr|d kr| | ||||dI| dI||}7t |7}n7|dOkr|d kr| ||}3| ||}4t |3t |4}n|dkr|||||}3|||||}4t |3t |4}n|d/kr|#|$}n|dPkr|d krt ||dI}n|dkrt ||dI||dI}n|dQkr|d krL| |dI}3| |dI}4| ||}5|5t |3|4}8t |3|4dIt |3|4|8}n|dkr|||||}3|||||}4|||||}5|5t |3|4}8t |3|4dIt |3|4|8}nA|dRkr|d kr| ||}3| ||}4| ||}5|5t |3|4}n|dkr|||||}3|||||}4|||||}5|5t |3|4}n|dSkr|dkr|| | }3|| | }4|| | }5|5t |3|4}|d%kr|t ||}n|dTkr9|d kr$|}n|dkr0t |}n|d/kr7|}n|dUkr\|d krG|}n|dkrSt |}nz|d/krZ|}nq|dkr|d kr|jddd d g}|jddd }|jddd }nH|dkr|jddd!d"g}t |jddd!}t |jddd"}n|d/kr|jddd d g}|jddd }|jddd }n|dVkr|d/kr|+}n|dWkr|d/kr|,}n|dXkr|d/kr|"}n|dYkr |d/kr |)}n|dZkr|d/kr|*}n|d[kr.|d/kr,|jddd\}n|d]krC|d/krA|jddd^}n|d_krQ|d/krO|'}n||d`kr_|d/kr]|%}nn|daksi|dbkrv|d@krt|.|0|-}nW|dckr|d@kr|.|/|-}nE|dks|dkr|d@kr|.|/|-}|.|0|-}t j ||gdFdd}n|dekr|d@kr|.|1|-}n |dfkr|d@kr|.|/|.|0}n|dgks|dhkr|d@kr|.|.|0}n|diks|djkr|d@kr|/|/|1}n|dkkr|d@kr|1|/|1}n|dlkr!|d@kr |/|/|.}n|dmkr4|d@kr3dn|/|/|.}n|doks>|dpkrL|d@krK|.|.|/|0}n|dqksV|drkrr|d@krq|.|/|.|0|-}9|.|9|.|/|0|9}n[|dsks|dtks|dukr|d@kr|.|1|/|0|.|0|/|1}n6|dvkr|d@kr|.|/|.|0}:|0|1|/|1};|:|;|-}9|.|1|9|-|9}n ||dwtdF|j j}<|dks|dks|dkrz|t|j dx}=t j|j|=}?n|t|j dx}=t|j dF}@t j|j|=|@}?nY|t|j dx}=t|j dF}@t|j dI}At j|j|=|@|A}?t j|>|?g}BWnty}Cz||C|dz|d{d}B|d|WYd}C~Cnd}C~Cwwzs|.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+r/rrrrrrrrc3r$r%r?r&r(r?r@r*r+r0rrrrrrrrrrrrrrrc3r$r%r?r&r(r?r@r*r+r1rrrrrr2rrrrrrrrrrrrrrrrrrrrrr)rrr)rrrrr r r r8rrrrrrrrrrrrrrrrrrrrrJz@This is usually OK, and will happen if event_equalization=False.z&Setting stat_values_array to Nonetype.zContinuing ...)rrrOrPrr%rrr r#rrrYrnlevelsrget_level_valuesuniquermasked_invalidreshaper$ ValueError)Drr\rrr`rarbrrrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzr{r|rr}r~rrrrrrrrrcrrrrrrrrrZvar_errrrZnindexZindex0Zstat_values_array_fbarZstat_values_array_obarZindex1index2Zstat_values_arrayer?r(r@rs.                                              ,               ( $                                                                                            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_fileFs$    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_file\s"   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@rss  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#rxsrr7)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$rgroupsrrFrTmergedrop_duplicatesiterrowsto_numpyrOrrrr7 set_levelslevelsr'rr%rr)rrgroup_byindexesZunique_indep_varsdfsrZdfs_iZ df_mergedZ match_theserLrowZ df_equalizedZdf_equalized_groupsZdata_are_equalizedr?)rrrrrr@equalize_samplesqsl       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-)rrTrrr) Z listed_itemsZ joincharsZprecharsZ postcharsZ prechars_lastZpostchars_lastZ new_itemsrrIstartr?r?r@get_name_for_listed_itemss>   $  & r)picklerrr(numpyr#pandasrwarningsfilterwarningsrArSrmrrrrr rrrrrrr?r?r?r@s> 8+!G&'mnC  N