B u `¥Kã@sddlZddlmZmZmZmZmZm Z m Z m Z m Z m Z ejZe jZe ddgdd\ZZee @e @e@e@Zdd„Zd d „Zd d „Zd(d d„Zd)dd„Zd*dd„Zd+dd„Zdd„Zddgdddddfdd„Zdd„Zdd„Zdd„Zd d!„Z dd"d#gdfd$d%„Z!dd"d#gdfd&d'„Z"dS),éN) Ú matplotlibÚmatplotlib_availableÚnumpyÚnumpy_availableÚpandasÚpandas_availableÚscipyÚscipy_availableÚcheck_min_versionÚattempt_importZseabornÚsnsF)Z alt_namesZonly_catch_importerrorc Csr| ¡}| ¡d}| ¡d}| ¡d}tt ||¡ƒ}tt ||||¡ƒ}||}||} || ||ffS)Néré)Zget_subplotspecZ get_geometryÚintÚnpÚmod) ÚaxÚcolumnsZspsZnxÚnyÚcellÚxlocÚylocÚxvarÚyvar©rúB/tmp/pip-unpacked-wheel-n62dbgi3/pyomo/contrib/parmest/graphics.pyÚ_get_variables s   rcCs¤t t|ƒtt|ƒt|ƒƒdt|ƒtt|ƒt|ƒƒd|¡}t t|ƒtt|ƒt|ƒƒdt|ƒtt|ƒt|ƒƒd|¡}t ||¡\}}||fS)Nr)rZlinspaceÚminÚabsÚmaxZmeshgrid)ÚxÚyÚncellsZxlinZylinÚXÚYrrrÚ _get_XYgrid/sFFr%cCsBi}x8|D]0}|||gkr,|| ¡||<q ||g||<q Wtjttj| ¡Žƒ| ¡d}x†||jD]x}||  ¡||  ¡} | dkrj|  ¡} | dkr¼| |||  ¡d| |<n| |||  ¡| |<|j | dd}qjWt jjt ||¡t |dg¡t ||¡ddd |d<||} ||} |d} | | | fS) N)rg:Œ0âŽyE>ré T)Ú ignore_indexÚobjZlinear)ÚmethodZrescale)ÚuniqueÚpdÚ DataFrameÚlistÚ itertoolsÚproductÚvaluesÚkeysrÚstdÚmeanÚcopyÚappendrZ interpolateZgriddatarÚarray)rrrÚdataÚ theta_starZ search_rangesÚvarÚ data_sliceÚcolZcvÚtempr#r$ÚZrrrÚ_get_data_slice7s2      r>c Cs6t ¡}t||ƒ\}}} |j|||||dddS)Né#)ÚcÚs)ÚpltÚgcarÚscatter) r r!Úcolorrr8ÚlabelrrrÚlocrrrÚ _add_scatter`srHcCsœt ¡}t||ƒ\}} } ||} || } ||} || }|j| | g| | g|d|j| | g| |g|d|j| | g||g|d|j| | g|| g|ddS)N)rE)rBrCrZplot)r r!rErÚ lower_boundÚ upper_boundrFrrrrGZxminZyminZxmaxZymaxrrrÚ_add_rectangle_CIgsrKc Csjt ¡} t| |ƒ\} } } t|||ƒ\} }g}t|tjjƒr®xb|jD]X}|| krZ|  | ¡qB|| krn|  |¡qB|| | gkrB|  t   ||g|g|¡¡qBWt   t |ƒ¡}nŠt|tjjƒr4xh|jD]^}|| krâ|  |  ¡¡qÆ|| krú|  | ¡¡qÆ|| | gkrÆ|  t   ||g||¡¡qÆWt   |¡}ndS| |¡}| ||f¡}| j| |||g|ddS)N)ÚlevelsÚcolors)rBrCrr%Ú isinstanceÚstatsZ _multivariateZmultivariate_normal_frozenÚindexr5rr6ZdstackÚtupleÚkdeÚ gaussian_kdeZravelÚpdfZreshapeZcontour)r r!rErr"ÚalphaÚdistr8rFrrrrGr#r$r:r9r=rrrÚ_add_scipy_dist_CIvs4    $  "  rWcCs|t ¡}t||ƒ\}} } yDt|| |||ƒ\} } } tj | | ¡}tj d¡}tj || |dWnt d|| dƒYnXdS)NZGreys)ÚcmapzObjective contour plot forz slice failed) rBrCrr>rZtriZ TriangulationÚcmZget_cmapZ tricontourfÚprint)r r!rErr7r8rFrrrrGr#r$r=ZtriangrXrrrÚ_add_obj_contouršs r[c Csö|dk r|j|dd}|dkr”i}xp|jD]f}t || ¡|| ¡¡}|dkrd|| ¡d}|| ¡|d|| ¡|dg||<q*Wx\|j ¡D]N}t||jƒ\}}\} } | | krà|  ||¡|  ||¡q |  ||¡q WdS)NT)r'g»½×Ùß|Û=r&é) r5rrrrrÚfigZget_axesrZset_ylimZset_xlim) ÚgÚ axis_limitsZ theta_valsr8r;Z theta_rangerrrrrrrrÚ_set_axis_limits¨s  r`Tc ! Csnt|tjƒst‚t|tdƒttjtjfƒs.t‚t|tdƒttfƒsFt‚t|t ƒsTt‚t |ƒ  t dddgƒ¡spt‚t|tdƒtfƒs†t‚t|tdƒt fƒsœt‚t|t ƒsªt‚t|tdƒt fƒsÀt‚t|ƒdkrÐdSt|tƒrät |¡}t|tjƒr|jddd…f}dd„|jDƒ} ||jkrFt|ƒdkrF|j||d k| f} n|| } |dk r`|| }g} t | ¡} ttd ƒrˆ|  tj¡n| jtjd d d d d |jkrÀ|rÀ| jt| ||d| jtjdd|  tjjdgdgdddddd¡|dk r4| jtd| |d|  tjjdgdgdddddd¡dddg} |dk rÐt|ƒdkrÐ|dkrpt dƒ|  !¡}d}d}xTt"|ƒD]F\}}|dkrät#| |ƒ\}}| jt$| || ||d|  tjjdgdg| |d |d!¡næ|dkrVt%| ƒ}| &| ¡}t' (|d |d"¡}| jt)| || d"|||d#|  tjjdgdg| |d |d!¡nt|dkr„t*| ƒ}| &|  +¡¡}t' (|d |d"¡}| jt)| || d"|||d#|  tjjdgdg| |d |d!¡q„Wt,| || |ƒxd| j- .¡D]V}|j/d$d%d&d'|rêt0|| ƒ\}}}|t| ƒd dfkrê|j1| d(d)d*id+qêW|rd| j2j3d,d-| j2 4|¡d }|rDxÈ| j- .¡D]º}t0|| ƒ\}}\}}||krz| 5¡| 6|¡| 7|¡t 8¡}||_8|j- |¡| 9|¡t :¡\}}| ;¡} | <| ¡| 5¡t =|¡|j>d d.|rz|j1| d(d)d*id+qzWt =| j2¡|dkrXt ?¡nt @|¡t =¡dS)/a½ Plot pairwise relationship for theta values, and optionally alpha-level confidence intervals and objective value contours Parameters ---------- theta_values: DataFrame, columns = variable names and (optionally) 'obj' and alpha values Theta values and (optionally) an objective value and results from leaveNout_bootstrap_test, likelihood_ratio_test, or confidence_region_test theta_star: dict or Series, keys = variable names, optional Theta* (or other individual values of theta, also used to slice higher dimensional contour intervals in 2D) alpha: float, optional Confidence interval value, if an alpha value is given and the distributions list is empty, the data will be filtered by True/False values using the column name whose value equals alpha (see results from leaveNout_bootstrap_test, likelihood_ratio_test, or confidence_region_test) distributions: list of strings, optional Statistical distribution used to define a confidence region, options = 'MVN' for multivariate_normal, 'KDE' for gaussian_kde, and 'Rect' for rectangular. Confidence interval is a 2D slice, using linear interpolation at theta*. axis_limits: dict, optional Axis limits in the format {variable: [min, max]} title: string, optional Plot title add_obj_contour: bool, optional Add a contour plot using the column 'obj' in theta_values. Contour plot is a 2D slice, using linear interpolation at theta*. add_legend: bool, optional Add a legend to the plot filename: string, optional Filename used to save the figure NZMVNZKDEZRectrz Empty datacSs,g|]$}|dkrt|tƒst|tƒs|‘qS))r()rNÚfloatr)Ú.0r;rrrú ös z!pairwise_plot..Tz0.11F)rRÚhistZ norm_histr()rr7r8r&)rAÚoÚwÚthetasZ cadetblueé)ÚmarkerrErFZmarkerfacecolorZ markersizeÚk)rErr8ztheta*éÚrZ mediumblueZdarkgrayzptheta_star is not defined, confidence region slice will be plotted at the mean value of theta)rErrIrJr )rEZlwrFéd)rErr"rUrVr8Zsci)éþÿÿÿrZboth)ÚstyleZ scilimitsZaxisÚbestÚsizeé)ZhandlesrGÚpropgÍÌÌÌÌÌì?)Útop)Úreset)ArNr+r,ÚAssertionErrorÚtypeÚdictZSeriesrrar-ÚsetÚissubsetÚstrÚboolÚlenrGrr ZPairGridr Zmap_diagZhistplotZdistplotZ map_offdiagr[rBrDr5rÚlinesZLine2DrHrZr3Ú enumerateÚ fit_rect_distrKÚ fit_mvn_distrTrOZscoreatpercentilerWÚ fit_kde_distÚ transposer`ZaxesÚflattenZticklabel_formatrÚlegendr]Zsubplots_adjustZsuptitleÚremoveÚ set_xlabelÚ set_ylabelÚfigureZadd_axesZsubplotsÚ get_positionZ set_positionÚcloseZ tick_paramsÚshowÚsavefig)!Ú theta_valuesr8rUÚ distributionsr_ÚtitleZadd_obj_contourZ add_legendÚfilenameZ theta_namesrgZlegend_elementsr^rMZmvn_distZkde_distÚirVZlbZubr=ZscorerrrrGZlower_triangle_onlyrrr]ÚfÚdummyZbboxrrrÚ pairwise_plot¾sÔ'                                     r•cCstt|tjƒst‚t|ttfƒs"t‚tj dd|dt |ƒd¡}|  ¡}|  ¡}|||}|||}||fS)aR Fit an alpha-level rectangular distribution to theta values Parameters ---------- theta_values: DataFrame, columns = variable names Theta values alpha: float, optional Confidence interval value Returns --------- tuple containing lower bound and upper bound for each variable r r) rNr+r,rvrrarOÚtZppfr}r3r2)rŽrUZtvalÚmrArIrJrrrr€{s"  r€cCs,t|tjƒst‚tj| ¡| ¡dd}|S)zþ Fit a multivariate normal distribution to theta values Parameters ---------- theta_values: DataFrame, columns = variable names Theta values Returns --------- scipy.stats.multivariate_normal distribution T)Zallow_singular)rNr+r,rvrOZmultivariate_normalr3Zcov)rŽrVrrrr•s rcCs$t|tjƒst‚t | ¡j¡}|S)zû Fit a Gaussian kernel-density distribution to theta values Parameters ---------- theta_values: DataFrame, columns = variable names Theta values Returns --------- scipy.stats.gaussian_kde distribution )rNr+r,rvrOrSrƒr0)rŽrVrrrr‚¨s r‚cCs||r,| ¡}| ¡}|||}|||}t |d||d|i¡}|jddd|jddidd|jd|jdd }|S) Nrr T)ÚlevelÚinplaceZlevel_0ry)rr™r)Zid_varsZ value_varsÚvar_name)Zmedianr2r+ÚconcatZ reset_indexÚrenameZmeltr)Údata1Údata2Ú normalizeÚ group_namesZ data_medianZdata_stdr7rrrÚ_get_grouped_data»s   r¡rržcCsÔt|tjƒst‚t|tjƒs t‚t|tƒs.t‚t|tƒsrHrKrWr[r`r•r€rr‚r¡r§r©rrrrÚ s40 )   $ < )