o ngq@sddlZddlZddlZddlZddlZddlZddlZe d ddZ ddZ ddZ d d Z d d Zd dZddZddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&ZdS)'NignorecCsJtttdddd\}}}ddtt||ddfS)Nz free -t -m zRAM memory % used:d) mapintospopen readlinessplitjoinstrround)Z total_memoryZ used_memoryZ free_memoryr:/lfs/h1/ops/prod/packages/evs.v1.0.19/ush/cam/plot_util.pyget_memory_usages rc7 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_timerr)seconds)validinitZfcst__timeZobs_riQZ235959z%H%M%Sz %Y%m%d%H%M%SZ_datesVALIDINITr_Zfcst_valid_datesg@z %Y%m%d_%H%M%S)r listfilterr lendatetime timedelta total_secondsrzfillappendlowerminmaxrangestrptimenparrayallarangeastypetimehourminutesecond 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_datesdatedtrZfv_daterrrget_date_arrays s<                             rJcCs|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 r) >=>==!=<=<gegteqnelelt)rMrSrMrS)rLrRrLrR)rQrWrQrW)rPrVrPrV)rNrTrNrT)rOrUrOrU)r replace)threshZ thresh_listZ thresh_symbolZ thresh_letterZ thresh_valueoptZ thresh_optrrr format_threshs@         r[cCs(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)r\r]r^r_r`rarbrcrdre FCST_UNITSrfrgZ OBS_UNITSrhrirjrkrlrmrnrorprq)float) met_versionstat_file_base_columnsrrrget_stat_file_base_columnss rvc Cst|}|dkr|dkrgd}|S|dkr |dkrgd}|S|dkr8|dkr.gd}|S|d kr6gd }|S|d krP|d krFgd }|S|dkrNgd}|S|dkru|d kr^gd}|S|d krhgd}|S|d|td|S|dkr|d krgd}|S|dkrgd}|S|dkr|dkrgd}|S|dkr|dkrgd}|S|dkr|d krgd}|S|d krgd}|S|dkr|dkrgd}|S|dkrp|d kr$d d!g}t||f}tj|d"d#dtd$}tt |t |d!kd% } g} | D]} | D]} | d&| d'| qqt|| d(gf}|S|dkrpd d!g}tt |f}tjtd"d#dtd$}tt |t |d!kd% } g} | D]} | D]} | d&td'tqXqTt|| f}|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)rxFABAROABARFOABARFFABAROOABARr~VL1L2gffffff@)rxUFBARVFBARUOBARVOBARUVFOBARUVFFBARUVOOBARg@) rxrrrrrrr F_SPEED_BAR O_SPEED_BARVAL1L2g&@) rxUFABARVFABARUOABARVOABARUVFOABARUVFFABARUVOOABARZ FA_SPEED_BARZ OA_SPEED_BAR)rxrrrrrrrVCNT)?rxryFBAR_BCLFBAR_BCUrzOBAR_BCLOBAR_BCUFS_RMSZ FS_RMS_BCLZ FS_RMS_BCUOS_RMSZ OS_RMS_BCLZ OS_RMS_BCUMSVEZMSVE_BCLZMSVE_BCURMSVEZ RMSVE_BCLZ RMSVE_BCUFSTDEV FSTDEV_BCL FSTDEV_BCUOSTDEV OSTDEV_BCL OSTDEV_BCUFDIRZFDIR_BCLZFDIR_BCUODIRZODIR_BCLZODIR_BCU FBAR_SPEEDZFBAR_SPEED_BCLZFBAR_SPEED_BCU OBAR_SPEEDZOBAR_SPEED_BCLZOBAR_SPEED_BCU VDIFF_SPEEDZVDIFF_SPEED_BCLZVDIFF_SPEED_BCU VDIFF_DIRZ VDIFF_DIR_BCLZ VDIFF_DIR_BCU SPEED_ERRZ SPEED_ERR_BCLZ SPEED_ERR_BCU SPEED_ABSERRZSPEED_ABSERR_BCLZSPEED_ABSERR_BCUDIR_ERRZ DIR_ERR_BCLZ DIR_ERR_BCU DIR_ABSERRZDIR_ABSERR_BCLZDIR_ABSERR_BCU ANOM_CORR ANOM_CORR_NCL ANOM_CORR_NCU ANOM_CORR_BCL ANOM_CORR_BCUZANOM_CORR_UNCNTANOM_CORR_UNCNTR_BCLANOM_CORR_UNCNTR_BCU)7rxryFBAR_NCLFBAR_NCUrzOBAR_NCLOBAR_NCUrZ FS_RMS_NCLZ FS_RMS_NCUrZ OS_RMS_NCLZ OS_RMS_NCUrZMSVE_NCLZMSVE_NCUrZ RMSVE_NCLZ RMSVE_NCUr FSTDEV_NCL FSTDEV_NCUr OSTDEV_NCL OSTDEV_NCUrZFDIR_NCLZFDIR_NCUrZODIR_NCLZODIR_NCUrZFBAR_SPEED_NCLZFBAR_SPEED_NCUrZOBAR_SPEED_NCLZOBAR_SPEED_NCUrZVDIFF_SPEED_NCLZVDIFF_SPEED_NCUrZ VDIFF_DIR_NCLZ VDIFF_DIR_NCUrZ SPEED_ERR_NCLZ SPEED_ERR_NCUrZSPEED_ABSERR_NCLZSPEED_ABSERR_NCUrZ DIR_ERR_NCLZ DIR_ERR_NCUrZDIR_ABSERR_NCLZDIR_ABSERR_NCUz2FATAL ERROR: VCNT is not a valid LINE_TYPE in METVrCTC)rxFY_OYFY_ONFN_OYFN_ONEC_VALUE)rxrrrrNBRCTCNBRCNT)rxFBSFBS_BCLFBS_BCUFSSFSS_BCLFSS_BCUAFSSAFSS_BCLAFSS_BCUUFSSUFSS_BCLUFSS_BCUF_RATE F_RATE_BCL F_RATE_BCUO_RATE O_RATE_BCL O_RATE_BCUECNT)rxN_ENSCRPSCRPSSIGNMERMSESPREADME_OERR RMSE_OERR SPREAD_OERRSPREAD_PLUS_OERRCRPSCLCRPS_EMP CRPSCL_EMP CRPSS_EMP)rxrrrrrrrrrrrrrrr CRPS_EMP_FAIR SPREAD_MDr~MAE_OERR BIAS_RATION_GE_OBS ME_GE_OBSN_LT_OBS ME_LT_OBSPSTD)rxN_THRESHBASER BASER_NCL BASER_NCU RELIABILITY RESOLUTION UNCERTAINTYROC_AUCBRIER BRIER_NCL BRIER_NCUBRIERCL BRIERCL_NCL BRIERCL_NCUBSSBSS_SMPLZTHRESH_1ZTHRESH_2ZTHRESH_3ZTHRESH_4ZTHRESH_5ZTHRESH_6ZTHRESH_7ZTHRESH_8ZTHRESH_9Z THRESH_10Z THRESH_11MCTCrxN_CATTN)delim_whitespaceheaderskiprowsdtyperF_Or)rserrorexitr. concatenatepdread_csvrr1r argwherer+r(Zstat_file_og_columnsfnameZFcatZOcat) loggerrt line_typerufpathZstat_file_line_type_columnsZ!stat_file_line_type_columns_startZstat_file_all_columns_startZ df_read_tmpZcategsZvariable_columnsZFcategZOcategrrrget_stat_file_line_type_columns#s ! n]ZVQLD>5    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 rrg? g?rr?cs g|] }d|qS)rr.0idxspacingspanrr s zget_clevels..rN) r.absnanminnanmaxrr/r,rsr()datarcmaxcminstepsposnegZclevelsrrr get_clevelss2       r*c 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_namesumzLFATAL ERROR: Invalid entry for MEAN_METHOD, use MEAN, MEDIAN, or AGGREGATIONr)r. empty_liker,r#mameaninfomedianshapegroupbyaggcalculate_statcolumnsZ avg_arrayr r ) raverage_methodstatZmodel_dataframeZmodel_stat_valuesZ average_arraylndaysZmodel_dataframe_aggsumrrrcalculate_averages,  r;c% 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 )r+ntestrG)namesZrand2)indexr6g?NzGFATAL ERROR: Invalid entry for MAKE_CI_METHOD, use EMC, EMC_MONTE_CARLO)r.r. count_maskedr/sqrtrBvaluesr(r#r  MultiIndex from_productr1r DataFramenanr6emptywhereiloclocr5r;r,r r )%r ci_methodZ modelB_valuesZ modelA_valuesZ total_daysr8r7ZrandxZmodelB_modelA_diffr:ZmodelB_modelA_diff_meanZmodelB_modelA_stdZintvlr@ZntestsrGZidx_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_stdrrr calculate_ci"sNLJHF    $$      rPcCs|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]krd^}|S|d_krd`}|S|dakrdb}|S|dkrdc}|S|ddkrde}|S|dfkrdg}|S|dhkrdi}|S|djkrdk}|S|dlkrdk}|S|dm|dntdo|S)pa#! 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 (i.e., Bias)rmsezRoot 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 Coefficientfbarz Forecast MeanobarzObservation Mean fbar_obarzForecast and Observation MeanfsszFractions Skill Scoreafssz Asymptotic Fractions Skill ScoreufsszUniform Fractions Skill Score 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 ScorecrpsrcrpssrspreadZSpreadzMean Error (Bias)maezMean Absolute Errorbsz Brier Scoreroc_areazROC AreabsszBrier Skill Scorebss_smpl FATAL ERROR:  is not a valid optionr)r r )rr8rOrrrget_stat_plot_namesT trpnljhfdb`^\ZXVRNLJHFDB@><:864 2 0 . , * ( & $ "               rc s!d}jddjj dgkrO|dd} |dks&|dks&|d krDjd d dg} jd d d} jd d d} n?jd d d} n4t|rWd} nd } t fd d dDrd} jd d d}jd d djd d d}jd d d}jd d d}jd d d}| r|\}}}|}||||||}t |d|||||||t |d}t |d|d|||t |d}t |d|d|||t |d}nt fdd dDrgd} jd d d}jd d d}jd d d}jd d d}jd d d}jd d d}| re|\}}||}||}t |d|}t |d|}t |d|}nt fdd d Dr0d!} jd d d}jd d d"}jd d d#}jd d d$}jd d d%}jd d d&} jd d d'}!jd d d(}"| r.|\}}|}#|}$|}%|}&||#|}||$|}||%|}||&|}t |d| |||#|%|$|&t |d} t |d|!d|||#|$t |d}!t |d|"d|||%|&t |d}"nSt fd)d d*Drd+} jd d d}jd d d,}'jd d d-}(jd d d.})jd d d/}*jd d d0}+jd d d1},jd d d2}-| r|\}}||'}'||(}(||)})||*}*t |d|+}+t |d|,},t |d|-}-nt fd3d d4Drpd5} jd d d}jd d djd d d}jd d d6}.jd d d7}/jd d d8}0jd d d9}1jd d d:}2jd d d;}3jd d d<}4jd d d=}5jd d d>}6jd d d?}7jd d d@}8jd d dA}9jd d dB}:jd d dC};| rn| dD| dEt dFnt fdGd dHDrdI} jd d d}jd d dJ}<jd d dK}=jd d dL}>jd d dM}?nt fdNd dODr,dP} jd d d}jd d dQ}@jd d dR|@}Ajd d dS|@}Bt |A|BdTt |A|BdUt |A|BdVt fdWdXjD}||<|=|>}?nWt fd[d d\Drzd]} jd d d}jd d d^jd d d_}Cjd d d`}Djd d da}Ejd d db}Fjd d dc}Gn | ddt dFt|dekr||kr|dfdg|dhdi|dF}tttjgtjg|gdjSdkdl|d}Hdk|H}I| dmvr|<}J|=}K|>}L|?}M|}Nt |J|K|L|Mg}O|O|Nt}Ptjj|N|P|dnj\}Q}R}S}Tn| dkrg|}U|||}V||}Wt|D]+\}X}Ytjj|X||Xg|U|X|W|Xg|W|X|V|Xggt||Xdn}Z|Zqtd d df }[d d dFf }\t tj!dFdo}]t d d dfd d df}^t d d dFfd d dFf}_dp}`|`dqdr}at|at"}bg}cg}dg}eg}fg}g|bdFkrt#|D]B}Ytjj$t"j%dds}h|hj\}i}j|c|i |d|j |et |i|j|ft |i|i|gt |j|jqt |c}kt |d}lt |e}mt |f}nt |g}ont&d|}pt#d||bD]W}qt"|p|q|q|b}rfdtdXt#|rDfdudXdvD\}i}j|c|ij dFdo|d|jj dFdo|e|i|jj dFdo|f|i|ij dFdo|g|j|jj dFdoqt'|c}kt'|d}lt'|e}mt'|f}nt'|g}on7| dw| dx|t dFn%t|dyk r|j%|kr|dzdg|j%dhdi|dF}tttjgtjg|gdjSdkdl|d}Hdk|H}I| dmvrIt |<|=|>|?g}sd{dXt#d|D\}Q}R}S}Tt#|D]7}Y|sjtjj$t#t"|sjt"|sjddsjddo}t|Q|td|R|tdF|S|td|T|td}qt |Q}Qt |R}Rt |S}St |T}Tn{| dkrh }[| }\| }]| }^| }_dp}`|`dqdr}at|at"}bg}ug}vg}wg}xg}y|bdFkrt#|D]E}Ytjj$t"j%ddsfd~dX||||fD\}z}{}|}}}~|u|z |v|{ |w|| |x|} |y|~ qt |u}kt |v}lt |w}mt |x}nt |y}ont&d|}pt#d||bD]Z}qt"|p|q|q|b}rfddXt#|rDfddXt||||gD\}z}{}|}}}~|u|zj dFdo|v|{j dFdo|w||j dFdo|x|}j dFdo|y|~j dFdoqt'|u}kt'|v}lt'|w}mt'|x}nt'|y}on\| d]k r }|C }|D }|E }|F }|G }dp}`|`dqdr}at|at"}bg}g}g}g}g}g}|bdFk rt#|D]N}Ytjj$t"j%ddsfddX|C|D|E|F|GfD\}}}}}}|| || || || || || qt |}t |}t |}t |}t |}t |}nt&d|}pt#d||bD]e}qt"|p|q|q|b}rfddXt#|rDfddXt|C|D|E|F|GgD\}}}}}}||j dFdo||j dFdo||j dFdo||j dFdo||j dFdo||j dFdo q$t'|}t'|}t'|}t'|}t'|}t'|}n| dw| dt dFn | dw|dt dF|dk rt|dv r| dk rt |[t |\}|k|l} n| dmv r|Q|R|Q|S} ny|dk r&t|dv r$| dk r$t(|^|_d|]}t |}t(|n|od|m} nI|dk rt|dv r| dk rt |^t |[t |[}t |_t |\t |\}t |]t |[t |\}t(||d|}|n|k|k}|o|l|l}|m|k|l}t(||d|} n|dk rt|dv r| dk r|^|_d|]}|_|\|\}dF||}t |}|n|od|m}|o|l|l}dF||} n|dk rt|dv r| dk r|^|[|[}|_|\|\}t(|t(|}t |}|n|k|k}|o|l|l}t(|t(|} nW|dk rDt|dv rB| dk rBt(|[|\d}t |}t(|k|ld} n+|dk rt|dv r| dk r|^|[d}|_|\d}|]|[|\}|t(||}t(||dt(|||}t |}|n|kd}|o|ld}|m|k|l}|t(||}t(||dt(|||} n|dk rt|dv r| dk r|^|[|[}|_|\|\}|]|[|\}|t(||}t |}|n|k|k}|o|l|l}|m|k|l}|t(||} ng|dk rXt|dv rV| dk rVt)t*t*}t+t,t,}t-t*t,}|t(||}t |}t.t/t/}t0t1t1}t2t/t1}t3t(t4t5} n|dk rvt|dv rt| dk rt|[}t |}|k} n|dk rt|dv r| dk r|\}t |}|l} n|dk rt|dv r| d]k rt |}|} n|dk rt|dv r| d]k rt |}|} n|dk rt|dv r| d]k rt |}|} n|dk s|dk r5| dmv r't|<t|=t|>t|?}t|<t|>|}|Q|R|S|T}|Q|S|} nH| d]k r3t |G}|} n:|dk r}| dmv rot|<t|=t|>t|?}t|<t|=|}|Q|R|S|T}|Q|R|} n| d]k r{t |F}|} n|dk s|d k r| dmv rt|<t|=t|>t|?}t|<t|=|}t|<t|>|}t6||g}|Q|R|S|T}|Q|R|} |Q|S|} tj6| | gdFdo} n|dkr| dmvrt|<t|=t|>t|?}t|<t|?|}|Q|R|S|T}|Q|T|} nW|dkr@| dmvr>t|<t|=t|<t|>}|Q|R|Q|S} n/|dksJ|dkrf| dmvrdt|<t|<t|>}|Q|Q|S} n |dksp|dkr| dmvrt|=t|=t|?}|R|R|T} n|dkr| dmvrt|?t|=t|?}|T|R|T} n|dkr| dmvrt|=t|=t|<}|R|R|Q} n|dkr| dmvrdlt|=t|=t|<}dl|R|R|Q} n||dks|dkr | dmvrt|<t|<t|=t|>}|Q|Q|R|S} nO|dks*|dkr| dmvrt|<t|=t|>t|?}t|<t|=t|<t|>|}t|<|t|<t|=t|>|}|Q|R|S|T}|Q|R|Q|S|}|Q||Q|R|S|} n|dks|dks|dkr| dmvrt|<t|?t|=t|>t|<t|>t|=t|?}|Q|T|R|S|Q|S|R|T} n|dkrb| dmvrat|<t|=t|>t|?}t|<t|=t|<t|>}t|>t|?t|=t|?}|||}t|<t|?|||}|Q|R|S|T}|Q|R|Q|S}|S|T|R|T}|||}|Q|T|||} n | dw|dt dF| |}t7||H}t7||I}tt|g|g|gdjS)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)inplacerxEmpty model_data dataframeNULLr\rlrmNFc3|]}|vVqdSNrrelemmodel_data_columnsrr <z)calculate_bootstrap_ci..ryrzr~rwryrzr{r|r}rr>c3rrrrrrrr[rrrr~rrrrrrc3rrrrrrrrqrrrrrrrrrrrc3rrrrrrrrrrrrrrrrrrrc3rrrrrrrrrrrrrrrrrrrrrrrrrrz3FATAL ERROR: Cannot convert columns for line_type ""rc3rrrrrrrrrrrrrrrrc3rrrrrrrrrrZF0_O0rCOUNTSri_valsfy_oyfy_onfn_oyc&g|]}j||fqSr reset_indexrMr,r fy_oy_cols model_datarrrz*calculate_bootstrap_ci..crrrr fy_on_colsrrrrrcrrrr fn_oy_colsrrrrrc3rrrrrrrrrrrrrrrrrrrrrr7FATAL ERROR: Could not recognize line type from columns MATCHED_PAIRSz2Sample too small for bootstrapping. (Matched pairsz sample size: z; minimum samplez size: )CI_LOWERCI_UPPERSTATUSgY@rrrr)sizeaxis g.ArrXc$g|]}tjjtjddqSTrr.randomchoicer#rrr )fo_matched_estrrrEcsg|] }tj|qSr)r.takeTr)ridxsrrrMs)rrrz3 is not currently a valid option for bootstrapping FORECASTSz.Sample too small for bootstrapping. (ForecastscSsg|]}gqSrr)ritemrrrrnsrcg|]}|jqSrrr summary_statidxrrrcrrrr)rZrrrrc"g|] \}}tt|qSrr.rr/rsrrrrrcrrrrrrrrrcrrrr)fbsrrrrcrrrrrrrrrz is not currently a valid optionrrQ)rrrRrSrTrUrVrWrXrYrZr[r]r^r_rirjrkrnrorprqrrrsrtrurvrwrxryrzr{r|r}r~)8rr6rEtolistwarningrMr.anyr0powerr r get_MCTC_cols_for_sumr/rBrupperr,r rHdictrIr2rsr multinomialr enumeratemultivariate_normalr r(vstackr/prodr#r,rrr1r rDZffabar_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_methodrr8Znrepllevel bs_min_samp conversionstatusr stat_valuesstat_values_fbarstat_values_obar bool_converttotalr[fobarffbaroobarcoefconstfbar_ogobar_ogfabaroabarfoabarffabarooabarufbarvfbaruobarvobaruvfobaruvffbaruvoobarufbar_ogvfbar_oguobar_ogvobar_ogufabarvfabaruoabarvoabaruvfoabaruvffabaruvooabarfs_rmsos_rmsmsverbfstdevostdevfdirodirrg obar_speedrcrdr`rarrrfn_oncountsn_cati_valr]r^r_rkriZ 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_sampZfvarZovarZfocovarrr Zfo_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_bsZ fbs_est_meanZ fss_est_meanZ afss_est_meanZ ufss_est_meanZfrate_est_meanZorate_est_meanZ fbs_samplesZ fss_samplesZ afss_samplesZ ufss_samplesZ frate_samplesZ orate_samplesZfbs_bsZfss_bsZafss_bsZufss_bsZfrate_bsZorate_bsZ fbs_est_sampZ fss_est_sampZ afss_est_sampZ ufss_est_sampZfrate_est_sampZorate_est_sampZstat_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) rZrrrrrrrrrrcalculate_bootstrap_cis                                                 &&                                                                                                    $                                  &    &   &    &                  &   &  &    r!cYsjjdgkrG|dd}|dks|dks|dkr<jdddg}jddd}jddd}njddd}nt|rOd}nd }tfd d d Drd }jddd} jddd} jddd} jddd} jddd} |r|\}}| }| }|||} |||} t|d| ||||||t|d} t|d| d|||t|d} t|d| d|||t|d} ntfdd dDrMd}jddd}jddd}jddd}jddd}jddd}|rK|\}}||}||}t|d|}t|d|}t|d|}ntfdd dDr d}jddd }jddd!}jddd"}jddd#}jddd$}jddd%}jddd&}|r |\}}|}|}|} |}!|||}|||}|| |}||!|}t|d||||| ||!t|d}t|d|d||||t|d}t|d|d||| |!t|d}ntfd'd d(Drd)}jddd*}"jddd+}#jddd,}$jddd-}%jddd.}&jddd/}'jddd0}(|r|\}}||"}"||#}#||$}$||%}%t|d|&}&t|d|'}'t|d|(}(nmtfd1d d2Dr;d3}jddd} jddd} jddd4})jddd5}*jddd6}+jddd7},jddd8}-jddd9}.jddd:}/jddd;}0jddd<}1jddd=}2jddd>}3jddd?}4jddd@}5jdddA}6|r9| dB|dCt dDntfdEd dFDrxdG}jddd}7jdddH}8jdddI}9jdddJ}:jdddK};ntfdLd dMDrdN}jddd}7jdddO}<jdddP|<}=jdddQ|<}>t |=|>dRt |=|>dSt |=|>dTt fdUdV jD}8t fdWdV jD}9t fdXdV jD}:tj|8|7jdYdZ}8tj|9|7jdYdZ}9tj|:|7jdYdZ}:|7|8|9|:};ntfd[d d\Dred]}jddd}7jddd^}?jddd_}@jddd`}Ajddda}Bjdddb}Cjdddc}Dntfddd deDrdf}jddd}7jdddg}Ejdddh}Fjdddi}Gjdddj}Hjdddk}Ijdddl}JnEtfdmd dnDrdo}jddd}7jdddp}Kjdddq}Ljdddr}Mjddds}Nn | dtt dDt||}O|dukr8|d kr | | }n|dkrt|t|}n|d3kr)| | }n|dvvr6|8|9|8|:}n|dwkrj|d krOt| | d| }n|dkrat||d|}n|dfkrh|G}n|dxkrx|dfkrv|E}n|dykr|dfkr|F}nx|dzkr|dfkr|H}nj|dukr|dfkr|I}n\|d{kr|d kr|J}nN|dfkr|J}nE|d|kr|dokr|L}n7|d}kr|dokr|M}n)|d~kr|dokr|N}n|dkr|dokr|K}n |dkrJ|d kr| | | }P| | | }Q| | | }Rt|P|Qd|R}n|dkrH|||||}P|||||}Q|||||}Rt|P|Qd|R}n|dkr|d krj| | d| }S| | | }QdD|S|Q}n|dkr||d|}S|||||}QdD|S|Q}nu|dkr|d kr| | | }P| | | }Qt|Pt|Q}nS|dkr|||||}P|||||}Qt|Pt|Q}n.|d3kr|-|.}n#|dkr|d krt| | d}n|dkrt||d||d}n|dkr|d kr?| | d}P| | d}Q| | | }R|Rt|P|Q}Tt|P|Qdt|P|Q|T}n|dkr}|||||}P|||||}Q|||||}R|Rt|P|Q}Tt|P|Qdt|P|Q|T}n|dkr|d kr| | | }P| | | }Q| | | }R|Rt|P|Q}nX|dkr|||||}P|||||}Q|||||}R|Rt|P|Q}n*|dkr |dkr|||}P|||}Q|||}R|Rt|P|Q}|d)kr|&t|'|(}n|dkr,|d kr| }n|dkr#t|}n|d3kr*| }n|dkrO|d kr:| }n|dkrFt|}n|d3krM| }n|dkr|d krxjddddg}jddd}jddd}n|dkrjddd%d&g}tjddd%}tjddd&}n\|d3krĈjddddg}jddd}jddd}n8|dkr|d3kr|5}n*|dkr|d3kr|6}n|dkr|d3kr|,}n|dkr|d3kr|3}n|dk r |d3k r |4}n|dk r!|d3k rjddd}n|dk r6|d3k r4jddd}n|dk rD|d3k rB|1}n|dk rR|d3k rP|/}n|dk s\|dk rr|dv ri|8|:|7}n|d]k rp|D}n|dk r|dv r|8|9|7}nz|d]k r|C}nq|dk r|d]k r|@}nc|dk r|d]k r|A}nU|dk r|d]k r|B}nG|dk s|dk r|dv r|8|9|7}|8|:|7}tj||gdDd}n!|dk r|dv r|8|;|7}n|dk r|dv r|8|9|8|:}n|dk s |dk r|dv r|8|8|:}n|dk s"|dk r.|dv r-|9|9|;}n|dk r?|dv r>|;|9|;}n|dk rP|dv rO|9|9|8}n|dk rc|dv rbd|9|9|8}n|dk sm|dk r{|dv rz|8|8|9|:}n|dk s|dk r|dv r|8|9|8|:|7}U|8|U|8|9|:|U}n]|dk s|dk s|dk r|dv r|8|;|9|:|8|:|9|;}n8|dk r|dv r|8|9|8|:}V|:|;|9|;}W|V|W|7}U|8|;|U|7|U}n | d|dt dD|jj}X|d|OfS)a<! Calculate the statistic from the data from the read in MET .stat file(s) Args: model_data - Dataframe containing the model(s) information from the MET .stat files stat - string of the simple statistic name being plotted Returns: stat_values - Dataframe of the statistic values stat_plot_name - string of the formal statistic name being plotted rxrrr\rlrmNTFc3rrrrrrrrGrz!calculate_stat..rrwryrzr{r|r}rr>c3rrrrrrrrerrrrrrrrc3rrrrrrrrzrrrrrrrrrrc3rrrrrrrrrrrrrrrrrrc3rrrrrrrrrrrrrrrrrrrrrrrrrz8FATAL ERROR: Cannot convert column units for line_type "rrc3rrrrrrrrrrrrrrrc3rrrrrrrrrrrrrrrrrcrrrrrrrrrz"calculate_stat..crrrrrrrrrcrrrrrrrrr)rBrc3rrrrrrrrrrrrrrrrrc3rrrrrrrrr)rrrrrr~rrrrrrr~c3rrrrrrrr r)rrrrrrrrrrrQ)rrrRrrrrrrrrrSrTrUrVrWrXrYrZr[r`rarbrcrdre)rrrf)rrrgrhrirjrrkr]r^r_rrnrorprqrrrsrtrurvrrwrxryrzr{r|r}r~rr)r6rErrrMr.rr0rr r rr/rrBr rHrrDrnlevels)Yrrr8rrrrrrrZr[rrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r r rrbrrrrrgrrcrdr`rarrrrrrrrrr]r^r_rkrirrrRrrQrrrrrrOrrrrrrrr Znindexr)rrrrrrr5's                                                                                                     ( $                                                                                r5cCs||dtj|dd}d||vr#|d|d}|d7}nd|vr4|d|d}|d7}tj|d|}|S) Nr _dump_row.statrK fcst_leadfcst_lead_avgs.txtz_fcst_lead_avgs.txtr$r pathbasenamerXr)r8input_filenamer$output_base_dirZlead_avg_filenameZ lead_avg_filerrrget_lead_avg_files$    r,cCs|dtj|dd}d||vr|d|d}nd|vr0|d|d}|d7}|d|d7}tj|d |}|S) Nr r#rKr$r%Z_fcst_lead_avgsZ_CI_r&r$r')r8r*r$r+rNZ CI_filenameZCI_filerrr get_ci_files"   r-c sfdddD|g}tttjjd}|D]]fddtjD}t|D]\}}|dkrC|}n|j |ddd }| }q8| } |D](}| D]!\} } | dd | ddddf vr}|| q\qVq"j|} | j| d g j} | |} | jdkrʈjjjjd td d _tfd dtttjdD}n |ddd}|r|d| |fS|d|d|d|fS)Ncsg|] }|vr|qSr)keys)rkey)dfrrr1s  z$equalize_samples..) LEAD_HOURSrrFCST_THRESH_SYMBOLFCST_THRESH_VALUErhrcs.g|]}t|dtkr|qS)r)r get_group)rname) cols_to_check df_groupsunique_indep_varrrr>s  rinnerF)how indicatorr]rrcs*g|]}tjt|ddjdkqS)rr<)r.uniquexsrr)rr8)df_groups_sizesrrrjsz;Sample equalization was successful but resulted in an emptyz dataframe.Tz@Data were successfully equalized along the independent variable.zEFATAL ERROR: Data 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.)r3r.r=r/r!groupsr.rrmergedrop_duplicatesiterrowsto_numpyrr(rMrBr set_levelslevelsr2rr0r0r)rr0group_byindexesZunique_indep_varsdfsrZdfs_iZ df_mergedZ match_theserrowZ df_equalizedZdf_equalized_groupsZdata_are_equalizedr)r6r0r7r?r8requalize_samples/s|          rKc 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)Nrrrr-)r#rr r(r) Z listed_itemsZ joincharsZprecharsZ postcharsZ prechars_lastZpostchars_lastZ new_itemsrrstartrrrget_name_for_listed_itemss>   $  & rNc CszCtt|jdd|d|jdd|dddd}|jdddt|jdd|dkrA|d7}W|SW|StyOd}Y|Sw)N,rLrKrrrNA)r.risinrMr rXr# IndexError)df_ctccol_varrename_col_varrrrrget_MCTC_i_valss$.  rVcstdd|D}i}t|D] \}}||d|d<q|jd i||}|jdid}|jfdddd |d <|S) NcSsg|]}|dqS)rO)r )rZ mctc_valsrrrrsz'convert_MCTC_to_CTC..valrvalue)r6cs t|Sr)rV)xrTrUrrs z%convert_MCTC_to_CTC..rrr)r.r=rassignmeltr.renameapply)Zdf_mctcrTrUZctc_valsZ ctc_vals_dictvrWrSrrZrconvert_MCTC_to_CTCsrac Cs`g}|dvr#|D]}t|}t|}|d|d|gq |S|dvrbt|D]2\}}g}tj||ddD]} t|t| krYt|}t| }|d|d|q<||q-|S|dvrt|D]2\}}g}tj||ddD]} t|t| krt| }t|}|d|d|q{||ql|Std|d td |S) N)rarr )rrr r )rczctc_metric_name, z is not permitted.r) r)r r(rr.r1printsysr ) Zn_catsrZctc_metric_namecolsrZF_numZO_numnZ cols_for_sumiirrrrs@      r)r rer$r3numpyr.pandasr warningsfilterwarningsrrJr[rvrr*r;rPrr!r5r,r-rKrNrVrarrrrrsN   8+!3&'m`Y#