zmc
2023-10-12 ed135d79df12a2466b52dae1a82326941211dcc9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
U
­ý°dwã@s¶dZddlZddlZddlZddlmmZddl    m
Z
m Z m Z m Z ddlmZddlmZmZejdd„ƒZejGdd„deƒƒZejGd    d
„d
eƒƒZejGd d „d eƒƒZdS) z Test cases for .hist method éN)Ú    DataFrameÚIndexÚSeriesÚ to_datetime)Ú TestPlotBaseÚ_check_plot_workscCs tjddS)NÚts©Úname)ÚtmZmakeTimeSeries©r r ú]d:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/tests/plotting/test_hist_method.pyrsrc@sÐeZdZdd„Zdd„Zdd„Zejjdd„ƒZ    d    d
„Z
d d „Z d d„Z ej  dddddg¡dd„ƒZej  dddg¡dd„ƒZej  dddg¡dd„ƒZd d!„Zejjd"d#ejd$d%„ƒƒZejd&d'„ƒZdS)(ÚTestSeriesPlotsc    Cs8t|jƒt|jddt|jddtjtddt|j|jjdW5QRXtjtddt|j|jjddW5QRX|j d    d    ¡\}}t|j|d
d t|j||d
d t|j|d
d t     ¡|j d    d¡\}\}}t|j||d
dt|j||d
dd}t
j t |d|j|j|dW5QRXdS)NF©Zgrid©éé
©Úfigsize©Zcheck_stacklevel©Úbyé)rÚbinséT)ÚaxÚ default_axes)rÚfigurer)rré)rrrz`Cannot pass 'figure' when using the 'by' argument, since a new 'Figure' instance will be created©Úmatch)rr) rÚhistr Úassert_produces_warningÚ UserWarningÚindexÚmonthÚpltÚsubplotsÚcloseÚpytestÚraisesÚ
ValueError)ÚselfrÚfigrÚax1Úax2Úmsgr r r Útest_hist_legacys&
ÿz TestSeriesPlots.test_hist_legacycCs<ttj dd¡ƒ}|jdddd}t|jƒdks8t‚dS)Nrr©rr)rÚnpÚrandomÚrandnr!ÚlenÚpatchesÚAssertionError)r,Údfrr r r Útest_hist_bins_legacy8sz%TestSeriesPlots.test_hist_bins_legacyc    Cs`|}d}tjt|d|jjddW5QRXtjt|d|jjddgdW5QRXdS)Nz7The 'layout' keyword is not supported when 'by' is Noner©rr©Úlayoutr)r)r*r+Úheightr!)r,Úhist_dfr9r0r r r Útest_hist_layout=s z TestSeriesPlots.test_hist_layoutc    Csà|}tjtddt|jj|jdd}W5QRX|j|dddtjtddt|jj|jdd}W5QRX|j|dddtjtddt|jj|jd    d}W5QRX|j|d
d    dtjtddt|jj|jd d}W5QRX|j|d
d dtjtddt|jj|jdd}W5QRX|j|d
d dtjtddt|jj|jdd}W5QRX|j|d
ddtjtddt|jj|j    d d}W5QRX|j|dd d|jj|jddd}|j|d
ddddS)NFr©rr©rr=r©Úaxes_numr=)ééÿÿÿÿ)rEr©érrH©rrF©rr)rEr©rFrH©rrHrE©rHr)é é)rr=r©rDr=r)
r r"r#rr>r!ÚgenderÚ_check_axes_shapeÚcategoryÚ    classroom©r,r?r9Úaxesr r r Útest_hist_layout_with_byFs0z(TestSeriesPlots.test_hist_layout_with_bycCspddlm}m}ttj d¡ƒ}ttj d¡ƒ}|dƒ| ¡|dƒ| ¡|ƒ}|j}t    |ƒdkslt
‚dS)Nr)ÚgcfÚsubplotréyéz) Zmatplotlib.pyplotrXrYrr3r4r5r!rVr6r8)r,rXrYÚxÚyr-rVr r r Útest_hist_no_overlaplsz$TestSeriesPlots.test_hist_no_overlapcCs.|}|jj|jd}t|j ¡ƒdks*t‚dS)Nrr)r>r!rQr6r&Ú get_fignumsr8rUr r r Útest_hist_by_no_extra_plots|sz+TestSeriesPlots.test_hist_by_no_extra_plotsc    CsRddlm}|ƒ}|ƒ}| d¡}d}tjt|d|j||dW5QRXdS)Nr)réoz&passed axis not bound to passed figurer)rr)ZpylabrZ add_subplotr)r*r8r!)r,rrZfig1Zfig2r.r0r r r Ú+test_plot_fails_when_ax_differs_from_figures 
z;TestSeriesPlots.test_plot_fails_when_ax_differs_from_figureúhisttype, expected©ÚbarT©Z
barstackedT©ÚstepF©Z
stepfilledTcCs0ttj dd¡ƒ}|j|d}|j||ddS)Nrr©Úhisttype©Zfilled)rr3r4Úrandintr!Ú_check_patches_all_filled)r,rkÚexpectedÚserrr r r Útest_histtype_argument‹s  z&TestSeriesPlots.test_histtype_argumentz&by, expected_axes_num, expected_layout)Nrr;)Úbr)rrcCsdddgddg}ttj d¡|dd}d|j_t|jdd|d    }|j|||d
|     |d¡dS) NéÚ1Ú2éÚa©r$r
rrT)rÚlegendrrC)
rr3r4r5r$r
rr!rRÚ_check_legend_labels)r,rÚexpected_axes_numÚexpected_layoutr$ÚsrVr r r Útest_hist_with_legendšs z%TestSeriesPlots.test_hist_with_legendrNrrc    Cs`ddgddg}ttj d¡|dd}d|j_tjtdd    |j    d
|d d W5QRXdS) Nrsrtrurvrwrxrrú Cannot use both legend and labelrTÚc)ryrÚlabel)
rr3r4r5r$r
r)r*r+r!)r,rr$r}r r r Útest_hist_with_legend_raises¨s
z,TestSeriesPlots.test_hist_with_legend_raisescCs®|j ¡\}}|jjd|d}t|jƒdks0t‚| |j     ¡d¡t
  ¡|j ¡\}}|jjd|d}| |j      ¡d¡t
  ¡|j ¡\}}|jjdd|d}t
  ¡dS)    Nr©rrZ    FrequencyZ
horizontal)Z orientationrÚleftT)ZalignZstackedr) r&r'Úplotr!r6r7r8Ú_check_text_labelsÚyaxisZ    get_labelr r(Zxaxis)r,rÚ_rr r r Útest_hist_kwargs²sz TestSeriesPlots.test_hist_kwargszApi changed in 3.6.0)ÚreasoncCsì|j ¡\}}|jjd|d}|j|dd| ¡}| |dgt|ƒ¡| ¡}| |dgt|ƒ¡t    |jj
ƒt    |jj ƒ|j ¡\}}|jj
d|d}|j|dd| ¡}| |dgt|ƒ¡| ¡}| |dgt|ƒ¡dS)NT)ÚlogyrÚlog©r‡Ú) r&r'r…r!Ú_check_ax_scalesZget_xticklabelsr†r6Zget_yticklabelsrÚkdeÚdensity)r,rrˆrZxlabelsZylabelsr r r Ú test_hist_kdeÂs   zTestSeriesPlots.test_hist_kdecCs°|j ¡\}}|jjddd|d}|j|ddt|jƒdksBt‚|j|jdgdd|j ¡\}}|jj    dd|d    }|j|dd| 
¡}t|ƒd
ksžt‚| |dg¡dS) NTrrr)r‹rÚcolorrrŒr)Z
facecolorsÚr)r‹r“rr) r&r'r…r!rr6r7r8Z _check_colorsrÚ    get_lines)r,rrˆrÚlinesr r r Útest_hist_kde_colorØsz#TestSeriesPlots.test_hist_kde_color)Ú__name__Ú
__module__Ú __qualname__r1r:r@r)ÚmarkÚslowrWr^r`rbÚ parametrizerqr~r‚r‰ZxfailÚtdZskip_if_no_scipyr’r—r r r r rs<    
%
üþ    
ÿ
 
      rc@s eZdZejjdd„ƒZdd„Zdd„Zdd„Z    d    d
„Z
ej  d d d ddgfdd dgdd dgfg¡dd„ƒZ ej  dddddg¡dd„ƒZ ej  dd dg¡ej  dd dg¡dd„ƒƒZej  dd dg¡ej  dd dg¡dd „ƒƒZd!d"„Zd#d$„Zd%d&„Zejd'd(„ƒZd S))ÚTestDataFramePlotsc     s¼ddlm‰tjtddt|jƒW5QRXttj     
dd¡ƒ}t tj    j dddtj d    ƒ|d<tjtddt|jdd
}W5QRX|j|d d d |d ¡r¨t‚t|dgjƒttj     
dd¡ƒ}t|jƒttj     
dd¡ƒ}t tj    j dddtj d    ƒ|d<tjtddt|jdd}W5QRX|j|ddd tjtddt|jdddW5QRXtjtddt|jddW5QRXtjtddt|jddW5QRX|d}d\}}d\}}|j||||d}|j|||||dd\}}d\}}|j||||d}|j|||||dt ¡|jdddd}    ‡fdd„|     ¡Dƒ}
t |
d  ¡d!¡t ¡|jdd"}    |j|    d#d$t ¡t t¡|jd%d&W5QRXdS)'Nr©Ú    RectangleFrédrìjÕ+2ZìÊRŠeöZ©ÚsizeÚdtyperrErJrCr;rrrMr<éT)ÚsharexÚshareyrrr2©éé©rvé(©Ú
xlabelsizeÚxrotÚ
ylabelsizeÚyrotrH)Ú
cumulativerr‘csg|]}t|ˆƒr|‘qSr ©Ú
isinstance©Ú.0r\r r r Ú
<listcomp>2s
z:TestDataFramePlots.test_hist_df_legacy.<locals>.<listcomp>rFçð?)rŒrŒrre)Úfoo)Úmatplotlib.patchesr¡r r"r#rr!rr3r4r5rrmÚint64rRÚ get_visibler8Ú_check_ticks_propsr(Ú get_childrenÚassert_almost_equalÚ
get_heightrÚexternal_error_raisedÚAttributeError) r,r?r9rVrpÚxfÚyfr²r´rÚrectsr r r Útest_hist_df_legacyêsˆ üÿ
üÿÿÿ  z&TestDataFramePlots.test_hist_df_legacyc CsŠttj d¡tj ddd¡ttjjdddtjdƒttjjdddtjddddœƒ}| t¡}d    }t    j
t |d
|  ¡W5QRXdS) Nrrlú Ûp¹/l@©spcÍ/)r§T)Úutc)rwrrr€ÚdzDhist method requires numerical or datetime columns, nothing to plot.r) rr3r4Zrandrmrr¾ZastypeÚobjectr)r*r+r!)r,r9Zdf_or0r r r Ú*test_hist_non_numerical_or_datetime_raises@s4
ÿÿÿüøÿ
z=TestDataFramePlots.test_hist_non_numerical_or_datetime_raisesc Cs6ttj dd¡ƒ}ttjjdddtjdƒ|d<dddœdddœdddœd    d    dœd
d
dœd d    dœd ddœd ddœdddœf    }|D],}|j|dd}|d}|j|d|dq€d}t    j
t |d|jddW5QRXt   d¡}t    j
t |d|jddW5QRXd}t    j
t |d|jddW5QRXdS)Nr¢rr£r¤r¥rJ)r=Ú expected_sizerGrL)rErErK)rHrF)rFrrIr=r<rÎrErCz1Layout of 1x1 must be larger than required size 3rr;z)Layout must be a tuple of (rows, columns))rú1At least one dimension of layout must be positive©rFrF)rr3r4r5rrmr¾r!rRr)r*r+ÚreÚescape)r,r9Zlayout_to_expected_sizeZ layout_testrVror0r r r r@Ys@üÿ
÷ 
z#TestDataFramePlots.test_hist_layoutcCsTttj dd¡ƒ}ttjjdddtjdƒ|d<t|jdd|j     
¡t   ¡dS)Nr¢rr£r¤r¥T)r) rr3r4r5rrmr¾rr!r&Z tight_layoutr r()r,r9r r r Útest_tight_layoutƒsüÿ    
z$TestDataFramePlots.test_tight_layoutcCsJtdddddgdddddgdœƒ}t|jd    d
d d d d}|j|d ddS)Nçø?çà?ç333333ó?çÍÌÌÌÌÌì?rEÚpigÚrabbit)ÚlengthÚanimalTrÚrÛrr)rÚcolumnrrr²©r²)rrr!rÀ)r,r9rVr r r Útest_hist_subplot_xrot“s  þÿúz)TestDataFramePlots.test_hist_subplot_xrotzcolumn, expectedNÚwidthrÚr>csttdddddgddddd    gd    dd
d d gd œdddddgd}t|jd|dd‰‡fdd„td    ƒDƒ}||kspt‚dS)Nçffffffæ?皙™™™™É?g333333Ã?gš™™™™™ñ?rÔrÕrÖr×rEg333333 @rr)rßrÚr>rØrÙZduckZchickenZhorse)r$T©rrE)rrÜr=csg|]}ˆd|f ¡‘qS)r)Z    get_title)r¹Úi©rVr r rºÀszGTestDataFramePlots.test_hist_column_order_unchanged.<locals>.<listcomp>)rrr!Úranger8)r,rÜror9Úresultr rär Ú test_hist_column_order_unchanged¦s
   ý ú
üz3TestDataFramePlots.test_hist_column_order_unchangedrcrdrfrgricCs<ttjjddddddgd}|j|d}|j||d    dS)
Nrr©r¢r©r¦rwrr©Úcolumnsrjrl©rr3r4rmr!rn©r,rkror9rr r r rqÃs  z)TestDataFramePlots.test_histtype_argumentrr€rÜrrc CsÖ|dkr|dk    rdnd}d|f}|p*ddg}|dk    r>|gd}tddgddgdd    }ttj d
d¡|ddgd }t|jd d ||d }|j|||d|dkr²|dkr²|d}t||ƒD]\}    }
|     |
|    ¡q¼dS)Nrrrwrrrsrtrur€r    rv©r$rëT)rryrrÜrCr)
rrr3r4r5rr!rRÚziprz) r,rrÜr{r|Zexpected_labelsr$r9rVZexpected_labelrr r r r~Òs& 
ûz(TestDataFramePlots.test_hist_with_legendc    Cshtddgddgdd}ttj dd¡|dd    gd
}tjtd d |jd ||ddW5QRXdS)Nrsrtrur€r    rvrrwrrrîrrTrË)ryrrÜr)    rrr3r4r5r)r*r+r!)r,rrÜr$r9r r r r‚îsz/TestDataFramePlots.test_hist_with_legend_raisescCsFttj dd¡ƒ}|j ¡\}}|jjd|d}t|j    ƒdksBt
‚dS)Nrrrrƒ) rr3r4r5r&r'r…r!r6r7r8©r,r9rˆrr r r Útest_hist_df_kwargsøsz&TestDataFramePlots.test_hist_df_kwargscCs–ttj d¡ dd¡ddddgd}d    d
gd |d <|j ¡\}}|jjd |d }t    |j
ƒdksdt ‚|j ¡\}}|jj|d}t    |j
ƒdks’t ‚dS)Né*rrHÚAÚBÚCÚDrêr\r]rÚErƒr¬)rr¯) rr3r4Ú RandomStater5r&r'r…r!r6r7r8rðr r r Útest_hist_df_with_nonnumericsþs
ÿz0TestDataFramePlots.test_hist_df_with_nonnumericscCs„ttj dd¡tdƒd}|j ¡\}}|djjd|d}|djj|ddd    |j    |dd
gd | 
¡  ¡stt ‚|j  
¡  ¡s†t ‚t ¡|j ¡\}}|djjdd|d }|djj|ddd    |j    |jd d
gd |j 
¡  ¡rît ‚| 
¡  ¡sþt ‚t ¡|j ¡\}}|djjdd|d }|djj|dd|j    |jd dgd |j 
¡  ¡sft ‚| 
¡  ¡sxt ‚t ¡dS)NrvrHZabcdrêrwT)ryrrr)rryÚ secondary_yz    b (right))Úlabels)ryrúrz    a (right))rry)rr3r4r5Úlistr&r'r…r!rzZ    get_yaxisr¿r8Zright_axr r(Zleft_axrðr r r Útest_hist_secondary_legend s,z-TestDataFramePlots.test_hist_secondary_legendc    s|ttjddgdtjtjgdddggtdƒd}t d    dd
g¡}tdddgdddggtdƒd}t dd    d    gd
d
d
gg¡}d d lm‰|j ¡\}}|j    j
||d ‡fdd„|  ¡Dƒ}dd„|Dƒ}|j ¡\}}    |j    j
|    |d ‡fdd„|      ¡Dƒ}
dd„|
Dƒ} t dd„t || ƒDƒƒs&t‚t dd    gd
d
gg¡} d} tjt| d$|j ¡\}}|j    j
|| d W5QRXdS)Nrág333333Ó?gš™™™™™Ù?ràgš™™™™™é?r×ÚabcrêgÐ?gÍÌÌÌÌÌÜ?rr )rÚweightscsg|]}t|ˆƒr|‘qSr r¶r¸r r r rºAs
zFTestDataFramePlots.test_hist_with_nans_and_weights.<locals>.<listcomp>cSsg|] }| ¡‘qSr ©rér¹Zrectr r r rºBscsg|]}t|ˆƒr|‘qSr r¶r¸r r r rºEs
cSsg|] }| ¡‘qSr rrr r r rºFscss|]\}}||kVqdS)Nr )r¹Zh0Úh1r r r Ú    <genexpr>GszETestDataFramePlots.test_hist_with_nans_and_weights.<locals>.<genexpr>z?weights must have the same shape as data, or be a single columnr)rr3ÚnanrüÚarrayr½r¡r&r'r…r!rÁÚallrïr8r)r*r+)r,r9rÿZ    no_nan_dfZno_nan_weightsrˆZax0rÈZheightsr.Z no_nan_rectsZno_nan_heightsZidxerror_weightsr0r/r r r Útest_hist_with_nans_and_weights2s, þ  z2TestDataFramePlots.test_hist_with_nans_and_weights)r˜r™ršr)r›rœrÉrÍr@rÓrÞrrçrqr~r‚rñrùrýržÚskip_if_no_mplrr r r r rŸèsB
U* þþ
üþ    
  &rŸc@sjeZdZdd„Zdd„Zejjdd„ƒZdd„Z    d    d
„Z
d d „Z d d„Z ej  dddddg¡dd„ƒZdS)ÚTestDataFrameGroupByPlotsc súddlm‰ddlm}ttj dd¡dgd}ttjj    dd    dtj
d
ƒ|d <tj     dd d¡|d <dgd|d<||j |j d}|j |d ddt ¡|j|j d}|j |d ddt ¡|jddd}|j |ddd|j|ddt ¡d\}}d\}}||j |j dd ||||dd    }| ¡D]4}‡fdd„| ¡Dƒ}    |    d ¡}
t |
d¡q(|j|||||dt ¡||j |j dd }|j|d!d"t ¡t t¡||j |j d#d$W5QRXd%} tjt| d&|jd d'd(W5QRXdS))Nrr )Ú _grouped_histiôrrórêr£r¤r¥rôrHrõÚXrörrJrCrv)rZrotr;rÝr«r®T)rrµrr±r²r³r´r‘csg|]}t|ˆƒr|‘qSr r¶r¸r r r rºƒs
zFTestDataFrameGroupByPlots.test_grouped_hist_legacy.<locals>.<listcomp>rFr»r°)rrŒrŒrre)rr¼z$Specify figure size by tuple insteadrÚdefault)rr)r½r¡Z pandas.plotting._matplotlib.histr
rr3r4r5rrmr¾rórõrRr r(r!rÀZravelrÁrÃrÂrrÄrÅr)r*r+) r,r
r9rVrÆrÇr²r´rrÈr>r0r r r Útest_grouped_hist_legacySsp  üÿ÷  ÿ z2TestDataFrameGroupByPlots.test_grouped_hist_legacycCsžd}ttjjdd|dƒ}ttjjdd|dƒ}tj d¡jddg|d}t|||d    œƒ}| d
¡}| ¡}t    |ƒd ks|t
‚t    |j   ¡ƒd ks’t
‚t  ¡dS) Nré¦r¬réé<ròrr)r>ÚweightrQrQr)rr3r4ÚnormalrøÚchoicerÚgroupbyr!r6r8r&r_r r()r,Únrr>Z
gender_intZdf_intÚgbrVr r r Útest_grouped_hist_legacy2˜s
z3TestDataFrameGroupByPlots.test_grouped_hist_legacy2c    Cs:|}d}tjt|d|jd|jddW5QRXd}tjt|d|jd|jddW5QRXd    }tjt|d|jd|jd
dW5QRXtjtd d t    |jd|jd d}W5QRX|j
|dd dtjtd d t    |jd|jdd}W5QRX|j
|dd d|jd|jdd}|j
|ddd|jd|jdd}|j
|ddd|jd|jddd}|j
|ddddt  ¡tjtd d t    |jdddd}W5QRX|j
|dddtjtd d t    |jdd}W5QRX|j
|ddd|jddd}|j
|ddd|jdddgd }|j
|ddddS)!Nz1Layout of 1x1 must be larger than required size 2rrr;)rÜrr=z1Layout of 1x3 must be larger than required size 4r>rârÏrÐFrrArrCrIrGrH)rFrrM)rNr)rÜrr=rrPrTrJrErrQ)rErrBrS)rÜ) r)r*r+r!rQrSr r"r#rrRr()r,r?r9r0rVr r r Útest_grouped_hist_layout¤s`ÿÿÿz2TestDataFrameGroupByPlots.test_grouped_hist_layoutc    Csæ|}|j dd¡\}}|jdddg|dd}|j|ddd    t ||d¡|dj|ks`t‚|jd
|d d }|j|ddd    t ||d ¡|dj|ks¤t‚|j dd¡\}}d }tj    t
|d|jd|d}W5QRXdS)NrrEr>rrSr)rÜrrârCrTr)rrz@The number of passed axes must be 1, the same as the output plotr) r&r'r!rRr Zassert_numpy_array_equalrr8r)r*r+)r,r?r9r-rVZreturnedr0r r r Útest_grouped_hist_multiple_axesÛsz9TestDataFrameGroupByPlots.test_grouped_hist_multiple_axescCsv|}|jd|jdd\}}| |¡ ||¡s0t‚| |¡ ||¡sFt‚| |¡ ||¡r\t‚| |¡ ||¡rrt‚dS)Nr>T)rÜrr©©r!rQÚ
get_x_axisÚjoinedr8Ú
get_y_axis©r,r?r9r.r/r r r Útest_axis_share_xïs z+TestDataFrameGroupByPlots.test_axis_share_xcCsv|}|jd|jdd\}}| |¡ ||¡s0t‚| |¡ ||¡sFt‚| |¡ ||¡r\t‚| |¡ ||¡rrt‚dS)Nr>T)rÜrrª)r!rQrrr8rrr r r Útest_axis_share_yüs z+TestDataFrameGroupByPlots.test_axis_share_ycCsx|}|jd|jddd\}}| |¡ ||¡s2t‚| |¡ ||¡sHt‚| |¡ ||¡s^t‚| |¡ ||¡stt‚dS)Nr>T)rÜrr©rªrrr r r Útest_axis_share_xys z,TestDataFrameGroupByPlots.test_axis_share_xyrcrdrfrgricCs>ttjjddddddgd}|jd|d}|j||d    dS)
Nrrrèrérwrrrê)rrkrlrìrír r r rqs z0TestDataFrameGroupByPlots.test_histtype_argumentN)r˜r™ršr rr)r›rœrrrrr rrqr r r r r    Qs"E 
6   üþ    r    )Ú__doc__rÑÚnumpyr3r)Zpandas.util._test_decoratorsÚutilZ_test_decoratorsržZpandasrrrrZpandas._testingZ_testingr Zpandas.tests.plotting.commonrrZfixturerrrrŸr    r r r r Ú<module>s$ 
Mj