From 5292c941114ac42436d1ecae9f5232267d76d8c1 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 2 May 2014 16:36:22 -0700 Subject: [PATCH 1/3] Updated documentation for xray v0.1 --- README.md | 49 +- doc/_static/opendap-prism-tmax.png | Bin 0 -> 22043 bytes doc/_static/series_plot_example.png | Bin 146687 -> 0 bytes doc/api.rst | 47 +- doc/conf.py | 5 +- doc/data-structures.rst | 64 +- doc/getting-started.rst | 114 ---- doc/index.rst | 49 +- doc/installing.rst | 24 + doc/tutorial.rst | 934 ++++++++++++++++++++++++++++ setup.py | 51 +- test/test_data_array.py | 4 + xray/data_array.py | 5 +- 13 files changed, 1157 insertions(+), 189 deletions(-) create mode 100644 doc/_static/opendap-prism-tmax.png delete mode 100644 doc/_static/series_plot_example.png delete mode 100644 doc/getting-started.rst create mode 100644 doc/installing.rst create mode 100644 doc/tutorial.rst diff --git a/README.md b/README.md index 5c9d2732a82..80bc2a995fa 100644 --- a/README.md +++ b/README.md @@ -38,9 +38,10 @@ Because **xray** implements the same data model as the NetCDF file format, xray datasets have a natural and portable serialization format. But it's also easy to robustly convert an xray `DataArray` to and from a numpy `ndarray` or a pandas `DataFrame` or `Series`, providing compatibility with -the full [scientific-python ecosystem][scipy]. +the full [PyData ecosystem][pydata]. [pandas]: http://pandas.pydata.org/ +[pydata]: http://pydata.org/ [scipy]: http://scipy.org/ [ndarray]: http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html @@ -143,43 +144,34 @@ labeled numpy arrays that provided some guidance for the design of xray. - Be fast. There shouldn't be a significant overhead for metadata aware manipulation of n-dimensional arrays, as long as the arrays are large enough. The goal is to be as fast as pandas or raw numpy. - - Provide a uniform API for loading and saving scientific data in a variety - of formats (including streaming data). - - Take a pragmatic approach to metadata (attributes), and be very cautious - before implementing any functionality that relies on it. Automatically - maintaining attributes is a tricky and very hard to get right (see - discussion about Iris above). + - Support loading and saving labeled scientific data in a variety of formats + (including streaming data). ## Getting started -For more details, see the **[full documentation][docs]** (still a work in -progress) or the source code. **xray** is rapidly maturing, but it is still in -its early development phase. ***Expect the API to change.*** +For more details, see the **[full documentation][docs]**, particularly the +**[tutorial][tutorial]**. xray requires Python 2.7 and recent versions of [numpy][numpy] (1.8.0 or later) and [pandas][pandas] (0.13.1 or later). [netCDF4-python][nc4], [pydap][pydap] and [scipy][scipy] are optional: they add support for reading and writing netCDF files and/or accessing OpenDAP datasets. We plan to -eventually support Python 3 but aren't there yet. The easiest way to get any -of these dependencies installed from scratch is to use [Anaconda][anaconda]. +eventually support Python 3 but aren't there yet. -xray is not yet available on the Python package index (prior to its initial -release). For now, you need to install it from source: +You can install xray from the pypi with pip: - git clone https://github.com/akleeman/xray.git - # WARNING: this will automatically upgrade numpy & pandas if necessary! - pip install -e xray - -Don't forget to `git fetch` regular updates! + pip install xray [docs]: http://xray.readthedocs.org/ +[tutorial]: http://xray.readthedocs.org/en/latest/tutorial.html [numpy]: http://www.numpy.org/ [pydap]: http://www.pydap.org/ [anaconda]: https://store.continuum.io/cshop/anaconda/ ## Anticipated API changes -Aspects of the API that we currently intend to change: +Aspects of the API that we currently intend to change in future versions of +xray: - The constructor for `DataArray` objects will probably change, so that it is possible to create new `DataArray` objects without putting them into a @@ -192,19 +184,10 @@ Aspects of the API that we currently intend to change: dimensional arrays. - Future versions of xray will add better support for working with datasets too big to fit into memory, probably by wrapping libraries like - [blaze][blaze]/[blz][blz] or [biggus][biggus]. More immediately: - - Array indexing will be made lazy, instead of immediately creating an - ndarray. This will make it easier to subsample from very large Datasets - incrementally using the `indexed` and `labeled` methods. We might need to - add a special method to allow for explicitly caching values in memory. - - We intend to support `Dataset` objects linked to NetCDF or HDF5 files on - disk to allow for incremental writing of data. - -Once we get the API in a state we're comfortable with and improve the -documentation, we intend to release version 0.1. Our target is to do so before -the xray talk on May 3, 2014 at [PyData Silicon Valley][pydata]. - -[pydata]: http://pydata.org/sv2014/ + [blaze][blaze]/[blz][blz] or [biggus][biggus]. More immediately, we intend + to support `Dataset` objects linked to NetCDF or HDF5 files on disk to + allow for incremental writing of data. + [blaze]: https://github.com/ContinuumIO/blaze/ [blz]: https://github.com/ContinuumIO/blz [biggus]: https://github.com/SciTools/biggus diff --git a/doc/_static/opendap-prism-tmax.png b/doc/_static/opendap-prism-tmax.png new file mode 100644 index 0000000000000000000000000000000000000000..3c98b35b82c8a2bf3cb565c640ded5346c18f7d0 GIT binary patch literal 22043 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 NyRN2#BB@y5{|Dei0;~W4 literal 0 HcmV?d00001 diff --git a/doc/_static/series_plot_example.png b/doc/_static/series_plot_example.png deleted file mode 100644 index a789d088c8fa5e4d28d39e253ca8dd4069dfd980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146687 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
x&)2s>96T>9$%s%>)TT-4S6HzLE*PXmFWK&X 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

{BPXc!&)~N_ZnZhqCEHWoDD3zaliaoJJ z#f4uts65zg)fEVD$~S#-m+WB!Vd&m+9uKNzCn>TWIkm;1@VU6S4FvA~Y4bXjF^{gB z(D^+ft^-u1#E#I`(=FSe|Fi;NSHYeqG|VACVaanGbj{;vPft(N*>11zRqdQoEWbXR zETMgV1-AZ&m_?PVa7~IGv@i3$&-u#+ly|&37!zL&^BN*_u38Ddvxn-z2NIPkxkLY& zTc-}LC?-|avIz|uBHc-++W@De?sMm=f}AJ^6@kt9g`R{{hrnEu8-ZwV%1M!AFF2Mt zbK5e9`dk9sE#OE~|3nByABdp=>!tpL+q)7kc}r>bfSaaTBbB0zoykf{2((4uinMWdR37j6pIz-?WL~4; z)2K8@v-ix2VL#BZ8HG!c&)gp#Nfja*CRygS{nM~_b+(#9hXYt=E$R|K#+OUa*a)zy zHq}r0Wy={~#NxTn9T5SA#;#d#`>b(aI7=S?k-_aLc>MS%Le@X=B2MVBj3a2(gArPa zrNmy)`PyYU#DQ0gjTA_@u_N#;?#CGWPcySs8vQ1K5TaGYd8qG|;?-}D^WCycB4e|2Lco(7c~t@ya)psd4N=-sKS zT{|9NJ4LvS)2n)drhrp|`4W${GIIWAE8{)+R8NI4>Z<2}6OZeHkN1);Q*XEb{j>9Y z-1u#^N3>H$`#pxM+8ts8lR^-{CLY<&eSAAVna^MZ~Mh- z#M&p@L@peE{YwBzjmz*XbuQD{qa(A7jP6OZ7e?t`i&+jv{w9L%6VRolFR5X*-04To zu~bvPi_vqWJW;-kL!(mlrScQp+&fPJOrhuhOzz#C+wTwwO5x!m-8EF6JZEtW@NcaB zC~P=(GCezRgCG)0(hJ4zgeZ_=pb1e2N6KRCr-yw7dL-hah}=KSs5on&`{Pliv{Fu8 zVgnrRl!a0B{C4>099;r(Gart#wZB{Pzni(ERF2C|xZhZwPc?=|SXC4EaVSh4-lZR1 zl`5VhL$9KJ2on#DjOWV?iM~$>bP?lrd~py3rE06Q0lLuA4gaMSs?uFpC-z3w$OXu5 zSbd06h!k>fNYON_KQBQ1=pi!Cp$}$R5h9|;x%IP+o6EAYtYJG}vxE)(rclCnB;b^MF``5n+x_Wz-J^6*}yso8n(akL6*#C6Fxy9PSmHvHX%OGN1Q85nh!5qZa`~ z%fkhJIq`A_kctGbx|yj$pGVQg>abVSg^>z7lKORiC7&eYi;cQm#p@{c(?6+o*pvjO z(sZYa-*bB{b0QE`(M9f(pdlJ|rX_Wr$P>?0X%kHnpcd#$BF1<^+K6_ad(I>ag_3y) zid*j=eh;fk@gN$vU6Et@FI|Rnw7RoEd-DVh?p9Pcg|X4}{)a6NS~6@z?1>*plwhkV z;ex*Qh!@fFh?~!gh3mL!-{%s@KYmG{`2>8Z9ovyYzlVCtJ^+x99Mkj!FHAA(NPPUneR`M6(+ByE+HX zl!5%}>>-6|PIwi-(OzFu$ zawPmPqo->B^L?lwnNUbo#5j=PRcY!CT@d|}#LNo1Sq@_&S}JzUd_7I{_NAqmHmj1# z5*`#fpLhJpCtQteCpFY-ITVytOs~cGDZU74;5mH^NxUW(g@Cm*9ncX>8;r;ny|7=j zl<#K)|NQ@+$|Zr9SEH~Nnf6u|4lm|JesgL5poZSo?z`3wH8p-*J|kXsXcv#hfg(*hfPT`@B22$OtOV zC2FcE5niH4xOXu@d1%1})DKf2*%44c4$+5 z5EFYN2vUVNGk3{=p*KXl7DnoGMaHf>5WrI^`N#@GU<61acCJAYH{^Or@^dg3e`HJQ z?c3W`g*@FG48_rggvc+mv+`D1OIaaeQ}u&4{!4?JY0YPZ-L|&1C3LgZ+KKd6A_)-| zcN-oB)@VJ*QBOQ1HwSG&4c(+)$!GSx#^-}-n`qf>R23c$f_Cd$#Q4n2r4O%dtuZEm zM0DKZFc#bNi-m;D%(?9ts~!3~-(2QUXe)MnC0<`djx&@xppU<}m>fJ9lq1CsV}-&v z!px_?evKxt`gJ!eLji$ZpJh*R0#kYazgL~nkE}mC+0YzEYds6W)m>5aRFJyLK#jgM zf%bW2Ndq$Hl`scdNNR7f$22q!bK>^I>IRm`5hB<>e;mJ`p@jCduSugK;e1mJ5-DA- zy9!MMcY_2?zWha)k`h4jAy|%)nPl<+ij!%y*X}sgCD?j7lB2Q;lbpYW4PIXPf4PW4 zbg`mM?vhmk>Cm@_jik_&84xt5m}Ovu+d|6;8ytuF6)$c{dYLNlpyRggdJ%5j^YS&^Uoj-QR zd92JoJ@MO+w5ISY!tzAiC&0PV;dj3q2Z@Eqq>3VBK?y;X8l=hG+BLk-9S1VRsN~*f z8C3E}A5KO7+spEQ$f@k^Xq{gD-iN$ZV@C@5D=?|j&L9XTYy|9YijA+~S`sJzqn=Pw z6>*@;tMQ5YrX!K-l}6=Y-IV19vMPtV99zE@Qq6|Fgq)1)l^JrWRlK8bJ}5UOsceMmFMwLF1?^ zq+_Y7sz?dk9>WcJiF|C4Bn03)h^QP!UIbbEjEtxZ%Lf5|OA%Yub=oiG%{= zz0sH$k05}=3fJAqi63EU6%|viA@K-geszVn#3SBRZp$0OK$cUr7n8kpD>?o=0W-Zj z5@&_w5+fB;qq1ApoXMT~B^&fTD*$j17>Y2;i4hVA-pUC9 zgD0~eqCzzt%~Bdvyq!Mcn5V93E6M(l=Y}J zUqsSPs_#h5XV}q%X-6DyN{)Dm7U)eDmgSB|N?)W<^u)!!zj>U&XO|nq`p8&)uxf_;_?an(|$w(>}8cNKdWK=5Lfy}{Yx1kOB}lFb;3{EmC9-Rs4J*Td*8_5Am?eB zA{sn~d2l2Dkrr+_#z^Em@Prfl@-AlL{`iT8fK(-& z-IaFb;y^GUHIn+<0tTOfebM$8#4~TCV@4 z|B6lDtTTF$=>jRn@8U6Z^9S0MFf|-K?NC4ZwXc2oden%fp4%sWM5y)_s1Fy2;BG`- z-T&#;tM`h7zTT9? zn4fa$qxVI zPm|OLw+#sFxNNn1$`$k%ZM@Z@3|~ z8>ZzqZ4?(rMf+AKmCvl3oK~=-v$po?LB>DcQ_YS%yqI;|a&BpuH}KmmdCM(q5d%!Z z91)DXA3cA3@-rNXi?|*|?FIXfpeZ>V&CGH=C zc9)h^&>aSm2 z6EG(x%j2_TWcPxu5zU~?o>uR|`N>4{eE-!!WgsO$gaNw0_m){+-V*x##7~CIZ_v(x z#wdRO60=Cn@wDcDRJUP-jOcUI6yac3?k^RHR%E&YTEKIF*==Zs?5_8B3d#50O!{c8 z(D-<=Y2TIX)%EqZXc~URi$$ERvODkRoAy2{No99oB(O{m>yU>t{z8I{o7DxrpSrV7 z9B%SmzW9GLw!mlyzA9$6C_(Zu17?exE1U_3hdWE2g1blQ zud_a%>st8V5|w)8upV)8A}%Jr@RV>m4F+z3_IRNA@6Wg979z4B8OCz{_Kx&8fc0Xw z=hKB91$MMiiLq5*%4LJVGWUjb=1>3MFZr`v@3HeLC57wYBsWvsrA_cf43sH8Y(4fl zooLP(-_R_KfbtWTr?99zsVfwQ^ZJ9mn zZibUN?s>_LNCtvCDq6T0?QkutIZ`^s=CNFahm8EA;`5bHYtx!6Td&WZm{|?#vj+2+ zx8xpGpL;BM{z_)qqUm#%3KFv0TN%nbvxvbqCAGYIM{}T~zJGBiAUj3lRpIGvO7fn@ zXK=`Ye$nW&GoKyMk4N)HE9Uqvr{~Yg9{mV~K(f2rCq(!6SB6tL$dZgy668;}+i^S( z;!e5Fd*pW${`X%7T|umYM|15Ku^(f6C#2Y650HG8J)FM8@@;rHxN{_}jKU6AD_yH_ z)qBm8ks{&xH99j-3V4gv+uGV&ga2~ZoJr5f;Z=ViURB`bQk{Fod*w9jnkfRUa0u8Q ze3s}y)SS$IabLUK=K8uK2%3f$yg*>SUR+YRFZZuk;eJ}sw+1Fys$(^dd3Rh~T;0J} zr-U9SA&Za9pyXXjwdewEi=%ALfL)c>hVfnKRa0Gj{I38ERNC&UkKj2O8XM1_?hSUg zlgq~{b6Uxs4JnaZ1q7U$iO1^x)7t|fbdEO+uU-aG>G#OOc^Uh1AE-#wsV7M0jehV-N>(wE`XSB~g>IB`{S$u#%VGvD{8-?k;h zAAE%se&q~bg*h~)`$W`k$;%*m!rVXZu6yqV+q2W-jw>W0a5jm1D=u9k9QCf+eKJZG z19z8w*K5q^Wqo~mm?FoQ>1nOc;nSvU$eN1Z}X4RGcrWHy}fDa=(_p%_@0@me8C$+mD)Mpzpnt@ zty|6WLE>W-7V=pVZdg%KQ9mTehKGlTzI@SFEW2|sH`mJyUl@SQ)3P(;(sTbiaI93mOI8> zO2wE*-UZBv9>6Gswy7zGmBHNZm+HxhiHYd#ZC3&utd7pkOO1XN0$g0!H*enT`SeNA z)Rca_^j2tPWMz|5Qo`%%B;LGvqxJ>Zv}jgYzZZ3Nbt-bN^YW0jwY9n?CN4?4=3N7s;z`-r zaW2h&Y2leNzTq@vnc?4=U8RjvHg+|V!#j5#eMLs3ZyJ0&IM=x8B94*RZVTia$9yS&_q~C@Cpv2YbD+()i>FuC=wbu7Lqp@50g&ELz)`%=oZzP`R^a8T9K^2Ob6zc~k)+&TCk!%Q{Pcg_r)TwKB~GcwfF z)GZSebP#%X%k65KoV$x_eWv!7eHq!HGInqsY8_@~EHN-PxS~Rc=Vn&qRr}ApwmxyN z$bsj7y^ER;3zr9T6Mp=#^!)jihTo*TihENtFh3 zWUD;a^qc-3e2a{Y?EqJ?_?;QiGV{S799VGR-;>_yU-R=Jf@TetvmYNL&~TX63zG_S zHEr!D&CT-0Ww)QSv?wr3KOzD2;_Bt~oP;JiD(bqsyU5ezDxPa@^U47LI9(q-y5a0BaM#SN%5_fBoZuWb(ERd1rhZVxlP6Ckyw<5t|NdPX zkEf%sxYH^AOwhb3l3eZx5p;HZ(QY8)2@Suof~F=hZ2cdkc_pQ#VPFmO3k!2|bHU(a zwQ^(_Fuxfc9sTSJEvG7Upzm%Cd15&l89g`5`T6br)%bJ5rI{GvE`S(q;8>WzZD^{gSps0Pf}7IP(Mb@W6Oxcf zgNSA4AmPed{AfglDd@eJXvwA@@aCK;bAHnCN( zs8?KETzUiNWvs#f_qVoQe`*oCAW>Lc{7KN_*UrR(zA zVq%HV)@YGII^;C|C%=oDGA_JY6Kfe8dkz+(d zVAraBiD#AlBoUwN*eJs+;fgLQE*1eB8Go(AcFkj1>s`=!pz)nM{JjRcx-Et<1v6hI z#^;ZDoojGWQBf6~oTK&yOat!2dFj*hr*AVd7{@>Od)qlX_w$>u!nM)ED~mlz=V^o8 z-4TR1SjKvKtsx;HX~o6s@_7DgnwrVJT1!PczU~WMq=kirU0~QeQ@_^NKQS{i)7!*m z%lfClWEvjrj1GP-DX9$jxw^WV-e$1eg^`hQ6V4o;Te?$iOGrh4vkC5&$YF5rt;=lA z{_1e3aM$FI*3c=40E3Q>jy}F%*WJz!9$eV6AIuq$h_?Y0@l>Z%y+lz*;n|Cww4U{K zM`}8{0sw4?oF`ik9CsIcn-2f}IqWV_P4IDw<^7V#p=4=m%k2xtaWC{HUrdwo;%jSf zuX34{3pm~Bj*O4*0w{pjMGq$>w(u7;G%)7m!a!-qZa_E#R|u=$})C#c0Nt5 zsuC_OD@%I*yp!KRTbq=Ef-{_Ru*m-fnZ_D4(h)+b9S_2vk7xDXJ#PN zBP@%9sD_1&UG?z0)O4e_j$`A|Z5f*`67v&~Qp+O}WquBijXin&`l7ypf$#C7&B>9fI`XLS@g{_m5^cfi$S42cYUcI`2*k%omfsL^faqDn z92y;4&i?+ail~ zpurY6cDL*&I!M=KWds`tG>gwqQLx^A4UFw5C zhi^l2?b@}bOtl*~Zq&Ii5wXez^zaXkjv5vh2!0Ijk&b>=XT$L;QYOL2AEFv8cLobe zh2i7TJn`t*SZ@}wzNskz0IdD@w$9G6aLGTw1wDNU>EU#P7cm$QB4+?w%43-XNU8v) zZAw0V{=9;MP`J%t;c%hmQ~h<9hk#9gNZb^`IfA|VVE!m6<+@(wGfRl`J)b{!^`~E* zTU{l9(Xg;s?d|PK%h~U{^nw`;##uVeKlrJCx1!X+Vivuh*#DSu_5*H?_B5?`LkIPK z=e38^5@8V$3lJ-xs*h{4$OkgZ$;r`6xUvJL#s+Nsrl`mYaIZ*vC*Q`ylezW?x2+l3 zmxYBI-wCmEzAya+Txel>b3}MOI`+qysU{l}7(YD|6PKhUgP@?G+RdBcQBj29Bn6VEsRA`i@L5jNZoZLy+ry{`|SJwpQi-ecmr$zO>L|ce@=yXW6|o zZ3m#z^WIh0y3De&NIz0GH=mJT?(6GQdVMqdtKr)V#KgpaXDq)rcpYul4B9Ry?Z2P+ z9dLMX5DwG{?1y3S)o{6r?5LK(K^?*Uz+3NKX1l;5tR6hLe5_5y!a@pHoPOMy{req# zbXt=X;5kzVhf8E^a7YwrT(tGvoYZq{EOy*DHeix;=jP;u z(dna?z>6r^1FgZ(q7^u%j%e>)gOGw#|bS-)TZnSy`F)Fa7%3S}(Jlk*VpM z-whw)-|dF}h0q1*n?{c4^XJcZc11s^bCOAMY)A$E{92n*e89g3pd9f79%^NEHI@wt zghY|t@M}hfhTJqEcLGQq{00*7A!?UeG_yjOdnQTo_h@GUFmcCXZ?e_>`!H!EuazN6sFNdeT|q&i&!j0G9JJfgCz_cPl9kWd?GVbIo0d$x2H)yo zYU;FZ3RYX=y=9)3nW?0rf~%Uqy7YYb?SeIU9Djd*=c#I3_^70pY_fjTbb@zv)f#O{ zJ#f#0ZeE`#H=EnoAO;_wu1C#aqo4O)urbQc@yeme4KEwvLPV8^*(nRR@quc86C` zFeO@rjg2hOK>abVGzKlPZ~!@M?KRsjovQwjEtNYE~rp0wtV_T1SmrlP(pD@2?Y}qF+`94 zEXm~e6(SJ_Z+}-o_ifmR53-MbO-DWa-XQD!0Hu;~#R|)~)D#K3S}W}e5|SAOYirKU zpFi(?7Ix%^$GZbW+sc z4_Gh^x@PbJsCB{zx$Q2h1M8pffA|aHSu6MyJ!4}$NXbZ8W$0nExx45X2n!1zo&DL` zfo!_%^Jg-|HvEH2LV_N$Ii*{-7y#&?fv&=sHkWFA7<@-XY@SktqN*x>Zon=fpe|v@ zQQjwG=iO{U9j`P~fdGPOEL#iPbL|p7+w9=ns_X|@G3J24@K^v6FjNzyIF*%^E%0nH zEKzE1c?jm*juiyS1@@G&`6M{ z96@a8o|i$aFX{v zgUzn|HEZBY?lE_(KVdU^Rycv^qSsVcw*nGJ%giiWQc|)C8=tHaNFnncW4F2q$ka8T z7j0g77prbT1=&|WBqeFd$y6~33HGpDc3oXvn;#BmpvT-!%Xi=9v#)`^ep_@*%oLC~ z=_x6+BNG$$fRi`DQ1q>Q7;K!o<5@Q0jE8&c>+Ah9GdVwJK4gNgh=$1^+A{;z^5>^l zA^zHc990l5*$VSpO8UP1r4{*Z<(w$PX#z+05qtD{lLV8azTUVC>$o6slQKM2xC<_966nx&fyS?{+ejYvu7QU?ll2wO9$NI;q7e?F2Ndtto|Pe z%%QmW_*VfGfk8@-0}r&ku+T0dBI0wbp`l@FXh`k<=jZ$Mh6X9jGX=s?zd2M5rfZ>a zj}E@MVA5GImQUrMoP5*SVt{e8Vr6A5Rf-_f;-wa0Vq&^x)rRwExt~Fub%%T!>gM)*Bknp%$2J$BTgviXVZyl0tFMQ7pI;($GtQx5m zD-2~OBp8$7ZRb<*CB~s=5;%?v_wT{8NWR^yVmw;4TwXi;HEM-hj5W}2v4>)DX~_!c z|4+rV9AR%YMv+McfPR=I-Er=`f2iW)BY}gJv8NN6FZ1|>8e;GbV`EyuyLD(_;dq=h%kbn%trAuj4c zt3VXhMQg~UKb4blob!QWZvoJf2P|z`TH4Buv8S)a_Zhbfy-UqI;cORNdwctU!|&cc zN8230u+9Da8K)9MtKN3}?gDdnZAQ<%utah4?p0cRm^omFarpP{UAPg?95p#<`s#8A z^yGq9BkFH^;KH#C}0OLd^B&for!x(w- z$*C!%4=vkA@b*I^BkjPFfDa13*O$`T-%kR*0!Y#1XAZ!KL9G3~K1K{l8-N}JqyW78 zQvkMH-P|x4tlj4`t-tsz5QQU#k+(ZV8^F8uIbIz&Ncy9;N`1_mQ`sjvlLg(91V zsS+m)&CEz4UAWu$h!h9_pOtKHpKsD$>o@=+!O3X+%uG(kR#ojbIk~HV_SzX$56}7v! z2PoiBBNw9g{psc)Ho*5!-_FllzkKzo_1m{U&vT0Zy+2Nux2QR%G`Yu8z=!|%`SWrO z7X=E1_;GHcxHXiA4Pie#I+{qptby9j&aP)*V9ARXFmw#yU?{K;Wa2|9BbHf`5^)9i zAV63MpLdjg=VyQ2fC*PtRn;_BY<~Rb8dRpNfMD2KruygMeQ_Q|`jS5UUtL{oNK;W5 zzLITLYS)sYoaTnfHc*kI?2bIyI9_kEtTdsQlUQx7e{37^&8TiyltmRCm@v z^BYhi>Pg7~{5J?#@Asx-^F_DXbX@ISTw zFFK-BscOf@OpN~1`H09)j8lr5t^`ylgnVk8 zngHUZrs^!bI(Ry0hIpz3H({AstybF2tpv?CG&Knr#woYYb^vzFD*U|Y+gFf!g8ou7 zGPpWktVHoiJRz50_>U9MXv}+g!1SsFh@^tgo+wks7{xU?}i0(_jFS9j2P?EkR~O&>*yU z%_lDY>vAZkS@+}8rl<#g7hVGp5s7Of(CJf}p^V#BR2DB5q3+Chkf}Tbafr4ynTH+f_f*28D%Du$zm=ywB{e$ z!EufdiyaY1R3esLz@dwBDC&R;!W?kM`zI$iy2Al{(&Zm_nmzYdxxB1AM&Tus#ELsa H*Gm5Ywt-!W diff --git a/doc/api.rst b/doc/api.rst index 6dca39f0b6f..189384feffb 100644 --- a/doc/api.rst +++ b/doc/api.rst @@ -7,7 +7,7 @@ Dataset ------- Creating a dataset -~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~ .. autosummary:: :toctree: generated/ @@ -20,8 +20,6 @@ Attributes and underlying data .. autosummary:: :toctree: generated/ - Dataset.variables - Dataset.virtual_variables Dataset.coordinates Dataset.noncoordinates Dataset.dimensions @@ -45,10 +43,14 @@ and values given by ``DataArray`` objects. Dataset.copy Dataset.iteritems Dataset.itervalues + Dataset.virtual_variables Comparisons ~~~~~~~~~~~ +.. autosummary:: + :toctree: generated/ + Dataset.equals Dataset.identical @@ -58,8 +60,8 @@ Selecting .. autosummary:: :toctree: generated/ - Dataset.indexed_by - Dataset.labeled_by + Dataset.indexed + Dataset.labeled Dataset.reindex Dataset.reindex_like Dataset.rename @@ -74,12 +76,26 @@ IO / Conversion .. autosummary:: :toctree: generated/ - Dataset.dump + Dataset.to_netcdf Dataset.dumps Dataset.dump_to_store Dataset.to_dataframe Dataset.from_dataframe +Dataset internals +~~~~~~~~~~~~~~~~~ + +These attributes and classes provide a low-level interface for working +with Dataset variables. In general you should use the Dataset dictionary- +like interface instead and working with DataArray objects: + +.. autosummary:: + :toctree: generated/ + + Dataset.variables + Variable + Coordinate + Backends (experimental) ~~~~~~~~~~~~~~~~~~~~~~~ @@ -109,10 +125,24 @@ Attributes and underlying data :toctree: generated/ DataArray.values + DataArray.as_index DataArray.coordinates DataArray.name DataArray.dataset DataArray.attrs + DataArray.encoding + DataArray.variable + +NDArray attributes +~~~~~~~~~~~~~~~~~~ + +.. autosummary:: + :toctree: generated/ + + DataArray.ndim + DataArray.shape + DataArray.size + DataArray.dtype Selecting ~~~~~~~~~ @@ -123,8 +153,8 @@ Selecting DataArray.__getitem__ DataArray.__setitem__ DataArray.loc - DataArray.indexed_by - DataArray.labeled_by + DataArray.indexed + DataArray.labeled DataArray.reindex DataArray.reindex_like DataArray.rename @@ -150,6 +180,7 @@ Computations DataArray.transpose DataArray.T DataArray.reduce + DataArray.get_axis_num DataArray.all DataArray.any DataArray.argmax diff --git a/doc/conf.py b/doc/conf.py index 243cd6a3122..4d94e81f46f 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -85,9 +85,10 @@ def __getattr__(cls, name): extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', 'numpydoc', - 'ipython_directive', - 'ipython_console_highlighting' + 'IPython.sphinxext.ipython_directive', + 'IPython.sphinxext.ipython_console_highlighting', ] autosummary_generate = True diff --git a/doc/data-structures.rst b/doc/data-structures.rst index 959d4215737..6b723a12947 100644 --- a/doc/data-structures.rst +++ b/doc/data-structures.rst @@ -1,31 +1,50 @@ Data structures =============== -``xray``'s core data structures are the ``Dataset``, ``Variable`` and -``DataArray``. +xray's core data structures are the :py:class:`~xray.Dataset`, +the :py:class:`~xray.Variable` (including its subclass +:py:class:`~xray.Coordinate`) and the :py:class:`~xray.DataArray`. + +The document is intended as a technical summary of the xray data model. It +should be mostly of interest to advanced users interested in extending or +contributing to xray internals. Dataset ------- -``Dataset`` is netcdf-like object consisting of **variables** (a dictionary of -Variable objects) and **attributes** (an ordered dictionary) which together -form a self-describing data set. +:py:class:`~xray.Dataset` is a Python object representing a fully self- +described dataset of labeled N-dimensional arrays. It consists of: + +1. **variables**: A dictionary of Variable objects. +2. **dimensions**: A dictionary giving the lengths of shared dimensions, which + are required to be consistent across all variables in a Dataset. +3. **attributes**: An ordered dictionary of metadata. + +The design of the Dataset is based by the +`NetCDF `__ file format for +self-described scientific data. This is a data model that has become very +successful and widely used in the geosciences. + +The Dataset is an intelligent container. It allows for simultaneous integer +or label based indexing of all of its variables, supports split-apply-combine +operations with groupby, and can be converted to and from +:py:class:`pandas.DataFrame` objects. Variable -------- -``Variable`` implements **xray's** basic extended array object. It supports the -numpy ndarray interface, but is extended to support and use metadata. It -consists of: +:py:class:`~xray.Variable` implements xray's basic extended array object. It +supports the numpy ndarray interface, but is extended to support and use +basic metadata (not including coordinate values). It consists of: 1. **dimensions**: A tuple of dimension names. -2. **data**: The n-dimensional array (typically, of type ``numpy.ndarray``) - storing the array's data. It must have the same number of dimensions as the - length of the "dimensions" attribute. +2. **data**: The N-dimensional array (for example, of type + :py:class:`numpy.ndarray`) storing the array's data. It must have the same + number of dimensions as the length of the "dimensions" attribute. 3. **attributes**: An ordered dictionary of additional metadata to associate with this array. -The main functional difference between Variables and numpy.ndarrays is that +The main functional difference between Variables and numpy arrays is that numerical operations on Variables implement array broadcasting by dimension name. For example, adding an Variable with dimensions `('time',)` to another Variable with dimensions `('space',)` results in a new Variable with dimensions @@ -33,22 +52,23 @@ Variable with dimensions `('space',)` results in a new Variable with dimensions ``sum`` are overwritten to take a "dimension" argument instead of an "axis". Variables are light-weight objects used as the building block for datasets. -However, usually manipulating data in the form of a DataArray should be -preferred (see below), because they can use more complete metadata in the full -of other dataset variables. +**However, manipulating data in the form of a Dataset or DataArray should +almost always be preferred** (see below), because they can use more complete +metadata in context of coordinate labels. DataArray --------- -``DataArray`` is a flexible hybrid of Dataset and Variable that attempts to -provide the best of both in a single object. Under the covers, DataArrays -are simply pointers to a dataset (the ``dataset`` attribute) and the name of a -"focus variable" in the dataset (the ``focus`` attribute), which indicates to -which variable array operations should be applied. +A :py:class:`~xray.DataArray` object is a multi-dimensional array with labeled +dimensions and coordinates. Coordinate labels give it additional power over the +Variable object, so it should be preferred for all high-level use. + +Under the covers, DataArrays are simply pointers to a dataset (the ``dataset`` +attribute) and the name of a variable in the dataset (the ``name`` attribute), +which indicates to which variable array operations should be applied. DataArray objects implement the broadcasting rules of Variable objects, but also use and maintain coordinates (aka "indices"). This means you can do intelligent (and fast!) label based indexing on DataArrays (via the ``.loc`` attribute), do flexibly split-apply-combine operations with -``groupby`` and also easily export them to ``pandas.DataFrame`` or -``pandas.Series`` objects. \ No newline at end of file +``groupby`` and convert them to or from :py:class:`pandas.Series` objects. diff --git a/doc/getting-started.rst b/doc/getting-started.rst deleted file mode 100644 index b68d01561be..00000000000 --- a/doc/getting-started.rst +++ /dev/null @@ -1,114 +0,0 @@ -Getting Started -=============== - -.. ipython:: python - :suppress: - - import numpy as np - np.random.seed(123456) - -Creating a ``Dataset`` ----------------------- - -Let's create some ``XArray`` objects and put them in a ``Dataset``: - -.. ipython:: python - - import xray - import numpy as np - import pandas as pd - time = xray.XArray('time', pd.date_range('2010-01-01', periods=365)) - us_state = xray.XArray('us_state', ['WA', 'OR', 'CA', 'NV']) - temp_data = (30 * np.cos(np.pi * np.linspace(-1, 1, 365).reshape(-1, 1)) - + 5 * np.arange(5, 9).reshape(1, -1) - + 3 * np.random.randn(365, 4)) - temperature = xray.XArray( - ['time', 'us_state'], temp_data, attributes={'units': 'degrees_F'}) - avg_rain = xray.XArray( - 'us_state', [27.66, 37.39, 17.28, 7.87], {'units': 'inches/year'}) - ds = xray.Dataset({'time': time, 'temperature': temperature, - 'us_state': us_state, 'avg_rain': avg_rain}, - attributes={'title': 'example dataset'}) - ds - -This dataset contains two non-coordinate variables, ``temperature`` and -``avg_rain``, as well as the coordinates ``time`` and ``us_state``. - -We can now access the contents of ``ds`` as self-described ``DataArray`` -objects: - -.. ipython:: python - - ds['temperature'] - -As you might guess, ``Dataset`` acts like a dictionary of variables. We -dictionary syntax to modify dataset variables in-place: - -.. ipython:: python - - ds['foo'] = ('us_state', 0.1 * np.random.rand(4)) - ds - del ds['foo'] - ds - -On the first line, we used a shortcut: we specified the 'foo' variable by -a tuple of the arguments for ``XArray`` instead of an ``XArray`` object. -This works, because a dataset can contain only ``XArray`` objects. - -We can also access some derived variables from time dimensions without -actually needing to put them in our dataset: - -.. ipython:: python - - ds['time.dayofyear'] - -Dataset math ------------- - -We can manipulate variables in a dataset like numpy arrays, while still -keeping track of their metadata: - -.. ipython:: python - - np.tan((ds['temperature'] + 10) ** 2) - -Sometimes, we really want just the plain numpy array. That's easy, too: - -.. ipython:: python - - ds['temperature'].data - -An advantage of sticking with dataset arrays is that we can use dimension -based broadcasting instead of numpy's shape based broadcasting: - -.. ipython:: python - - # this wouldn't work in numpy, because both these variables are 1d: - ds['time.month'] * ds['avg_rain'] - -We can also apply operations across dimesions by name instead of using -axis numbers: - -.. ipython:: python - - ds['temperature'].mean('time') - -Integration with ``pandas`` ---------------------------- - -Turning a dataset into a ``pandas.DataFrame`` broadcasts all the variables -over all dimensions: - -.. ipython:: python - - df = ds.to_dataframe() - df.head() - -Using the ``plot`` method on pandas objects is almost certainly the easiest way -to plot xray objects: - -.. ipython:: python - - # ds['temperature'].to_series() would work in place of df['temperature'] here - @savefig series_plot_example.png width=6in - df['temperature'].unstack('us_state').plot() diff --git a/doc/index.rst b/doc/index.rst index 62a5e2114ac..e651b4682f4 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,14 +1,48 @@ xray: extended arrays for working with scientific datasets in Python ==================================================================== -**xray** is a Python package for working with aligned sets of homogeneous, -n-dimensional arrays. It implements flexible array operations and dataset -manipulation for in-memory datasets within the Common Data Model widely -used for self-describing scientific data (e.g., the NetCDF file format). +**xray** is a Python package for working with aligned sets of +homogeneous, n-dimensional arrays. It implements flexible array +operations and dataset manipulation for in-memory datasets within the +`Common Data +Model `__ +widely used for self-describing scientific data (e.g., the NetCDF file +format). -For a longer introduction to **xray**, see the project's README on GitHub_. +Why xray? +--------- -.. _GitHub: https://github.com/akleeman/xray +Adding dimensions names and coordinate values to numpy's +`ndarray `__ +makes many powerful array operations possible: + +- Apply operations over dimensions by name: ``x.sum('time')``. +- Select values by label instead of integer location: + ``x.loc['2014-01-01']`` or ``x.labeled(time='2014-01-01')``. +- Mathematical operations (e.g., ``x - y``) vectorize across multiple + dimensions (known in numpy as "broadcasting") based on dimension + names, regardless of their original order. +- Flexible split-apply-combine operations with groupby: + ``x.groupby('time.dayofyear').apply(lambda y: y - y.mean())``. +- Database like aligment based on coordinate labels that smoothly + handles missing values: ``x, y = xray.align(x, y, join='outer')``. +- Keep track of arbitrary metadata in the form of a Python dictionary: + ``x.attrs``. + +**xray** aims to provide a data analysis toolkit as powerful as +`pandas `__ but designed for working with +homogeneous N-dimensional arrays instead of tabular data. Indeed, much +of its design and internal functionality (in particular, fast indexing) +is shamelessly borrowed from pandas. + +Because **xray** implements the same data model as the NetCDF file +format, xray datasets have a natural and portable serialization format. +But it's also easy to robustly convert an xray ``DataArray`` to and from +a numpy ``ndarray`` or a pandas ``DataFrame`` or ``Series``, providing +compatibility with the full `PyData ecosystem `__. + +For a longer introduction to **xray** and its design goals, see +`the project's GitHub page `__. Contents -------- @@ -16,6 +50,7 @@ Contents .. toctree:: :maxdepth: 1 + installing + tutorial data-structures - getting-started api diff --git a/doc/installing.rst b/doc/installing.rst new file mode 100644 index 00000000000..8a67a4d6cc1 --- /dev/null +++ b/doc/installing.rst @@ -0,0 +1,24 @@ +Installing xray +=============== + +xray requires Python 2.7 and recent versions of +`numpy `__ (1.8.0 or later) and +`pandas `__ (0.13.1 or later). +`netCDF4-python `__, +`pydap `__ and `scipy `__ are +optional: they add support for reading and writing netCDF files and/or +accessing OpenDAP datasets. + +The easiest way to get all these dependencies installed is to use the +`Anaconda python distribution `__. + +To install xray, use pip: + +:: + + pip install xray + +.. warning:: + + If you don't already have recent versions of numpy and pandas installed, + installing xray will automatically update them. diff --git a/doc/tutorial.rst b/doc/tutorial.rst new file mode 100644 index 00000000000..1b52e332dd4 --- /dev/null +++ b/doc/tutorial.rst @@ -0,0 +1,934 @@ +Tutorial +======== + +.. ipython:: python + :suppress: + + import numpy as np + np.random.seed(123456) + +``Dataset`` objects +------------------- + +Creating a ``Dataset`` +~~~~~~~~~~~~~~~~~~~~~~ + +To make an :py:class:`xray.Dataset` from scratch, pass in a dictionary with +values in the form ``(dimensions, data[, attributes])``. + +- `dimensions` should be a sequence of strings. +- `data` should be a numpy.ndarray (or array-like object) that has a + dimensionality equal to the length of the dimensions list. + +.. ipython:: python + + import numpy as np + import pandas as pd + import xray + + foo_values = np.random.RandomState(0).rand(3, 4) + times = pd.date_range('2000-01-01', periods=3) + + ds = xray.Dataset({'time': ('time', times), + 'foo': (['time', 'space'], foo_values)}) + ds + +You can also insert :py:class:`xray.Variable` or :py:class:`xray.DataArray` +objects directly into a Dataset, or create an dataset from a +:py:class:`pandas.DataFrame` with +:py:meth:`Dataset.from_dataframe ` or from a +NetCDF file on disk with :py:func:`~xray.open_dataset`. See +`Working with pandas`_ and `Serialization and IO`_. + +``Dataset`` contents +~~~~~~~~~~~~~~~~~~~~ + +:py:class:`~xray.Dataset` implements the Python dictionary interface, with +values given by :py:class:`xray.DataArray` objects. The valid keys include +each listed "coordinate" and "noncoordinate": + +.. ipython:: python + + 'foo' in ds + + ds.keys() + + ds['time'] + +We didn't explicitly include a variable for the "space" dimension, so it +was filled with an array of ascending integers of the proper length: + +.. ipython:: python + + ds['space'] + + ds['foo'] + +The numbers in the columns in the ``Dataset`` representation indicate the order +of the dimension for each array (on a ``Dataset``, the dimensions are always +listed in alphabetical order). + +There are also a few derived variables based on datetime coordinates that you +can access from a dataset (e.g., "year", "month" and "day"), even if you didn't +explicitly add them. These are known as +":py:attr:`~xray.Dataset.virtual_variables`": + +.. ipython:: python + + ds['time.dayofyear'] + +Finally, Datasets also store arbitrary metadata in the form of `attributes`: + +.. ipython:: python + + ds.attrs + + ds.attrs['title'] = 'example attribute' + ds + +xray does not enforce any restrictions on attributes, but serialization to +some file formats may fail if you put in objects that aren't strings, numbers +or arrays. + +Modifying datasets +~~~~~~~~~~~~~~~~~~ + +We can update a dataset in-place using Python's standard dictionary syntax: + +.. ipython:: python + + ds['numbers'] = ('space', [10, 10, 20, 20]) + ds['abc'] = ('time', ['A', 'B', 'C']) + ds + +It should be evident now how a ``Dataset`` lets you store many arrays along a +(partially) shared set of common dimensions and coordinates. + +To change the variables in a ``Dataset``, you can use all the standard dictionary +methods, including ``values``, ``items``, ``__del__``, ``get`` and +``update``. + +You also can select and unselect an explicit list of variables by using the +:py:meth:`~xray.Dataset.select` and :py:meth:`~xray.Dataset.unselect` methods +to return a new ``Dataset``. `select` automatically includes the relevant +coordinate values: + +.. ipython:: python + + ds.select('abc') + +If a coordinate is given as an argument to `unselect`, it also unselects all +variables that use that coordinate: + +.. ipython:: python + + ds.unselect('time', 'space') + +You can copy a ``Dataset`` by using the :py:meth:`~xray.Dataset.copy` method: + +.. ipython:: python + + ds2 = ds.copy() + del ds2['time'] + ds2 + +By default, the copy is shallow, so only the container will be copied: the +contents of the ``Dataset`` will still be the same underlying +:py:class:`xray.Variable`. You can copy all data by supplying the argument +``deep=True``. + +``DataArray`` objects +--------------------- + +The contents of a :py:class:`~xray.Dataset` are :py:class:`~xray.DataArray` +objects, xray's version of a labeled multi-dimensional array. +``DataArray`` supports metadata aware array operations based on their +labeled dimensions (axis names) and labeled coordinates (tick values). + +The idea of the DataArray is to provide an alternative to +:py:class:`pandas.Series` and :py:class:`pandas.DataFrame` with functionality +much closer to standard numpy N-dimensional array. Unlike pandas objects, +slicing or manipulating a DataArray always returns another DataArray, and all +items in a DataArray must have a single (homogeneous) data type. (To work +with heterogeneous data in xray, put separate DataArrays in the same Dataset.) + +You create a DataArray by getting an item from a Dataset: + +.. ipython:: python + + foo = ds['foo'] + foo + +.. note:: + + You currently cannot make a DataArray without putting objects into Dataset + first, unless you use the :py:meth:`DataArray.from_series ` + class method to convert an existing :py:class:`pandas.Series`. We do + intend to define a constructor for making DataArray objects directly in a + future version of xray. + +Internally, data arrays are uniquely defined by only two attributes: + +- :py:attr:`~xray.DataArray.dataset`: a dataset object. +- :py:attr:`~xray.DataArray.name`: the name of a variable in the array's + dataset. + +Like pandas objects, they can be thought of as fancy wrapper around a +numpy array: + +.. ipython:: python + + foo.values + +They also have a tuple of dimension labels: + +.. ipython:: python + + foo.dimensions + +They track of their coordinates (tick labels) in a read-only ordered +dictionary mapping from dimension names to :py:class:`~xray.Coordinate` +objects: + +.. ipython:: python + + foo.coordinates + +They also keep track of their own attributes: + +.. ipython:: python + + foo.attrs + +You can pull out other variable (including coordinates) from a DataArray's +dataset by indexing the data array with a string: + +.. ipython:: python + + foo['time'] + +Usually, xray automatically manages the `Dataset` objects that data arrays +points to in a satisfactory fashion. For example, it will keep around other +dataset variables when possible until there are potential conflicts, such as +when you apply a mathematical operation. + +However, in some cases, particularly for performance reasons, you may want to +explicitly ensure that the dataset only includes the variables you are +interested in. For these cases, use the :py:meth:`xray.DataArray.select` +method to select the names of variables you want to keep around, by default +including the name of only the DataArray itself: + +.. ipython:: python + + foo2 = foo.select() + + foo2 + +`foo2` is generally an equivalent labeled array to `foo`, but we dropped the +non-relevant dataset variables: + +.. ipython:: python + + foo.dataset.keys() + + foo2.dataset.keys() + +Array indexing +-------------- + +Indexing a :py:class:`~xray.DataArray` works (mostly) just like it does for +numpy arrays, except that the returned object is always another DataArray: + +.. ipython:: python + + foo[:2] + + foo[0, 0] + + foo[:, [2, 1]] + +xray also supports label based indexing like pandas. Because +:py:class:`~xray.Coordinate` is a thin wrapper around a +:py:class:`pandas.Index`, label indexing is very fast. To do +label based indexing, use the :py:attr:`~xray.DataArray.loc` attribute: + +.. ipython:: python + + foo.loc['2000-01-01':'2000-01-02', 0] + +You can do any of the label indexing operations `supported by pandas`__ with +the exception of boolean arrays, including looking up particular labels, using +slice syntax and using arrays of labels. Like pandas, label based indexing is +*inclusive* of both the start and stop bounds. + +__ http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-label + +Setting values with label based indexing is also supported: + +.. ipython:: python + + foo.loc['2000-01-01', [1, 2]] = -10 + foo + +With labeled dimension names, we do not have to rely on dimension order and can +use them explicitly to slice data with the :py:meth:`~xray.DataArray.indexed` +and :py:meth:`~xray.DataArray.labeled` methods: + +.. ipython:: python + + # index by array indices + foo.indexed(space=0, time=slice(0, 2)) + + # index by coordinate labels + foo.labeled(time=slice('2000-01-01', '2000-01-02')) + +The arguments to these methods can be any objects that could index the array +along that dimension, e.g., labels for an individual value, Python ``slice`` +objects or 1-dimensional arrays. + +We can also use these methods to index all variables in a dataset +simultaneously, returning a new dataset: + +.. ipython:: python + + ds.indexed(space=[0], time=[0]) + +.. ipython:: python + + ds.labeled(time='2000-01-01') + +Indexing with xray objects has one important difference from indexing numpy +arrays: you can only use one-dimensional arrays to index xray objects, and +each indexer is applied "orthogonally" along independent axes, instead of +using numpy's array broadcasting. This means you can do indexing like this, +which wouldn't work with numpy arrays: + +.. ipython:: python + + foo[ds['time.day'] > 1, ds['space'] <= 3] + +This is a much simpler model than numpy's `advanced indexing`__, +and is basically the only model that works for labeled arrays. If you would +like to do this sort of indexing, so you always index ``.values`` instead: + +__ http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html + +.. ipython:: python + + foo.values[foo.values > 0.5] + +``DataArray`` math +------------------ + +The metadata of :py:class:`~xray.DataArray` objects enables particularly nice +features for doing mathematical operations. + +Basic math +~~~~~~~~~~ + +Basic math works just as you would expect: + +.. ipython:: python + + foo - 3 + +You can also use any of numpy's or scipy's many `ufunc`__ functions directly on +a DataArray: + +__ http://docs.scipy.org/doc/numpy/reference/ufuncs.html + +.. ipython:: python + + np.sin(foo) + +Aggregation +~~~~~~~~~~~ + +Whenever feasible, DataArrays have metadata aware version of standard methods +and properties from numpy arrays. For example, we can easily take a metadata +aware :py:attr:`xray.DataArray.transpose`: + +.. ipython:: python + + foo.T + +Most of these methods have been updated to take a `dimension` argument instead +of `axis`. This allows for very intuitive syntax for aggregation methods that +are applied along particular dimension(s): + +.. ipython:: python + + foo.sum('time') + +.. ipython:: python + + foo.std(['time', 'space']) + +Currently, these are the standard numpy array methods which do not automatically +skip missing values, but we expect to switch to NA skipping versions (like +pandas) in the future. For now, you can do NA skipping aggregate by passing +NA aware numpy functions to the :py:attr:`~xray.DataArray.reduce` method: + +.. ipython:: python + + foo.reduce(np.nanmean, 'time') + +If you ever need to figure out the axis number for a dimension yourself (say, +for wrapping library code designed to work with numpy arrays), you can use the +:py:meth:`~xray.DataArray.get_axis_num` method: + +.. ipython:: python + + foo.get_axis_num('space') + +Broadcasting +~~~~~~~~~~~~ + +With dimension names, we automatically align dimensions ("broadcasting" in +the numpy parlance) by name instead of order. This means that you should never +need to bother inserting dimensions of length 1 with operations like +:py:func:`np.reshape` or :py:const:`np.newaxis`, which is pretty routinely +required when working with standard numpy arrays. + +This is best illustrated by a few examples. Consider two one-dimensional +arrays with different sizes aligned along different dimensions: + +.. ipython:: python + + foo[:, 0] + + foo[0, :] + +With xray, we can apply binary mathematical operations to arrays, and their +dimensions are expanded automatically: + +.. ipython:: python + + foo[:, 0] - foo[0, :] + +Moreover, dimensions are always reordered to the order in which they first +appeared. That means you can always subtract an array from its transpose! + +.. ipython:: python + + foo - foo.T + +Coordinate based alignment +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can also align arrays based on their coordinate values, very similarly +to how pandas handles alignment. This can be done with the +:py:meth:`~xray.DataArray.reindex` or :py:meth:`~xray.DataArray.reindex_like` +methods, or the :py:func:`~xray.align` top-level function. All these work +interchangeably with both DataArray and Dataset objects with any number of +overlapping dimensions. + +To demonstrate, we'll make a subset DataArray with new values: + +.. ipython:: python + + bar = (10 * foo[:2, :2]).rename('bar') + bar + +Reindexing ``foo`` with ``bar`` selects out the first two values along each +dimension: + +.. ipython:: python + + foo.reindex_like(bar) + +The opposite operation asks us to reindex to a larger shape, so we fill in +the missing values with `NaN`: + +.. ipython:: python + + bar.reindex_like(foo) + +The :py:func:`~xray.align` is even more flexible: + +.. ipython:: python + + xray.align(ds, bar, join='inner') + +Pandas does this sort of index based alignment automatically when doing math, +using an `join='outer'`. This is an intended feature for xray, too, but we +haven't turned it on yet, because it is not clear that an outer join (which +preserves all missing values) is the best choice for working with high- +dimension arrays. Arguably, an inner join makes more sense, because that is +less likely to result in memory blow-ups. Hopefully, this point will eventually +become moot when python libraries better support working with arrays that +cannot be directly represented in a block of memory. + +GroupBy: split-apply-combine +---------------------------- + +Pandas has very convenient support for `"group by"`__ operations, which +implement the `split-apply-combine`__ strategy for crunching data: + +__ http://pandas.pydata.org/pandas-docs/stable/groupby.html +__ http://www.jstatsoft.org/v40/i01/paper + +- Split your data into multiple independent groups. +- Apply some function to each group. +- Combine your groups back into a single data object. + +xray implements this same pattern using very similar syntax to pandas. Group by +operations work on both :py:class:`~xray.Dataset` and +:py:class:`~xray.DataArray` objects. Note that currently, you can only group +by a single one-dimensional variable (eventually, we hope to remove this +limitation). + +Split +~~~~~ + +Recall the "numbers" variable in our dataset: + +.. ipython:: python + + ds['numbers'] + +If we groupby the name of a variable in a dataset (we can also use a DataArray +directly), we get back a :py:class:`xray.GroupBy` object: + +.. ipython:: python + + ds.groupby('numbers') + +This object works very similarly to a pandas GroupBy object. You can view +the group indices with the ``groups`` attribute: + +.. ipython:: python + + ds.groupby('numbers').groups + +You can also iterate over over groups in ``(label, group)`` pairs: + +.. ipython:: python + + list(ds.groupby('numbers')) + +Just like in pandas, creating a GroupBy object doesn't actually split the data +until you want to access particular values. + +Apply +~~~~~ + +To apply a function to each group, you can use the flexible +:py:attr:`xray.GroupBy.apply` method. The resulting objects are automatically +concatenated back together along the group axis: + +.. ipython:: python + + def standardize(x): + return (x - x.mean()) / x.std() + + foo.groupby('numbers').apply(standardize) + +Group by objects resulting from DataArrays also have shortcuts to aggregate +a function over each element of the group: + +.. ipython:: python + + foo.groupby('numbers').mean() + +Squeezing +~~~~~~~~~ + +When grouping over a dimension, you can control whether the dimension is +squeezed out or if it should remain with length one on each group by using +the ``squeeze`` parameter: + +.. ipython:: python + + list(foo.groupby('space'))[0][1] + +.. ipython:: python + + list(foo.groupby('space', squeeze=False))[0][1] + +Although xray will attempt to automatically +:py:attr:`~xray.DataArray.transpose` dimensions back into their original order +when you use apply, it is sometimes useful to set ``squeeze=False`` to +guarantee that all original dimensions remain unchanged. + +You can always squeeze explicitly later with the Dataset or DataArray +:py:meth:`~xray.DataArray.squeeze` methods. + +Combining data +-------------- + +Concatenate +~~~~~~~~~~~ + +To combine arrays along a dimension into a larger arrays, you can use the +:py:meth:`DataArray.concat ` and +:py:meth:`Dataset.concat ` class methods: + +.. ipython:: python + + xray.DataArray.concat([foo[0], foo[1]], 'new_dim') + + xray.Dataset.concat([ds.labeled(time='2000-01-01'), + ds.labeled(time='2000-01-03')], + 'new_dim') + +:py:meth:`Dataset.concat ` has a number of options which +control how it combines data, and in particular, how it handles conflicting +variables between datasets. + +Merge and update +~~~~~~~~~~~~~~~~ + +To combine multiple Datasets, you can use the +:py:meth:`~xray.Dataset.merge` and :py:meth:`~xray.Dataset.update` methods. +Merge checks for conflicting variables before merging and by +default it returns a new Dataset: + +.. ipython:: python + + ds.merge({'hello': ('space', np.arange(4) + 10)}) + +In contrast, update modifies a dataset in-place without checking for conflicts, +and will overwrite any existing variables with new values: + +.. ipython:: python + + ds.update({'space': ('space', [10.2, 9.4, 6.4, 3.9])}) + +However, dimensions are still required to be consistent between different +Dataset variables, so you cannot change the size of a dimension unless you +replace all dataset variables that use it. + +Equals and identical +~~~~~~~~~~~~~~~~~~~~ + +xray objects can be compared by using the :py:meth:`~xray.DataArray.equals` +and :py:meth:`~xray.DataArray.identical` methods. + +``equals`` checks dimension names, coordinate labels and array values: + +.. ipython:: python + + foo.equals(foo.copy()) + +``identical`` also checks attributes, and the name of each object: + +.. ipython:: python + + foo.identical(foo.rename('bar')) + +In contrast, the ``==`` for ``DataArray`` objects performs element- wise +comparison (like numpy): + +.. ipython:: python + + foo == foo.copy() + +Like pandas objects, two xray objects are still equal or identical if they have +missing values marked by `NaN`, as long as the missing values are in the same +locations in both objects. This is not true for `NaN` in general, which usually +compares `False` to everything, including itself: + +.. ipython:: python + + np.nan == np.nan + +Working with ``pandas`` +----------------------- + +One of the most important features of xray is the ability to convert to and +from :py:mod:`pandas` objects to interact with the rest of the PyData +ecosystem. For example, for plotting labeled data, we highly recommend +using the visualization `built in to pandas itself`__ or provided by the pandas +aware libraries such as `Seaborn`__ and `ggplot`__. + +__ http://pandas.pydata.org/pandas-docs/stable visualization.html +__ http://stanford.edu/~mwaskom/software/seaborn/ +__ http://ggplot.yhathq.com/ + +Fortunately, there are straightforward representations of +:py:class:`~xray.Dataset` and :py:class:`~xray.DataArray` in terms of +:py:class:`pandas.DataFrame` and :py:class:`pandas.Series`, respectively. +The representation works by flattening noncoordinates to 1D, and turning the +tensor product of coordinates into a :py:class:`pandas.MultiIndex`. + +``pandas.DataFrame`` +~~~~~~~~~~~~~~~~~~~~ + +To convert to a ``DataFrame``, use the :py:meth:`Dataset.to_dataframe() +` method: + +.. ipython:: python + + df = ds.to_dataframe() + df + +We see that each noncoordinate in the Dataset is now a column in the DataFrame. +The ``DataFrame`` representation is reminiscent of Hadley Wickham's notion of +`tidy data`__. To convert the ``DataFrame`` to any other convenient representation, +use ``DataFrame`` methods like :py:meth:`~pandas.DataFrame.reset_index`, +:py:meth:`~pandas.DataFrame.stack` and :py:meth:`~pandas.DataFrame.unstack`. + +__ http://vita.had.co.nz/papers/tidy-data.pdf + +To create a ``Dataset`` from a ``DataFrame``, use the +:py:meth:`~xray.Dataset.from_dataframe` class method: + +.. ipython:: python + + xray.Dataset.from_dataframe(df) + +Notice that that dimensions of noncoordinates in the ``Dataset`` have now +expanded after the round-trip conversion to a ``DataFrame``. This is because +every object in a ``DataFrame`` must have the same indices, so needed to +broadcast the data of each array to the full size of the new ``MultiIndex``. + +``pandas.Series`` +~~~~~~~~~~~~~~~~~ + +``DataArray`` objects have a complementary representation in terms of a +:py:class:`pandas.Series`. Using a Series preserves the ``Dataset`` to +``DataArray`` relationship, because ``DataFrames`` are dict-like containers +of ``Series``. The methods are very similar to those for working with +DataFrames: + +.. ipython:: python + + s = foo.to_series() + s + + xray.DataArray.from_series(s) + +Serialization and IO +-------------------- + +xray supports direct serialization and IO to several file formats. For more +options, consider exporting your objects to pandas (see the preceeding section) +and using its broad range of `IO tools`__. + +__ http://pandas.pydata.org/pandas-docs/stable/io.html + +Pickle +~~~~~~ + +The simplest way to serialize an xray object is to use Python's built-in pickle +module: + +.. ipython:: python + + import cPickle as pickle + + pkl = pickle.dumps(ds) + + pickle.loads(pkl) + +Pickle support is important because it doesn't require any external libraries +and lets you use xray objects with Python modules like ``multiprocessing``. +However, there are two important cavaets: + +1. To simplify serialization, xray's support for pickle currently loads all + array values into memory before dumping an object. This means it is not + suitable for serializing datasets too big to load into memory (e.g., from + NetCDF or OpenDAP). +2. Pickle will only work as long as the internal data structure of xray objects + remains unchanged. Because the internal design of xray is still being + refined, we make no guarantees (at this point) that objects pickled with + this version of xray will work in future versions. + +Reading and writing to disk (NetCDF) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Currently, the only external serialization format that xray supports is +`NetCDF`__. NetCDF is a file format for fully self-described datasets that is +widely used in the geosciences and supported on almost all platforms. We use +NetCDF because xray was based on the NetCDF data model, so NetCDF files on disk +directly correspond to :py:class:`~xray.Dataset` objects. Recent versions +NetCDF are based on the even more widely used HDF5 file-format. + +__ http://www.unidata.ucar.edu/software/netcdf/ + +Reading and writing NetCDF files with xray requires the +`Python-NetCDF4`__ library. + +__ https://github.com/Unidata/netcdf4-python + +We can save a Dataset to disk using the +:py:attr:`Dataset.to_netcdf <~xray.Dataset.to_netcdf>` method: + +.. use verbatim because readthedocs doesn't have netCDF4 support + +.. ipython:: + :verbatim: + + In [1]: ds.to_netcdf('saved_on_disk.nc') + +By default, the file is saved as NetCDF4. + +We can load NetCDF files to create a new Dataset using the +:py:func:`~xray.open_dataset` function: + +.. ipython:: + :verbatim: + + In [1]: ds_disk = xray.open_dataset('saved_on_disk.nc') + + In [2]: ds_disk + + Dimensions: (space: 4, time: 3) + Coordinates: + space X + time X + Noncoordinates: + foo 1 0 + numbers 0 + abc 0 + Attributes: + title: example attribute + +Data is loaded lazily from NetCDF files. You can manipulate, slice and subset +Dataset and DataArray objects, and no array values are loaded into memory until +necessary. For an example of how these lazy arrays work, since the OpenDAP +section below. + +.. note:: + + Although xray provides reasonable support for incremental reads of files on + disk, it does not yet support incremental writes, which is important for + dealing with datasets that do not fit into memory. This is a major + shortcoming which is on the roadmap for fixing in the next major version, + which will include the ability to create ``Dataset`` objects directly + linked to a NetCDF file on disk. + +NetCDF files follow some conventions for encoding datetime arrays (as numbers +with a "units" attribute) and for packing and unpacking data (as +described by the "scale_factor" and "_FillValue" attributes). If the argument +``decode_cf=True`` (default) is given to ``open_dataset``, xray will attempt +to automatically decode the values in the NetCDF objects according to +`CF conventions`__. Sometimes this will fail, for example, if a variable +has an invalid "units" or "calendar" attribute. For these cases, you can +turn this decoding off manually. + +__ http://cfconventions.org/ + +You can view this encoding information and control the details of how xray +serializes objects, by viewing and manipulating the +:py:attr:`DataArray.encoding ` attribute: + +.. ipython:: + :verbatim: + + In [1]: ds_disk['time'].encoding + {'calendar': u'proleptic_gregorian', + 'chunksizes': None, + 'complevel': 0, + 'contiguous': True, + 'dtype': dtype('float64'), + 'fletcher32': False, + 'least_significant_digit': None, + 'shuffle': False, + 'units': u'days since 2000-01-01 00:00:00', + 'zlib': False} + +Working with remote datasets (OpenDAP) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +xray includes support for `OpenDAP`__ (via the NetCDF4 library or Pydap), which +lets us access large datasets over HTTP. + +__ http://www.opendap.org/ + +For example, we can open a connetion to GBs of weather data produced by the +`PRISM`__ project, and hosted by +`International Research Institute for Climate and Society`__ at Columbia: + +__ http://www.prism.oregonstate.edu/ +__ http://iri.columbia.edu/ + +.. ipython:: + :verbatim: + + In [3]: remote_data = xray.open_dataset( + 'http://iridl.ldeo.columbia.edu/SOURCES/.OSU/.PRISM/.monthly/dods') + + In [4]: remote_data + + Dimensions: (T: 1432, X: 1405, Y: 621) + Coordinates: + T X + X X + Y X + Noncoordinates: + ppt 0 2 1 + tdmean 0 2 1 + tmax 0 2 1 + tmin 0 2 1 + Attributes: + Conventions: IRIDL + expires: 1401580800 + + In [5]: remote_data['tmax'] + + [1249427160 values with dtype=float64] + Attributes: + pointwidth: 120 + units: Celsius_scale + missing_value: -9999 + standard_name: air_temperature + expires: 1401580800 + +We can select and slice this data any number of times, and nothing is loaded +over the network until we look at particular values: + +.. ipython:: + :verbatim: + + In [4]: tmax = remote_data['tmax'][:500, ::3, ::3] + + In [5]: tmax + + [48541500 values with dtype=float64] + Attributes: + pointwidth: 120 + units: Celsius_scale + missing_value: -9999 + standard_name: air_temperature + expires: 1401580800 + +Now, let's access and plot a small subset: + +.. ipython:: + :verbatim: + + In [6]: tmax_ss = tmax[0] + +For this dataset, we still to manually fill in some of the values with `NaN` +to indicate that they are missing. As soon as we access ``tmax_ss.values``, the +values are loaded over the network and cached on the DataArray so they can +be manipulated: + +.. ipython:: + :verbatim: + + In [7]: tmax_ss.values[tmax_ss.values < -99] = np.nan + +Finally, we can plot the values with matplotlib: + +.. ipython:: + :verbatim: + + In [8]: import matplotlib.pyplot as plt + + In [9]: from matplotlib.cm import get_cmap + + In [10]: plt.figure(figsize=(9, 5)) + + In [11]: plt.gca().patch.set_color('0') + + In [12]: plt.contourf(tmax_ss['X'], tmax_ss['Y'], tmax_ss.values, 20, + cmap=get_cmap('RdBu_r')) + + In [13]: plt.colorbar() + +.. image:: _static/opendap-prism-tmax.png + + diff --git a/setup.py b/setup.py index bb4c61b08f8..956ce3c1361 100644 --- a/setup.py +++ b/setup.py @@ -15,6 +15,54 @@ VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO) QUALIFIER = '' + +FULL_DESCRIPTION = """ +**xray** is a Python package for working with aligned sets of +homogeneous, n-dimensional arrays. It implements flexible array +operations and dataset manipulation for in-memory datasets within the +`Common Data +Model `__ +widely used for self-describing scientific data (e.g., the NetCDF file +format). + +Why xray? +--------- + +Adding dimensions names and coordinate values to numpy's +`ndarray `__ +makes many powerful array operations possible: + +- Apply operations over dimensions by name: ``x.sum('time')``. +- Select values by label instead of integer location: + ``x.loc['2014-01-01']`` or ``x.labeled(time='2014-01-01')``. +- Mathematical operations (e.g., ``x - y``) vectorize across multiple + dimensions (known in numpy as "broadcasting") based on dimension + names, regardless of their original order. +- Flexible split-apply-combine operations with groupby: + ``x.groupby('time.dayofyear').apply(lambda y: y - y.mean())``. +- Database like aligment based on coordinate labels that smoothly + handles missing values: ``x, y = xray.align(x, y, join='outer')``. +- Keep track of arbitrary metadata in the form of a Python dictionary: + ``x.attrs``. + +**xray** aims to provide a data analysis toolkit as powerful as +`pandas `__ but designed for working with +homogeneous N-dimensional arrays instead of tabular data. Indeed, much +of its design and internal functionality (in particular, fast indexing) +is shamelessly borrowed from pandas. + +Because **xray** implements the same data model as the NetCDF file +format, xray datasets have a natural and portable serialization format. +But it's also easy to robustly convert an xray ``DataArray`` to and from +a numpy ``ndarray`` or a pandas ``DataFrame`` or ``Series``, providing +compatibility with the full `PyData ecosystem `__. + +For a longer introduction to **xray**, see the project's README on GitHub_. + +.. _GitHub: https://github.com/akleeman/xray +""" + + # code to extract and write the version copied from pandas, which is available # under the BSD license: FULLVERSION = VERSION @@ -84,7 +132,8 @@ def write_version_py(filename=None): setup(name='xray', version=FULLVERSION, - description='Extended arrays for working with scientific datasets', + description='Extended arrays for working with scientific datasets in Python', + full_description=FULL_DESCRIPTION, author='Stephan Hoyer, Alex Kleeman, Eugene Brevdo', author_email='TODO', install_requires=['numpy >= 1.8', 'pandas >= 0.13.1'], diff --git a/test/test_data_array.py b/test/test_data_array.py index 9ad85dd243b..8876a7a07a5 100644 --- a/test/test_data_array.py +++ b/test/test_data_array.py @@ -1,4 +1,5 @@ import numpy as np +import pandas as pd from copy import deepcopy from textwrap import dedent @@ -41,6 +42,9 @@ def test_properties(self): self.dv.name = 'bar' with self.assertRaises(AttributeError): self.dv.dataset = self.ds + self.assertIsInstance(self.ds['x'].as_index, pd.Index) + with self.assertRaisesRegexp(ValueError, 'must be 1-dimensional'): + self.ds['foo'].as_index def test_equals_and_identical(self): da2 = self.dv.copy() diff --git a/xray/data_array.py b/xray/data_array.py index cd8cbc36701..ff083f65c08 100644 --- a/xray/data_array.py +++ b/xray/data_array.py @@ -157,8 +157,9 @@ def _in_memory(self): @property def as_index(self): - """The variable's data as a pandas.Index""" - return self.variable.as_index + """The variable's data as a pandas.Index. Only possible for 1D arrays. + """ + return self.variable.to_coord().as_index @property def dimensions(self): From 867319ef43f904adc6a1972757ad41acd9ad10e0 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 2 May 2014 18:16:02 -0700 Subject: [PATCH 2/3] Documentation edits and setup.py cleanup --- README.md | 2 +- doc/index.rst | 19 ++++++++++++--- doc/tutorial.rst | 62 ++++++++++++++++++++++++++++++++---------------- setup.py | 39 ++++++++++++++++++++---------- 4 files changed, 85 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 80bc2a995fa..63d84bfc10f 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ makes many powerful array operations possible: dimensions (known in numpy as "broadcasting") based on dimension names, regardless of their original order. - Flexible split-apply-combine operations with groupby: - `x.groupby('time.dayofyear').apply(lambda y: y - y.mean())`. + `x.groupby('time.dayofyear').mean()`. - Database like aligment based on coordinate labels that smoothly handles missing values: `x, y = xray.align(x, y, join='outer')`. - Keep track of arbitrary metadata in the form of a Python dictionary: diff --git a/doc/index.rst b/doc/index.rst index e651b4682f4..f3fa377dea9 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -6,7 +6,8 @@ homogeneous, n-dimensional arrays. It implements flexible array operations and dataset manipulation for in-memory datasets within the `Common Data Model `__ -widely used for self-describing scientific data (e.g., the NetCDF file +widely used for self-describing scientific data (e.g., the +`NetCDF `__ file format). Why xray? @@ -23,7 +24,7 @@ makes many powerful array operations possible: dimensions (known in numpy as "broadcasting") based on dimension names, regardless of their original order. - Flexible split-apply-combine operations with groupby: - ``x.groupby('time.dayofyear').apply(lambda y: y - y.mean())``. + ``x.groupby('time.dayofyear').mean()``. - Database like aligment based on coordinate labels that smoothly handles missing values: ``x, y = xray.align(x, y, join='outer')``. - Keep track of arbitrary metadata in the form of a Python dictionary: @@ -42,7 +43,19 @@ a numpy ``ndarray`` or a pandas ``DataFrame`` or ``Series``, providing compatibility with the full `PyData ecosystem `__. For a longer introduction to **xray** and its design goals, see -`the project's GitHub page `__. +`the project's GitHub page `__. The GitHub +page is where to go to look at the code, report a bug or make your own +contribution. You can also get in touch via `Twitter +`__. + +.. note :: + + **xray** is still very new -- it is on its first release and is only a few + months old. Although we will make a best effort to maintain the current + API, it is likely that the API will change in future versions as xray + matures. Some changes are already anticipated, as called out in the + `Tutorial `_ and the project `README + `__. Contents -------- diff --git a/doc/tutorial.rst b/doc/tutorial.rst index 1b52e332dd4..d8339cef927 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -7,9 +7,24 @@ Tutorial import numpy as np np.random.seed(123456) +To get started, we will import numpy, pandas and xray: + +.. ipython:: python + + import numpy as np + import pandas as pd + import xray + ``Dataset`` objects ------------------- +:py:class:`xray.Dataset` is xray's primary data structure. It is a dict-like +container of labeled arrays (:py:class:`xray.DataArray` objects) with aligned +dimensions. It is designed as an in-memory representation of the data model +from the `NetCDF`__ file format. + +__ http://www.unidata.ucar.edu/software/netcdf/ + Creating a ``Dataset`` ~~~~~~~~~~~~~~~~~~~~~~ @@ -22,10 +37,6 @@ values in the form ``(dimensions, data[, attributes])``. .. ipython:: python - import numpy as np - import pandas as pd - import xray - foo_values = np.random.RandomState(0).rand(3, 4) times = pd.date_range('2000-01-01', periods=3) @@ -34,7 +45,7 @@ values in the form ``(dimensions, data[, attributes])``. ds You can also insert :py:class:`xray.Variable` or :py:class:`xray.DataArray` -objects directly into a Dataset, or create an dataset from a +objects directly into a ``Dataset``, or create an dataset from a :py:class:`pandas.DataFrame` with :py:meth:`Dataset.from_dataframe ` or from a NetCDF file on disk with :py:func:`~xray.open_dataset`. See @@ -44,8 +55,7 @@ NetCDF file on disk with :py:func:`~xray.open_dataset`. See ~~~~~~~~~~~~~~~~~~~~ :py:class:`~xray.Dataset` implements the Python dictionary interface, with -values given by :py:class:`xray.DataArray` objects. The valid keys include -each listed "coordinate" and "noncoordinate": +values given by :py:class:`xray.DataArray` objects: .. ipython:: python @@ -55,7 +65,19 @@ each listed "coordinate" and "noncoordinate": ds['time'] -We didn't explicitly include a variable for the "space" dimension, so it +The valid keys include each listed "coordinate" and "noncoordinate". +Coordinates are arrays that labels values along a particular dimension, which +they index by keeping track of a :py:class:`pandas.Index` object. They +are created automatically from dataset arrays whose name is equal to the one +item in their list of dimensions. + +Noncoordinates include all arrays in a ``Dataset`` other than its coordinates. +These arrays can exist along multiple dimensions. The numbers in the columns in +the ``Dataset`` representation indicate the order in which dimensions appear +for each array (on a ``Dataset``, the dimensions are always listed in +alphabetical order). + +We didn't explicitly include a coordinate for the "space" dimension, so it was filled with an array of ascending integers of the proper length: .. ipython:: python @@ -64,9 +86,9 @@ was filled with an array of ascending integers of the proper length: ds['foo'] -The numbers in the columns in the ``Dataset`` representation indicate the order -of the dimension for each array (on a ``Dataset``, the dimensions are always -listed in alphabetical order). +Noncoordinates and coordinates are listed explicitly by the +:py:attr:`~xray.Dataset.noncoordinates` and +:py:attr:`~xray.Dataset.coordinates` attributes. There are also a few derived variables based on datetime coordinates that you can access from a dataset (e.g., "year", "month" and "day"), even if you didn't @@ -77,7 +99,7 @@ explicitly add them. These are known as ds['time.dayofyear'] -Finally, Datasets also store arbitrary metadata in the form of `attributes`: +Finally, datasets also store arbitrary metadata in the form of `attributes`: .. ipython:: python @@ -225,7 +247,7 @@ including the name of only the DataArray itself: foo2 `foo2` is generally an equivalent labeled array to `foo`, but we dropped the -non-relevant dataset variables: +dataset variables that are no longer relevant: .. ipython:: python @@ -309,7 +331,7 @@ which wouldn't work with numpy arrays: This is a much simpler model than numpy's `advanced indexing`__, and is basically the only model that works for labeled arrays. If you would -like to do this sort of indexing, so you always index ``.values`` instead: +like to do advanced indexing, so you always index ``.values`` instead: __ http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html @@ -794,7 +816,7 @@ section below. Although xray provides reasonable support for incremental reads of files on disk, it does not yet support incremental writes, which is important for - dealing with datasets that do not fit into memory. This is a major + dealing with datasets that do not fit into memory. This is a significant shortcoming which is on the roadmap for fixing in the next major version, which will include the ability to create ``Dataset`` objects directly linked to a NetCDF file on disk. @@ -901,10 +923,10 @@ Now, let's access and plot a small subset: In [6]: tmax_ss = tmax[0] -For this dataset, we still to manually fill in some of the values with `NaN` -to indicate that they are missing. As soon as we access ``tmax_ss.values``, the -values are loaded over the network and cached on the DataArray so they can -be manipulated: +For this dataset, we still need to manually fill in some of the values with +`NaN` to indicate that they are missing. As soon as we access +``tmax_ss.values``, the values are loaded over the network and cached on the +DataArray so they can be manipulated: .. ipython:: :verbatim: @@ -930,5 +952,3 @@ Finally, we can plot the values with matplotlib: In [13]: plt.colorbar() .. image:: _static/opendap-prism-tmax.png - - diff --git a/setup.py b/setup.py index 956ce3c1361..e67ab189f2b 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,23 @@ QUALIFIER = '' -FULL_DESCRIPTION = """ +DISTNAME = 'xray' +LICENSE = 'Apache' +AUTHOR = 'Stephan Hoyer, Alex Kleeman, Eugene Brevdo' +AUTHOR_EMAIL = 'shoyer@climate.com' +URL = 'https://github.com/akleeman/xray' +CLASSIFIERS = [ + 'Development Status :: 3 - Alpha', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Intended Audience :: Science/Research', + 'Programming Language :: Python :: 2.7', + 'Topic :: Scientific/Engineering', +] + + +DESCRIPTION = "Extended arrays for working with scientific datasets in Python" +LONG_DESCRIPTION = """ **xray** is a Python package for working with aligned sets of homogeneous, n-dimensional arrays. It implements flexible array operations and dataset manipulation for in-memory datasets within the @@ -39,7 +55,7 @@ dimensions (known in numpy as "broadcasting") based on dimension names, regardless of their original order. - Flexible split-apply-combine operations with groupby: - ``x.groupby('time.dayofyear').apply(lambda y: y - y.mean())``. + ``x.groupby('time.dayofyear').mean()``. - Database like aligment based on coordinate labels that smoothly handles missing values: ``x, y = xray.align(x, y, join='outer')``. - Keep track of arbitrary metadata in the form of a Python dictionary: @@ -57,12 +73,11 @@ a numpy ``ndarray`` or a pandas ``DataFrame`` or ``Series``, providing compatibility with the full `PyData ecosystem `__. -For a longer introduction to **xray**, see the project's README on GitHub_. - -.. _GitHub: https://github.com/akleeman/xray +For more about **xray**, see the project's `GitHub page +`__ and `documentation +`__ """ - # code to extract and write the version copied from pandas, which is available # under the BSD license: FULLVERSION = VERSION @@ -130,14 +145,14 @@ def write_version_py(filename=None): write_version_py() -setup(name='xray', +setup(name=DISTNAME, version=FULLVERSION, - description='Extended arrays for working with scientific datasets in Python', - full_description=FULL_DESCRIPTION, - author='Stephan Hoyer, Alex Kleeman, Eugene Brevdo', - author_email='TODO', + description=DESCRIPTION, + long_description=LONG_DESCRIPTION, + author=AUTHOR, + author_email=AUTHOR_EMAIL, install_requires=['numpy >= 1.8', 'pandas >= 0.13.1'], tests_require=['mock >= 1.0.1', 'nose >= 1.0'], - url='https://github.com/akleeman/xray', + url=URL, test_suite='nose.collector', packages=['xray', 'xray.backends']) From 9f15916fb4ffaed9cc7aec656ad168b318bb8074 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Fri, 2 May 2014 18:22:03 -0700 Subject: [PATCH 3/3] Fix classifiers and license in setup.py --- setup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index e67ab189f2b..d315eeb5eec 100644 --- a/setup.py +++ b/setup.py @@ -147,10 +147,12 @@ def write_version_py(filename=None): setup(name=DISTNAME, version=FULLVERSION, - description=DESCRIPTION, - long_description=LONG_DESCRIPTION, + license=LICENSE, author=AUTHOR, author_email=AUTHOR_EMAIL, + classifiers=CLASSIFIERS, + description=DESCRIPTION, + long_description=LONG_DESCRIPTION, install_requires=['numpy >= 1.8', 'pandas >= 0.13.1'], tests_require=['mock >= 1.0.1', 'nose >= 1.0'], url=URL,