3 TcS@sddlZddlZddlZddlZddlZddlZejdddZ ddZ ddZ d d Z d d Z d dZddZddZddZddZddZdS)Nignorec7Cs tt|dd dd}t|d!d"d} t|d#d} ttd|jdttd|jdttd|jdttd|jdd} xd$D] } | | d } | | d }t| d kot|d krx|D]}tt|d ddd}t|ddd}t|dd}tj|| | |||d}|j}t|d}t|dd}t|dd}t|j dt|j dt|j d}| | d j |qWt|d krt| d krx| D]}tt|d ddd}t|ddd}t|dd}tj|| | |||d}|j}t|d}t|dd}t|dd}t|j dt|j dt|j d} | | d j | qWqWxd%D]} | d| d}!| d| d}"t|!d kr t|"d kr | d| d| d| d<t|"d krt|!d kr| d| d| d| d<qWi}#xd|j d|j gD]d} | | d}$t|$d krt |$}%t |$}&|%|&kst|$dkrtjdd}'ng}(xtt|$D]v})|$|)|&kr|(j tjjddtjj|$|)dtjddn.|(j tjj|$|)ddtjj|$|)dqWtj|(}*tj|*|*d krr|*d }'n tj |*}'tjj||%d}+tjj||&d},tj|+|,|'|'jtj}-ng}-|-|#| d<qhW|dkrd}.n|dkrd}.tjtt|dd&d| | d}/|.dkr*d'|/}/x>d(D]6} |#| d|j d|/|#| d|.j d<q0W|#d|j d}-|#d}0g}1g}2xF|-D]>}3|3j}4|4jd|4jd|4j}5|1j |3j|5dqW|#d}0g}2x|0D]}6|2j |6jdqW|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_timefcstobsZ _valid_timeZ _init_timer)secondsvalidinitZfcst__timeZobs_iQZ235959z%H%M%Sz %Y%m%d%H%M%SZ_datesZVALIDZINIT_Zfcst_valid_datesg@z %Y%m%d_%H%M%Srr)rr)r r r)rr)intlistfiltersplitlendatetime timedelta total_secondsstrzfillappendlowerminmaxrangestrptimenparrayallarangeastypetimehourminutesecond toordinalstrftime)7Z date_typeZdate_begZdate_endZfcst_valid_hourZfcst_init_hourZobs_valid_hourZ obs_init_hourleadZlead_hour_secondsZlead_min_secondsZ lead_secondsZvalid_init_time_infotypeZvalid_time_listZinit_time_listZitimeZitime_hour_secondsZitime_min_secondsZ itime_secondsoffsetZtot_secZ valid_hourZ valid_minZ valid_secZ valid_timeZvtimeZvtime_hour_secondsZvtime_min_secondsZ vtime_secondsZ init_hourZinit_minZinit_secZ init_timeZfcst_time_listZ obs_time_listZ date_infoZ time_listZtime_begZtime_endZdelta_tZ delta_t_listtZ delta_t_arrayZbegenddatesZoppo_date_typeZlead_timedeltaZfv_datesZplot_time_datesZexpected_stat_file_datesdatedtr Zfv_dater5M/scratch2/NCEPDEV/ensemble/save/Jiayi.Peng/tc_verify/ush/plot_tropcyc_util.pyget_date_arrays s!     *    * "            $  6  r7c Cs.|jd}d}d}x|D]}|dkr*q|}x$dD]}||kr4|}|j|d}q4W|dkrv|d|7}|d |7}q|dkr|d|7}|d |7}q|dkr|d|7}|d|7}q|dkr|d|7}|d |7}q|dkr|d|7}|d |7}q|dkr|d|7}|d |7}qW||fS)aJ! Format thresholds for file naming Args: thresh - string of the treshold(s) Return: thresh_symbol - string of the threshold(s) with symbols thresh_letters - string of the threshold(s) with letters  >=>==!=<=<gegteqnelelt) r:r;r<r=r>r?r@rArBrCrDrE)r;rA)r:r@)r?rE)r>rD)r<rB)r=rC)rreplace)ZthreshZ thresh_listZ thresh_symbolZ thresh_letterZ thresh_valueZoptZ thresh_optr5r5r6 format_threshs>         rGcCszt|}|dkrBdddddddd d d d d ddddddddddg}n4dddddddd d d dd d dddddddddddg}|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 @VERSIONZMODELZDESCZ FCST_LEADZFCST_VALID_BEGZFCST_VALID_ENDZOBS_LEADZ OBS_VALID_BEGZ OBS_VALID_ENDZFCST_VARZFCST_LEVZOBS_VARZOBS_LEVZOBTYPEZVX_MASKZ INTERP_MTHDZ INTERP_PNTSZ FCST_THRESHZ OBS_THRESHZ COV_THRESHZALPHAZ LINE_TYPEZ FCST_UNITSZ OBS_UNITS)float) met_versionZstat_file_base_columnsr5r5r6get_stat_file_base_columnss      rKc7Cst|}|dkr.|dkr*ddddddd g}nV|d krT|dkrPdd d d ddd g}n0|dkr|dkrzddddddddg}n |dkrddddddddddg }n|dkr|dkrddddd d!d"d#g}n|d$krb|dkrJddd%d&dd'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXg7}n|jdY|tdZn"|d[kr|dkrdd\d]d^d_g}|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@TOTALFBAROBARFOBARFFBAROOBARMAESAL1L2FABAROABARFOABARFFABAROOABARVL1L2gffffff@UFBARVFBARUOBARVOBARUVFOBARUVFFBARUVOOBARg@Z F_SPEED_BARZ O_SPEED_BARVAL1L2UFABARVFABARUOABARVOABARUVFOABARUVFFABARUVOOABARVCNTZFBAR_NCLZFBAR_NCUZOBAR_NCLZOBAR_NCUFS_RMSZ FS_RMS_NCLZ FS_RMS_NCUOS_RMSZ OS_RMS_NCLZ OS_RMS_NCUMSVEZMSVE_NCLZMSVE_NCURMSVEZ RMSVE_NCLZ RMSVE_NCUFSTDEVZ FSTDEV_NCLZ FSTDEV_NCUOSTDEVZ OSTDEV_NCLZ 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_NCUZ SPEED_ABSERRZSPEED_ABSERR_NCLZSPEED_ABSERR_NCUDIR_ERRZ DIR_ERR_NCLZ DIR_ERR_NCUZ DIR_ABSERRZDIR_ABSERR_NCLZDIR_ABSERR_NCUz%VCNT is not a valid LINE_TYPE in METVr CTCFY_OYFY_ONFN_OYFN_ON)rIerrorexit)loggerrJ line_typeZstat_file_line_type_columnsr5r5r6get_stat_file_line_type_columnssN                 rcs>tjtj|tj|kr6tjtj|}tj|}ntj|}d tj|}|dkrp||d}||d}n |dkr||d}||d}|dkrt|dd}t|dd}nt|dd}t|dd}d}|d|dtjfd d t|Dtd }tj|dd td d}tj|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 r dg? g?rg?cs g|]}d|qS)rr5).0i)dxspacingspanr5r6 xszget_clevels..)dtypeNrrr) r"absnanminnanmaxroundr#r rIr)datarZcmaxZcminZstepsposnegZclevelsr5)rrrr6 get_clevelsWs0       rc CsZtj|dddf}|dkr^x}|jtjj||ddftjj||ddf||<qWn|dkr@|jd}|j dj dg}|j j d|_ t ||||\} } } xFtt| dddfD]}| |||<q(Wn|jd d td|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) NrMEANZMEDIANZ AGGREGATIONmodel_plot_namesumr zInvalid entry for MEAN_METHOD, z use MEAN, MEDIAN, or AGGREGATION)r" empty_liker rmameaninfomedianshapegroupbyaggcolumnsZ droplevelcalculate_statr~r) raverage_methodstatZmodel_dataframeZmodel_stat_valuesZ average_arraylndaysZmodel_dataframe_aggsumZ avg_valuesZ avg_arraystat_plot_namer5r5r6calculate_average~s&""  rc% Cs|dkr||}|tjj|} |j} tj|| dj} | dkr^d| tj| d} n| dkr| dkrd| tj| d} n\| dkr| dkrd | tj| d} n4| dkr| d krd | tj| d} n | d krd } n|d krd\} }g}x |jjD]}|j|dqWt|} t j j dgtj d|dt d|gdddgd}t j j dgtj d|dt d|gdddgd}t jtj||jd}t jtj||jd}t|j}tj|| |g}tj|| |g}tj|dd k}tj|dd k}|j|dddf||d |dddf<|j|dddf||d |dddf<|j|dddf||d |dddf<|j|dddf||d |dddf<d} x`| |kr || dddddf|jd| f<|| dddddf|jd| f<| d7} qWtj} t|||\}}}t|||\}}}t|||||d d ddddf}t|||||d d ddddf} | |}!tj|!|}"tj|!|"d}#tj|#|d}$d|$} n|jddtd| S)a! 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 (g@gtV@rgm@z--ZEMC_MONTE_CARLO'Zrand1)rrntestr2)namesZrand2)indexrg?Nz"Invalid entry for MAKE_CI_METHOD, zuse EMC, EMC_MONTE_CARLO)r r)r"r count_maskedrsqrtrvaluesrrpdZ MultiIndexZ from_productr%rZ DataFramenanremptywhereZiloclocrrrr~r)%r ci_methodZ modelB_valuesZ modelA_valuesZ total_daysrrZrandxZmodelB_modelA_diffrZmodelB_modelA_diff_meanZmodelB_modelA_stdZintvlrZntestsr2Zidx_valZrand1_data_indexZrand2_data_indexZ rand1_dataZ rand2_dataZncolumnsZrand1_data_valuesZrand2_data_valuesZ randx_ge0_idxZ randx_lt0_idxZrand1_stat_valuesZrand1_stat_values_arrayrZrand2_stat_valuesZrand2_stat_values_arrayZrand1_average_arrayZrand2_average_arrayZ scores_diffZscores_diff_meanZscores_diff_varZscores_diff_stdr5r5r6 calculate_cis    ,,,, $$   rcCs|dkrd}n|dkr d}n|dkr0d}nz|dkr@d}nj|d krPd }nZ|d kr`d }nJ|d krpd}n:|dkrd}n*|dkrd}n|dkrd}n |dkrd}n|dkrd}n|dkrd}n|dkrd}n|dkrd}n|dkrd }n|d!krd"}n|d#kr&d$}n|d%kr8d&}nr|d'krJd(}n`|d)kr\d*}nN|d+krnd,}n<|d-krd.}n*|d/krd0}n|d1krd2}n|d3krd4}n|d5krd6}n|d7krd8}n|d9krd:}n|d;krd<}n|d=krd>}n|d?krd@}n|dAkr$dB}n|dCkr4dD}nv|dEkrDdF}nf|dGkrTdH}nV|dIkrddJ}nF|dKkrtdL}n6|dMkrdN}n&|dOkrdP}n|j|dQtdR|S)SaT! 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 biasBiasrmsezRoot Mean Square Errormsessz&Murphy's Mean Square Error Skill ScorersdzRatio of Standard Deviationrmse_mdz&Root Mean Square Error from Mean Errorrmse_pvz-Root Mean Square Error from Pattern VariationpcorzPattern CorrelationacczAnomaly Correlation CoefficientfbarzForecast 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 RatesaccuracyAccuracyfbiaszFrequency BiaspodzProbability of DetectionhratezHit RatepofdzProbability of False DetectionfaratezFalse Alarm Ratepodnz)Probability of Detection of the Non-EventfaratiozFalse Alarm RatiocsizCritical Success Indextsz Threat ScoregsszGilbert Skill ScoreetszEquitable Threat ScorehkzHanssen-Kuipers DiscriminanttsszTrue Skill ScorepsszPeirce Skill ScorehsszHeidke Skill Scorez is not a valid optionr )r~r)rrrr5r5r6get_stat_plot_names                          rcAs|jjjdgkr|jdd}|dks<|dks<|dkrv|jdddg}|jddd}|jddd}n|jddd}ntfdd dDrd }|jddd }|jddd }|jddd} |jddd} |jddd} n~tfdd dDrd}|jddd} |jddd} |jddd}|jddd}|jddd}ntfdd dDrd}|jddd}|jddd}|jddd}|jddd}|jddd}|jddd}|jddd }nftfd!d dDrd$}|jddd"}|jddd#}|jddd%}|jddd&}|jddd'}|jddd(}|jddd)}ntfd*d dDrd-}|jddd }|jddd }|jddd.}|jddd/} |jddd0}!|jddd1}"|jddd2}#|jddd3}$|jddd4}%|jddd5}&|jddd6}'|jddd7}(|jddd+})|jddd,}*|jddd8}+|jddd9},ntfd:d dDrrd=}|jddd}-|jddd;}.|jddd>}/|jddd?}0|jddd<}1n|jd@tdA|dBkrdC}2|d kr||}nN|dkrtj |tj |}n.|d-kr||}n|d=kr|.|/|.|0} n|dDkrLdE}2|d kr(tj | | dF| }n |dkrtj ||dF|} n|dGkrdH}2|d kr| | dF| }3| ||}4dA|3|4}n:|dkr||dF|}3|||||}4dA|3|4} n|dIkrpdJ}2|d kr| ||}5| ||}4tj |5tj |4}nZ|dkrZ|||||}5|||||}4tj |5tj |4}n|d-kr|#|$}nx|dKkrdL}2|d krtj ||dF}n(|dkrtj ||dF||dF}n |dMkrdN}2|d kr8| |dF}5| |dF}4| ||tj |5|4}6tj |5|4dFtj |5|4|6}nx|dkr|||||}5|||||}4|||||tj |5|4}6tj |5|4dFtj |5|4|6}n4|dOkrXdP}2|d kr| ||}5| ||}4| ||tj |5|4}nT|dkr|||||}5|||||}4|||||tj |5|4}n|dQkrdR}2|dkr|| | tj || | || | }n|d$kr|tj ||}n,|dSk rdT}2|d kr|}n$|dkrtj |}n|d-kr|}n|dk rdU}2|d k rV|jddd d g}|jddd }|jddd }n|dk r|jdddd g}tj |jddd}tj |jddd }nD|d-kr|jddd d g}|jddd }|jddd }n|dVk rdW}2|d-kr|+}n|dXk r0dY}2|d-kr|,}n|dZk rPd[}2|d-kr|"}n|d\k rpd]}2|d-kr|)}nx|d^k rd_}2|d-kr|*}nX|d`k rda}2|d-kr|jddd}n*|dbk rdc}2|d-kr|jddd}n|ddk r de}2|d-kr|'}n|dfk r,dg}2|d-kr|%}n|dhk s@|dik rx|dhk rPdj}2n|dik r^dk}2|d=kr|.|0|-}np|dlk rdm}2|d=kr|.|/|-}nH|dk s|dk r |dk rdn}2n|dk rdo}2|d=kr|.|/|-}|.|0|-}t j ||gdAdp}n|dqk r2dr}2|d=kr|.|1|-}n|dsk r^dt}2|d=kr|.|/|.|0}n|duk sr|dvk r|duk rdw}2n|dvk rdx}2|d=kr|.|.|0}n>|dyk s|dzk r|dyk rd{}2n|dzk rd|}2|d=kr|/|/|1}n|d}k rd~}2|d=kr|1|/|1}n|dk rFd}2|d=kr|/|/|.}n|dk sZ|dk r|dk rjd}2n|dk rxd}2|d=kr|.|.|/|0}nR|dk s|dkr|dk rd}2n|dk rd}2|d=kr|.|/|.|0|-}7|.|7|.|/|0|7}n|dks|dks|dkrx|dkr.d}2n|dkr>d}2n|dkrLd}2|d=kr|.|1|/|0|.|0|/|1}np|dkrd}2|d=kr|.|/|.|0}8|0|1|/|1}9|8|9|-}7|.|1|7|-|7}n|j|dtdA|j j }:|dks|dks|dkr|:dAkrlt|j jdj};tjj|jj|;}tjj|jj|;|>}tjj|jj|;|>}=n|:dkrt|j jdj};t|j jdAj}>t|j jdFj}?tjj|jj|;|>|?}t|j jdFj}?tjj|jj|;|>|?}=tjj|<|=g}@n|:dAkrt|j jdj};tjj|jjdA|;}@n|:dFkr:t|j jdj};t|j jdAj}>tjj|jjdA|;|>}@n`|:dkrt|j jdj};t|j jdAj}>t|j jdFj}?tjj|jjdA|;|>|?}@||@|2fS)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_values_array - array of the statistic values stat_plot_name - string of the formal statistic name being plotted rMzEmpty model_data dataframeNULLrrrNc3s|]}|kVqdS)Nr5)relem)model_data_columnsr5r6 sz!calculate_stat..rNrOrSrLrPrQrRc3s|]}|kVqdS)Nr5)rr)rr5r6rsrUrVrTrWrXrYc3s|]}|kVqdS)Nr5)rr)rr5r6rsr[r\rZr]r^r_r`rac3s|]}|kVqdS)Nr5)rr)rr5r6rsrcrdrbrerfrgrhric3s|]}|kVqdS)Nr5)rr)rr5r6rsrurvrjrkrlrmrnrorprqrrrsrtrwrxc3s|]}|kVqdS)Nr5)rr)rr5r6rsrzr}ryr{r|z*Could not recognize line type from columnsr rrrzRoot Mean Square Errorrrz&Murphy's Mean Square Error Skill ScorerzRatio of Standard Deviationrz&Root Mean Square Error from Mean Errorrz-Root Mean Square Error from Pattern VariationrzPattern CorrelationrzAnomaly Correlation CoefficientrzForecast Averagesz!Forecast and Observation Averagesrz5Difference in Average FCST and OBS Wind Vector Speedsrz8Difference in Average FCST and OBS Wind Vector Directionrz(Root Mean Square Difference Vector ErrorrzDifference Vector SpeedrzDifference Vector DirectionrzAverage Wind Vector SpeedrzAverage Wind Vector Directionrz"Average Forecast Wind Vector Speedrz&Average Forecast Wind Vector DirectionrrzObservation Ratez Base Raterz Forecast RatezObservation and Forecast RateszBase and Forecast Rates)axisrrrzFrequency BiasrrzProbability of DetectionzHit RaterrzProbability of False DetectionzFalse Alarm Raterz)Probability of Detection of the Non-EventrzFalse Alarm RatiorrzCritical Success Indexz Threat ScorerrzGilbert Skill ScorezEquitable Threat ScorerrrzHanssen-Kuipers DiscriminantzTrue Skill ScorezPeirce Skill ScorerzHeidke Skill Scorez is not a valid optionr)rNrOrS)rUrVrS)r[r\)rcrd)rurv)rzr})rsrt)rqrr)rrtolistwarningrr$r~rr"rrconcatrZnlevelsrZget_level_valuesuniquermasked_invalidreshaper#)ArZ model_datarrZ stat_valuesZstat_values_fbarZstat_values_obarrZobarZfobarZffbarZoobarZfabarZoabarZfoabarZffabarZooabarZufbarZvfbarZuobarZvobarZuvfobarZuvffbarZuvoobarZufabarZvfabarZuoabarZvoabarZuvfoabarZuvffabarZuvooabarZfs_rmsZos_rmsZmsverZfstdevZostdevZfdirZodirrZ obar_speedrrrrtotalZfy_oyZfy_onZfn_oyZfn_onrZmseZvar_oZvar_fRCZCaZCbZnindexZindex0Zstat_values_array_fbarZstat_values_array_obarZindex1index2Zstat_values_arrayr5)rr6r}s                                        "    & "(                                                                       "          rcCs||dtjj|jdd}d||krF|jd|d}|d7}n"d|krh|jd|d}|d7}tjj|d|}|S) Nrz_dump_row.statr9 fcst_leadfcst_lead_avgsz.txtz_fcst_lead_avgs.txtr)ospathbasenamerFjoin)rinput_filenameroutput_base_dirZlead_avg_filenameZ lead_avg_filer5r5r6get_lead_avg_files     rcCs|dtjj|jdd}d||kr>|jd|d}n"d|kr`|jd|d}|d7}|d|d7}tjj|d |}|S) Nrz_dump_row.statr9rrZ_fcst_lead_avgsZ_CI_z.txtr)rrrrFr)rrrrrZ CI_filenameZCI_filer5r5r6 get_ci_files    r)rrr'numpyr"pandasrwarningsfilterwarningsr7rGrKrrrrrrrrr5r5r5r6s* 9,!E'-nd