U TcS@sddlZddlZddlZddlZddlZddlZedddZ ddZ ddZ d d Z d d Z d dZddZddZddZddZddZdS)Nignorec7 Cstt|dddd}t|ddd} t|dd} ttd|dttd|dttd|dttd|dd} d D]} | | d } | | d }t| d krt|d kr|D]}tt|d d dd}t|d dd}t|dd}tj|| | |||d}|}t|d}t|dd}t|dd}t| d t| d t| d }| | d  |qt|d krt| d kr| D]}tt|d d dd}t|d dd}t|dd}tj|| | |||d}|}t|d}t|dd}t|dd}t| d t| d t| d } | | d  | qqdD]} | d| d}!| d| d}"t|!d krt|"d kr| d| d| d| d<t|"d krt|!d kr| d| d| d| d<qi}#d| d| fD]`} | | d}$t|$d krt |$}%t |$}&|%|&kst|$dkrtjdd}'ng}(tt|$D]v})|$|)|&kr|( tjddtj|$|)dtjddn.|( tj|$|)ddtj|$|)dqt|(}*t|*|*d krZ|*d }'n t |*}'tj||%d}+tj||&d},t|+|,|'|'tj}-ng}-|-|#| d<qT|dkrd}.n|dkrd}.tjtt|ddd| | d}/|.dkrd|/}/d D]6} |#| d| d|/|#| d|. d<q|#d| d}-|#d}0g}1g}2|-D]>}3|3}4|4jd|4jd|4j}5|1 |3|5dqt|#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_datesZVALIDZINIT_Zfcst_valid_datesg@z %Y%m%d_%H%M%S)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_dater4M/scratch2/NCEPDEV/ensemble/save/Jiayi.Peng/tc_verify/ush/plot_tropcyc_util.pyget_date_arrays s>!                            r6cCs |d}d}d}|D]}|dkr&q|}dD]}||kr.|}||d}q.|dkrn|d|7}|d|7}q|dkr|d|7}|d |7}q|d kr|d |7}|d |7}q|d kr|d|7}|d|7}q|dkr|d|7}|d|7}q|dkr|d|7}|d|7}q||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@)r9r?r9r?)r>rDr>rD)r=rCr=rC)r;rAr;rA)r<rBr<rB)rreplace)ZthreshZ thresh_listZ thresh_symbolZ thresh_letterZ thresh_valueoptZ thresh_optr4r4r5 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_columnsr4r4r5get_stat_file_base_columnssf 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|dY|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 METVrCTCFY_OYFY_ONFN_OYFN_ON)rIerrorexit)loggerrJ line_typeZstat_file_line_type_columnsr4r4r5get_stat_file_line_type_columnss     rcs>tt|t|kr6tt|}t|}nt|}dt|}|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}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?rrg?cs g|]}d|qS)rr4).0idxspacingspanr4r5 xszget_clevels..dtypeN) r!absnanminnanmaxroundr"rrIr)datarZcmaxZcminZstepsposnegZclevelsr4rr5 get_clevelsWs2       rc CsJt|dddf}|dkrZtt|dddfD] }tj||ddf||<q6n|dkrtt|dddfD]>}|tj||ddftj||ddf||<qzn|dkr4|jd}| d dg}|j d|_ t ||||\} } } tt| dddfD]}| |||<qn|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_namesumrz?Invalid entry for MEAN_METHOD, use MEAN, MEDIAN, or AGGREGATION)r! empty_likerrmameaninfomedianshapegroupbyaggcolumnsZ droplevelcalculate_statr~r) raverage_methodstatZmodel_dataframeZmodel_stat_valuesZ average_arraylndaysZmodel_dataframe_aggsumZ avg_valuesZ avg_arraystat_plot_namer4r4r5calculate_average~s*      rc% Cs|dkr||}|tj|} |} t|| d} | dkr^d| t| d} n| dkr| dkrd| t| d} n\| dkr| dkrd | t| d} n4| dkr| d krd | t| d} n | d krd } n|d krd\} }g}|jjD]}||dqt|} t j j dgtj d|dt d|gdddgd}t j j dgtj d|dt d|gdddgd}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} qtj} t|||\}}}t|||\}}}t|||||d d ddddf}t|||||d d ddddf} | |}!t|!|}"t|!|"d}#t|#|d}$d|$} n|dtd| 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)ri'Zrand1rrntestr1)namesZrand2)indexrg?Nz:Invalid entry for MAKE_CI_METHOD, use EMC, EMC_MONTE_CARLO)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_stdZintvlrZntestsr1Zidx_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_stdr4r4r5 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||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 biasBiasrmseRoot Mean Square Errormsess&Murphy's Mean Square Error Skill ScorersdRatio of Standard Deviationrmse_md&Root Mean Square Error from Mean Errorrmse_pv-Root Mean Square Error from Pattern VariationpcorPattern CorrelationaccAnomaly Correlation CoefficientfbarForecast Averages fbar_obar!Forecast and Observation Averages speed_err5Difference in Average FCST and OBS Wind Vector Speedsdir_err8Difference in Average FCST and OBS Wind Vector Directionrmsve(Root Mean Square Difference Vector Error vdiff_speedDifference Vector Speed vdiff_dirDifference Vector Directionfbar_obar_speedAverage Wind Vector Speed fbar_obar_dirAverage Wind Vector Direction fbar_speed"Average Forecast Wind Vector Speedfbar_dir&Average Forecast Wind Vector DirectionorateObservation Ratebaser Base Ratefrate Forecast Rate orate_frateObservation and Forecast Rates baser_frateBase and Forecast RatesaccuracyAccuracyfbiasFrequency BiaspodProbability of DetectionhrateHit RatepofdProbability of False DetectionfarateFalse Alarm Ratepodn)Probability of Detection of the Non-EventfaratioFalse Alarm RatiocsiCritical Success Indexts Threat ScoregssGilbert Skill ScoreetsEquitable Threat ScorehkHanssen-Kuipers DiscriminanttssTrue Skill ScorepssPeirce Skill ScorehssHeidke Skill Score is not a valid optionr)r~r)rrrr4r4r5get_stat_plot_names                          r cAs|jjdgkr|dd}|dks<|dks<|dkrv|jdddg}|jddd}|jddd}n|jddd}ntfdd d Drd }|jddd }|jddd }|jddd} |jddd} |jddd} n~tfdd dDrd}|jddd} |jddd} |jddd}|jddd}|jddd}ntfdd dDrd}|jddd}|jddd}|jddd}|jddd}|jddd }|jddd!}|jddd"}nftfd#d d$Drd%}|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=},ntfd>d d?Drrd@}|jddd}-|jdddA}.|jdddB}/|jdddC}0|jdddD}1n|dEtdF|dGkrdH}2|d kr||}nN|dkrt |t |}n.|d/kr||}n|d@kr|.|/|.|0} n|dIkrLdJ}2|d kr(t | | dK| }n |dkrt ||dK|} n|dLkrdM}2|d kr| | dK| }3| ||}4dF|3|4}n:|dkr||dK|}3|||||}4dF|3|4} n|dNkrpdO}2|d kr| ||}5| ||}4t |5t |4}nZ|dkrZ|||||}5|||||}4t |5t |4}n|d/kr|#|$}nx|dPkrdQ}2|d krt ||dK}n(|dkrt ||dK||dK}n |dRkrdS}2|d kr8| |dK}5| |dK}4| ||t |5|4}6t |5|4dKt |5|4|6}nx|dkr|||||}5|||||}4|||||t |5|4}6t |5|4dKt |5|4|6}n4|dTkrXdU}2|d kr| ||}5| ||}4| ||t |5|4}nT|dkr|||||}5|||||}4|||||t |5|4}n|dVkrdW}2|dkr|| | t || | || | }n|d%kr|t ||}n,|dXk rdY}2|d kr|}n$|dkrt |}n|d/kr|}n|dk rdZ}2|d k rV|jddd d g}|jddd }|jddd }n|dk r|jddd!d"g}t |jddd!}t |jddd"}nD|d/kr|jddd d g}|jddd }|jddd }n|d[k rd\}2|d/kr|+}n|d]k r0d^}2|d/kr|,}n|d_k rPd`}2|d/kr|"}n|dak rpdb}2|d/kr|)}nx|dck rdd}2|d/kr|*}nX|dek rdf}2|d/kr|jdddg}n*|dhk rdi}2|d/kr|jdddj}n|dkk r dl}2|d/kr|'}n|dmk r,dn}2|d/kr|%}n|dok s@|dpk rx|dok rPdq}2n|dpk r^dr}2|d@kr|.|0|-}np|dsk rdt}2|d@kr|.|/|-}nH|dk s|dk r |dk rdu}2n|dk rdv}2|d@kr|.|/|-}|.|0|-}t j ||gdFdw}n|dxk r2dy}2|d@kr|.|1|-}n|dzk r^d{}2|d@kr|.|/|.|0}n|d|k sr|d}k r|d|k rd~}2n|d}k rd}2|d@kr|.|.|0}n>|dk s|dk r|dk rd}2n|dk rd}2|d@kr|/|/|1}n|dk 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||dtdF|j j }:|dks|dks|dkr|:dFkrlt|j d};tj|j|;}tj|j|;|>}tj|j|;|>}=n|:dkrt|j d};t|j dF}>t|j dK}?tj|j|;|>|?}t|j dK}?tj|j|;|>|?}=tj|<|=g}@n|:dFkrt|j d};tj|jdF|;}@n|:dKkr:t|j d};t|j dF}>tj|jdF|;|>}@n`|:dkrt|j d};t|j dF}>t|j dK}?tj|jdF|;|>|?}@||@|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 dataframeZNULLrrrNc3s|]}|kVqdSNr4relemZmodel_data_columnsr4r5 sz!calculate_stat..)rNrOrSrLrNrOrPrQrRc3s|]}|kVqdSr r4r rr4r5rs)rUrVrSrTrUrVrWrXrYc3s|]}|kVqdSr r4r rr4r5rs)r[r\rZr[r\r]r^r_r`rac3s|]}|kVqdSr r4r rr4r5rs)rcrdrbrcrdrerfrgrhric3s|]}|kVqdSr r4r rr4r5rs)rurvrjrkrlrmrnrorprqrrrsrtrurvrwrxc3s|]}|kVqdSr r4r rr4r5rs)rzr}ryrzr{r|r}z*Could not recognize line type from columnsrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr)rsrtrr)rqrrrrrrrrrrrrrr)axisrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r)rrtolistZwarningrr#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_arrayr4rr5r}s                                        "    & "(                                                                                      rcCs||dtj|dd}d||krF|d|d}|d7}n"d|krh|d|d}|d7}tj|d|}|S) Nr_dump_row.statr8 fcst_leadfcst_lead_avgs.txtz_fcst_lead_avgs.txtrospathbasenamerEjoin)rinput_filenameroutput_base_dirZlead_avg_filenameZ lead_avg_filer4r4r5get_lead_avg_files&    r'cCs|dtj|dd}d||kr>|d|d}n"d|kr`|d|d}|d7}|d|d7}tj|d |}|S) Nrrr8rrZ_fcst_lead_avgsZ_CI_rrr )rr%rr&rZ CI_filenameZCI_filer4r4r5 get_ci_files$   r()r!rr&numpyr!pandasrwarningsfilterwarningsr6rGrKrrrrr rr'r(r4r4r4r5s* 9,!E'-nd