From 8477c02aae19b97428c6a175a11487a77c0da77c Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Tue, 5 Mar 2019 15:23:29 +0330 Subject: [PATCH] fix: use correct order for prediction --- checkpoints/b.hdf5 | Bin 16464 -> 24144 bytes draw.py | 2 +- nn.py | 24 ++++++++++++++++-------- predict.py | 9 +++++---- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/checkpoints/b.hdf5 b/checkpoints/b.hdf5 index ef053039992d7ac1d5ae770a2be2fe4b1df633e5..0c24afd6f79c807b20b5751c6a194d8f56dcb735 100644 GIT binary patch delta 8750 zcmY*ec|28L_jZw)6h#uZOi2kTD);Q8IT}QzL4yV=B9W-Lri7xnB~g(gQZl5(y?d?O zKuH=DQbHP)Qb`i|`BvZeeShbVv(8%k+55BiKIiObeV%ncgmYiWIb_UPoj>Nal%%$- zV6gNoPLm*ioRJ_zS}s3NPLeZP5HF)?wB37~_YOaa4I90DH%dtSv1`o#S_=tIf9#)2 zU_NQIfGZ`JAUl||OrRz^&Q$tOgT%jf!=I7<4)oisG5=#M`unezjp2j{e#koiGZ{y@ zwK9L;f<^_+e;<1lGz9PDCK_&c_1idV3fIikd@OgAm-lAhjca^2xo-O>=C#Aqvp?v& zapML7DA))d%4rDH6}1Zu%;8AHAJi(G zqTI(3gvh9J;z32zO;nu-!-Y~{CW5nVg1)%#{Co5{ENG9_WyBR ze|^mff8yM~xI^~;A6NX>ubclTF87c5XCvzb%e8gmucQeMjnJAr=XZ!Bp)8>;p((L* z<7W3wervp3w{G`=-3T*0|< zrjlj`h4tfxN=gQB1+BwZ|MMml{<|na`iL$`G!h)w;Y#w?38+qtLei)|qZR85R!AF4 z1{fCZ((UhFr!Pnt>7}*pZ|lGN^Ivp+z7D5?0QpeHg`6j!cbFH7k1+4zG?}7>k9j8dmEiiDtF*c>m#RI~hf6D$Qao4BNXbaTQZ-!? zJS3jx&UX;PF~HH_MRg7N{e8)-X~9#A1r~TvKDmTm{&Axh%_^`#EvX|5+L%``~W5HqiEN+m%Q6= zb%?|iu_!|31c6os68QEE!#8sr$rK1wXvAVm$Xw9KRITx0Vya&<9sC>gLa{N!W{;+! z-jYmC(;ShHnF$QGNf$j^@(fno%VIdkqhNH_4^g&jE{#l5f(It~%$&fB^k(Qadcq?? zRP}u*+`gX1lfBU)>ai!f^-E)@YhVx`*Mnf4@ zSYIZZ#yw1B8y(0~*)Q}`y)C1(Q6F2?3+UPc0Ye%j=+-8dC}$c#RCXcrykMryN&gp2 z^?XUpklTfoc_CD@>@d%cYei-~nM8vQJY+q-c+xwa<;>>`UQF+ZcINE(8Dxcl3DfzN z@6MZ$YYZzS+Nj>iYgDny4Hno}Fyc}*#@RE4R*s3}T^y{(v(y>N%R4!j37flT4 za@q<+t>rx4y@My9FK`Z1ucAnkgQDoBKo4eE%^cXR=t$jvZRefn_)O;wiW6SR51<-m zM|nG*jUWpG3z=FricyU}%9G&NpJZGrVtCFZ=quigkU#umUl3Hod`JePn{y4JHPJ;x|R+#^GEqj;$f|RU$PTMS; z$Sj{tHp5Eh;XH{O;IS%#td6aKceh;OXrT%FDz$_}n;r$ej@uKm(!7t!8Y97D^MSW&GAL2iAS1 zEmd)hTU-Wn*Ruq^KJ=wab!&v_dHKx4ne}wC?kiDT%MnO@wVtZEo0IPAUl^Yt8D>(3 zAD=G0lfkQznoJ|!){rIEi^!u+U)uC;IFT82ocVsQ|GV&6P3!6|Fb}d;F%k{=HufjJ zGp+}Qz@ATpp9dg96HI1h1=>WH- zfjs+RaXd*sKPK#oGAWlUC%udK(+St<3eWz`eO|l6BT?zy^wNPd%4yX6Y@Y467ebDW zKku-V9#hh+LVX;~m_hgSMWYjoN-{8sUQI5cTUH%ma^{Cq_k>KI;PE)-VskkC89ai- z2ZTb6OeK|aeKPg&j?u8hq-Sc-&e4#QqsDE0)lts4nple*FL8izIiavUo! z`s2{(+jzvu4&B2(A=g<^y!Z>DP!b6vtio`Z!E@|(J4WiWtMSpuEOZ_!A(nrYfNcr` z#NkuYut(-L?#;M26ED@@f!^m|F~{BoHx&%BEq5;>ySQDDl{3cnY4$ou^lnBUg}db0 z@@6zP`HTvkMYy&>TYSWHwm3*CR{ZvL59a63=}#oaZjofi2|kSdO`0m>k|hsK_|3KL zR)4tGdV=7~csGUrCIy0ZW|{KbKg24*6)e)R)0^_w`#1CW?GFA+?Elc~Z$92HKk*MP z!0I<0TTkw%V+~1;RX-bh5BuBpFBvcU5B9%gtjMwZUoPfa{^sKJO-48?*-NPR>9BA? zk_Fpf=}ba)XrlbZ19*XVliph(N7{DYXRI%BAoh(t87&SWw~3E2nk3v0=6yfHB4Pia!Dg1nV6;d@8leA1-!s;3l!}YObbZr`KaPg<+ zdo7tMqr_xNWs^wts5=S&>`uln<4-1KDmNIF<0atYDnV|zg|jNo>TFZBB>0UO%5q&2 zNv6{?Vkol#oo!8UQ`=d_;dLw7!_i_o>%*uce;rw6I0|!5r4lFJ9imj42E4(^r0k$P;SK3fu$9l7@I0P04%3G5E&dSIZNYj!Qh+`D-No>7$$DZM8N~Dq83bwz zr?V+D7C|e21I%J#AZus~?NL?bz27&6%)PP+uIxP4pE?b|Y5wEs^0E;yv)u?U=TgS2 zNR`#79ECimsqphdH0)V7g9Joq!NpNwOgFvH>%8p^CR>+7S@A9yq^JU6QwJjVX$aw~ zTuFq5M1d?mY6b2kcBsd`hTSDGpni81NjSHe)ZKYP)mHHtR=FHx7G;r5ANJCU#ZK_@ z)GSiQJw|M*SyuRDK zI*gbf9Z87HQJi5z`Q+{F6U-3h2ncaZ6>82?M)rL!GwHMjEbWve0mB!1T39i%cNPI zVw5f@GJCT(GqruPSYe`yrqd13Ono`Ai_u{`CcdOv$Az@ne-^3tI6_?BUWU*-ghQGp z;N-gsEUPrxVe9pS!BX!1c4{9!RnBLR%hQw1_2&KTbtdVu~2BbcI9 zLR^1E(ZNc7BxBncxbNFZFS^Vk9)mrJdD%Q__}+$*8LmydlXuW*E>CSNG@pXP+HS_y z_Lt3!)6Yp?Xb0TtZQ?2IbrqVWl(TQb>PgNZA^By`gULVmHKGIGjM;)i$P~J_Fu`rt zsI$5byqUshryp3(@Is_m>n%kvIMs!6C9jsQA7D#ni@X_^azk`^y9MqIR3k0=v5cf*tf$PMvH2zir^I3Ns_!leN#OYc?^Uo1PF?$dJweh&VUW!fT ziJh48d#5u{Z};3XR_dDd_rrms^Y^CquiLw=q_AFd`;o-rfA z=cmBk_lhW-t3w7n-A*32&&O-EtEgU429aHIn3q2H4AXWs9n7OTd8cQX(sysFp>1n4 zJ;YX!40T&5Ql5{;4tPP)r(B*?eGX&VuonU|&+v(tK|5TiIt^JaOPK3#UefH6OAy?* zklu|P!mN~74eN<2Ogh&B(;nYv=FKgoKaW_!q*eVY;g-rII43!dhPUuv!h?!2 ztk~)p$*`0H`^M*F_e6Daeqb0`o}|cXgpOu=!n0tpnW4x*a|UZ6yhPqinoqvlE+LXy z{>6Pg)Hr5uBNX*_|^)K_#y6>&_(V@@o+_xX{RWRgXa1xZyZqWjJ)Y zd5RV-ZvoNTqs)-!_B7?$AdK23i@}Tg;GM}RNVhd1j1Px(*}9z7h|VJ+K`wOjW|8jOjl+0yR;KKZ}u0_GwmDD zt2dX?$rI6J*#Y>aK8Y5l>BG`|SxW=jj3Dc3lkg743)n1FDJDf;#G7egalH4kW>2SHTzK8zjGP4EUxWAYBEw ziBjq#U}PVIPGb~_(oJXTj7q1TN?nY?&p9ysQ8Fw{Jqv|3`yuBT7oB^g+2rq+$z91E zjN)VhdGaE%Lbyk^2?ITJR0dmc~Sm^=S8#CklXcOS<=nrA)J zwecEAy}U)1{3_rTbF+!!XD;jcE)2eR+S&Y?x1W~0s;2z+wR3QS|0p6<7Lvl9!4N)j z1@7EB68cX<*s>%Ab{52tIiV&bCAN(?I4*}aj|y_GMUw5~-6DD4<6y4Po!)w%2xiZ< z(LLFev6 zH>7Lr1e!api5aqMJvosngx$?|=?&v&$nBFeN zPN|KNKmL-zAukzD5TOz-Uc_E+45$T~vxDqMutCo0(08+qR5c951-VnvIpicc-t(Fo zKk~u7#z3AKHA6%&e;yd7ZAJZ+t?=^FdbC|L4F;9322rpWX3yR%BKM-mN0mIxa%dqP zwtP^EC}W~O&xiG8yJ7ZMN#Z`&uKxhL$i_U;M0YnuK2C5=r-%0xC@@rlJ?SBuE z84^1B0Ce|_;Ir1fN)T>cMD02Qut7#h{B|0W)3UC-RX<#@{*?r9QA4 z*4>#0FDngc@OW=(xp^>JEp%bF4~<|>eSHgCTctoE){!jm4Pnao75BiD&1GimXwv{c z0YvF;Ah&;96b=RjGQfN^dvQ?;yt9^v^|R{f8j~7WCZ&jK@AdFzk11GPD<;vu7<|~~ z0g5_8az)*l=TSO_uJcW#wrB;5y#QVhNGEH?N5hF_BZ%$h1QN6^5_YT}Mms<5gNeDD z2*0$eo@$h|(9XVdM04y>;OU33FMVXN?feGf^EnnC9Z@AlF1qZ~73;D3bq-O!YQYv* z)Dy3%DWt~aH8f|5iGgVZd7$3{MXg<;_HV^dw%rPZ-mWkqrGl1SXrb~k4@oF1h6@~d zqPs4f%rY>AH8R%V>Gz6HALR8gi?%-?1#OFnzf>qWndAW#&oUun@d=_P<%aeS0@2Xs zfq1PW7-SAUhjF(qkYwRxlqtPTdVl$os}CGV(O^{wa4v_`AazolyaoB?hQO;dAzS0? zh+lLP)@sFrq@WLWu0F-YFY_m5J;l7A=h6TT__mDO=>`%anIh~PASPPE8nU)-E{o1r z$=c7!pgZF|TrsGFDLzHeSbdlZv$v43)xnH#_m?JzKD_k(KP*HkyQmbo+VER@Q!M&L4o88brT4Iff7<>PIW+%+{a57pHBphX z>VHL!rUk!6j-f}Jab{i%-Z}mfXMAtKsNQ>cs8oasR!t~OtU|?yjd)kR8I5FwxZScG zH+^iv-0oJaOlgHlTrm{&Wq_}!4oZKOf%w)r2$Z@F5);Z`X><$}axcSu=~M99AON(C zHo%Wk5?-n;lTJu=%V%o&sEmo`Fju0>1#EPep!u4Tk3GN!2>+|`YuN7F30)WO*moo zJ8MYiHYKD@?8g?D&p ze>>WLa%OkbY+^fBu4N5Ac#*qR&zWI)tC%$9#jMCbn?#0LvL!Lo*xtL_NkpSQnLg=0 zK}lmaFhEOu{DHQ3|5atNf#fBW*!Bzao9>}*tFhSP*K=$kisGj&y5g%LEm-Qw5qmo8 zi67qVM$5`j|GSqaJ)Ju4dLHCMr zY~N%2SrLI3I4Kx0F9?%A*yHjk`h0Y1ZHLdk3~J&z;q&iDZ3ZT-lsG9_+{F1a`t{zBlV)HifMUTgE>8lE`+i ziDR+cpEXmsfQI9uQPn3NJ>JBkpRX>OOX%R!QAxN=IvRAYrGmUoBwiag1mmsJAVvQ@ zIN8*}o`D)-b=Mb|dGR6Ucog9_dBiW4DT3#sW)QrQI9>Uwd}&t*8|Y9Tm`2rcEd+Gak$iZ z2fl8!W}h@zvwEXuurhHnY8+un>cPhGJ%7EZ*;m!g>8E-NKfTAq&N;;)#Fh4M;b~m zyo}54hhy-sy_ixPfrr^G*w@U*&@4ZEwR@yoW)dWR&({ z5_UNcZ4%8_{tFicVaCUy{E>O;#!Jy`z}s8ihl*V-R?i?SnPm zA<)5ZlcSf~j^M}bX&7gki3M*G@XW|`++rlaUfq+p(2=Endpvob2!MicSipGS@@&lD4r_!!s?P#%zAtb z2k+(L`Z>~Ko%1r{b>Ly$+PWcMZ=!t--lE zt(d!~3Gd$=iCzzNaY5`r9Q;Tdr!5|gq(>h0q(ER4TrEbi(!%OM2I>i0Kb+Kz!&nM_w^3A zU8?|&3o22iwi{KYBDoC!RUgfy(vi4O0H)5kJFf0ksn;_&mbyc|-1Mf6#8AYL#+_%mD9Cx{g zlk|;L{}xh5to~jI{?TRs=qJ{xk}uqm$rHIQgI-~b3D;t1AZ*p-c-sT=`hR;P4Y`1^ zQ-t3cm+Z3B5(*5twArEB|HS?+=l8F-L^4H1kP52bdf^xcMZvUGiJrp0Eg9%ZB+3FY z=U0i}-OY#N3U_c+ge(oPErX87St#Y{CHSiMGc1U_i))n^kz09}uwtDK3^ZC`s4>MJ zS#$BBGJWXMa>wva6>0xsj+ce?!Z>>Y>Tc6z?t4AKzq41cFr$>IdODr>#x;>^6MSHI zUmJQ}cM&O`oQdZ;)Qi!N4-gh?3@1rDhegT5)~M-e5_7px4x5_ZK}N<2WY?T({%2Lf4R7(~_k|dvHhb{~{>VmO)ZUs${5;HQUS279cz2;y z_N~OFY#e2L6ZjM(4cJ)TjfdWC!Y&+zrRG_9G(8*slVw4<@(glz)_X|3WsCY7jo8+q z6Ue4I6U;kQ(5ucpe#E0azWkGFfVRCzP9OxlJQJz7Cd$Jc>k zWnP7IYaRLzDJT25EbKEb-6^bd64{$#gqtK?jK1qL_S8pR$Y*{f<>Q{>?Pghgq2EDR z{PiF@C7FrDa>k9Q{cZX69F#$1Af1WnT?JFl7nT<&YS1vx4!%F~Ge5*@gC%8sR5L=3^6uNgnTmW ztBC7W;|)`X7=z|$bj>Cat(~Tfns*wA8Iva^d{c=XB%J1m{rbtMZJnnR`^*z<(P~4B zLXF|>K3m4|cp;9C7NV&8Jz#(KDxPk#m4qM{d}_~n*p<-kG--*1Q3wb@TV^$)74HwC z(&yd~Xh5NDTn!mDo5LnWOyqwt+KwyJzw)*cIW{~b3BA7?g`&;Ghe(sLIx^2t7PWn3 z_$*O}DD&fWYJ6~NT9RX6J$sG;lK4-F!ws)IoV$TF5%$rJ7I&%3JpY%j0T`r*+ z{t~{(UXujP-{aUPt%q*rm+;HZTk#^eBa+^h$nGZG^;%a^9p4+J+&U)x3y%)JB=WB|D#~OWIS%3zZ?p_ zlV$_m+K}(vtH`)~m<*^LVjV&cL+h9*SW_g6{o~Z&Lf|p*lt0TWR4KDx(r@5FA2WJh zV#z<+Ux>OZlxgK4OR9z^;p<}(Kum9_;<_>`)b6N*cKDbRsRB!Mc;FBUj#Yu}Z;H^p zfgCi4E+^X_&cRb%5-L))k4e-5o532! zQ>B-jQaXIoXpDl&4d2hc;4Ot(;oGg_%fbAkJVC=UA3Q<4jDsa zM;{3~@)=xlrqfRvhuQOKUJyOM3j~+KVXoW~`h477a`&RudfeYlHyTV zaZQ7!ZqubEUQb|m@EbVf{Jx@owF2$&o=+KbWBRGlhFSz4z)x%1_^rVj^ju{ST*xuU zs%vIri*v5HlV5|aRfchs?09UmOo%V86K}^etBUdUfLL6bo`^n{?!_18p2K5}6+n5w zg5GjArT@vFPHDY0%`h~lO;H#^JoTyeZ}t?z)#;)HRXR4h9;ED-Q_bY5^yoc1+M1R^ zwNG%g?-@sbN{XVEf?T?IMldyQK0<5T_t1ySw$tOqiF8#|AT;{O#Hr#@f*-PL;{~%Vs^dp{`m4Mgf*r21vwyfOO3an%k37#3-u-B;U{Gt`I%1IfFOn7~=ccb~q#8G15HehO-CDaB$NLEPc!o+a6AV zGrie3y(b?RFHXl^4n_EMh`Sj7&{ctt1?|TTC*pA6@MbKs$;De_igBo+8xFQUh#wxS z#M7c;NZpk*axBXfU)LTWr8TA4xy>GgpY5PrfZ@vkfq;;&t_Guc?+#D0S+HW>Jc3hJ>_Nmil zm2r55q9+c1(1NdYu0_A?b4F(uzak0m%kjd59coBCAjf}7WFlfrU~C3 zr{J~)e%Dll_y3xY>u#E}b-~Ga!#p2$>xJnoMDbXDAHnQTjW}wX4cl@rlbyWCp4Ge@ zi(fH8WSq}E5U-Zq3c0K=tZI7*KiKcj zFz7W75bezAq#=1PEL$9i?2aynyw(WDMn8clG?&8-lb(u|jqWhFSsE5+%*9{3^x^sN z6lC971;*UJTp=-3?n{{xxN4zB>!>a5Xq*+=u?0JQ$4} zLpAFzfxz)R)Vp`X&ipdCx9$!^H)Vkm(V#c`oMBUh0dM8HfF9R42N!p4BN{(6z~;;h zh&yA&3Qy^=W>0+B;MLu@$kB+Em2Jev-y5=C<%ij(+YNZub+I0+Bc;QNy3XKQYajN! z%?CW1`xL7!Xvdps-eI@veOSS87^?}h!6mF6yVZZhu4_ken8rI?b#DX?l?~&zHv(4d zR*7G#bwGs8RXF0*fhs1vMH=sfWK(4tUTo_{9fEpsh^Z}lIn;`0rjBKu(kbk?P>BP@ z?%r^7xhbu);qp!vyvz^RyU2+nu|-N!bAut<}JjZUGl3x*(n z>lMXL6&U+(!AXOnUB<{Ro1PF^-CMj z!i7A#RPYtTFLgtL#{;;1Z4|~h3hC#V5;$iH5SXe&lUMu!zbRHghVlaNzh4Gxb?s@_ zo+q&Gm;t?*^Z|yX8(`aAbzDg;@T%TYoHEf^OqWP+L=BURpnqH;Hm#n|_LB4p+MfdqRpSTmhzxXi;0tgEGI;lm$rpv_Wt zNaZceG08xZcp1FmeLegnQilzf4?w|}Y*g#93+ee?M*H_K0kwtW@v9liu_RgE93+JX bP*E@w@+ATe2W}9?SaRnB|6;GFP3->w7fCux diff --git a/draw.py b/draw.py index 0fe46a6..20a4d79 100644 --- a/draw.py +++ b/draw.py @@ -39,7 +39,7 @@ def draw(df, path=None): } for n in biome_numbers: - biomes[n] = MultiPoint(biomes[n]).buffer(1) + biomes[n] = MultiPoint(biomes[n]).buffer(0.5) # print(biomes[n]) # legend = biome_names[n] if not hasattr(biomes[n], '__iter__'): diff --git a/nn.py b/nn.py index c10bab7..4f9f287 100644 --- a/nn.py +++ b/nn.py @@ -55,18 +55,22 @@ class Model(): params = { 'kernel_initializer': 'lecun_uniform', 'bias_initializer': 'zeros', + # 'kernel_regularizer': keras.regularizers.l2(l=0.01) } - # dropout = keras.layersDropout(0.2, input_shape=[self.features]) - self.model = keras.Sequential([ - keras.layers.Dense(layers[0], activation=tf.nn.elu, input_shape=[self.features], **params) + dropout = [keras.layers.Dropout(0.1, input_shape=[self.features])] + self.model = keras.Sequential(dropout + [ + keras.layers.Dense(layers[0], activation=tf.nn.elu, **params) ] + [ keras.layers.Dense(n, activation=tf.nn.elu, **params) for n in layers[1:] ] + [ keras.layers.Dense(self.output_size, activation=out_activation, **params) ]) - def compile(self, loss='mse', metrics=['accuracy'], optimizer=tf.train.AdamOptimizer): - self.model.load_weights(self.path) + def compile(self, loss='mse', metrics=['accuracy'], optimizer=tf.train.AdamOptimizer, load_weights=True): + if load_weights: + self.model.load_weights(self.path) + print('loaded weights') + optimizer = optimizer(self.learning_rate) self.model.compile(loss=loss, @@ -81,12 +85,16 @@ class Model(): verbose=1 ) + def evaluate_print(self): + loss, accuracy = self.evaluate() + print('Test evaluation: loss: {}, accuracy: {}'.format(loss, accuracy)) + def train(self): self.model.summary() checkpoint = keras.callbacks.ModelCheckpoint(self.path, monitor='acc', verbose=1, mode='max') tensorboard = keras.callbacks.TensorBoard(log_dir='./logs', update_freq='epoch') - # map_callback = keras.callbacks.LambdaCallback(on_epoch_end=self.map_callback) + map_callback = keras.callbacks.LambdaCallback(on_epoch_end=self.evaluate_print) self.model.fit( self.training, @@ -101,11 +109,11 @@ class Model(): return np.argmax(self.model.predict(a), axis=1) A = Model('a', epochs=2) -B = Model('b', learning_rate=0.001, epochs=450) +B = Model('b', learning_rate=0.001, epochs=20) def compile_b(): B.prepare_dataset(df, dataframe_to_dataset_biomes) - B.create_model([32], tf.nn.softmax) + B.create_model([32, 32], tf.nn.softmax) B.compile(loss='sparse_categorical_crossentropy') def compile_a(): diff --git a/predict.py b/predict.py index a2f2960..c620878 100644 --- a/predict.py +++ b/predict.py @@ -17,7 +17,7 @@ compile_b() for change in range(0, 1): print('TEMPERATURE MODIFICATION OF {}'.format(change)) - inputs = ['latitude', 'longitude', 'elevation', 'distance_to_water'] + inputs = ['elevation', 'distance_to_water', 'latitude'] for season in SEASONS: inputs += [ @@ -25,8 +25,10 @@ for change in range(0, 1): 'precip_{}_{}'.format(season, year) ] + print(inputs) + # print(inputs) - frame = df[inputs] + frame = df[inputs + ['longitude']] # print(frame.head()) for season in SEASONS: @@ -38,7 +40,7 @@ for change in range(0, 1): for i, chunk in enumerate(chunker(frame, B.batch_size)): if chunk.shape[0] < B.batch_size: continue - input_data = normalize_ndarray(chunk.loc[:, chunk.columns != 'longitude'].values) + input_data = normalize_ndarray(chunk.loc[:, inputs].values) out = B.predict(input_data) f = pd.DataFrame({ @@ -48,5 +50,4 @@ for change in range(0, 1): }, columns=columns) new_data = new_data.append(f) - print(new_data) draw(new_data)